左右滑动自定义控件
来源:互联网 发布:提升排名软件搜狗优化 编辑:程序博客网 时间:2024/05/16 12:09
最近做了一个外包项目,用了滑动的按钮显示的界面,原本代码应该是从网上找的,源出处不详,后来我接手后顺手改了一下,把它做成了一个控件的形式。
随手放出来给大家一测吧。
这是MainActivity的代码:
public class MainActivity extends Activity {private AbsLeftBottomView mLeftView = null;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);initUI();}private void initUI() {View subView = LayoutInflater.from(this).inflate(R.layout.test_b, null);subView.findViewById(R.id.slide_menu_btn).setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubmLeftView.showLeftMenu();}});mLeftView = new AbsLeftBottomView(this, null) {@Overrideprotected View returnYouView(Context context, ICallBackShow callBackShow) {// TODO Auto-generated method stubView subView = LayoutInflater.from(context).inflate(R.layout.test_a, null);return subView;}};mLeftView.addUpperView(subView);setContentView(mLeftView.getView());}}
两个用到的布局文件:
test_a.xml:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="@dimen/activity_horizontal_margin" android:background="#FFFFFF" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/hello_world" android:textColor="#000000" /></RelativeLayout>
text_b.xml:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="@dimen/activity_horizontal_margin" android:background="#00FF00" > <Button android:id="@+id/slide_menu_btn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="左边栏按钮" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:text="测试" /> </RelativeLayout>
看看效果:
=====================================================================
以下为控件关键代码:
AbsLeftBottomView.java代码:
public abstract class AbsLeftBottomView {private static final String TAG = AbsLeftBottomView.class.getSimpleName();private Context mContext = null;private View mMainView = null; private MenuHorizontalScrollView mScrollView = null;private LinearLayout mAddLayout = null;private View mSubView = null;private ICallBackShow mICallBackShow = null;public AbsLeftBottomView(Context context, ICallBackShow callBackShow) {mContext = context; mICallBackShow = callBackShow;initUI();}/** * 初始化,mainView为主界面,switchView为切换View */public void addUpperView(View upperView) {View transparentView = new View(mContext);transparentView.setBackgroundColor(Color.TRANSPARENT);final View[] children = new View[] { transparentView, upperView };mScrollView.initViews(children, new IBottomViewListener() {@Overridepublic int onGetWidth() {// TODO Auto-generated method stubint width = mSubView.getWidth();return width;}@Overridepublic int onGetMeasuredWidth() {// TODO Auto-generated method stubint measuredWidth = mSubView.getMeasuredWidth();return measuredWidth;}});}public void showLeftMenu() {mScrollView.clickMenuBtn();}public View getView() {// TODO Auto-generated method stubreturn mMainView;}private void initUI() {mMainView = LayoutInflater.from(mContext).inflate(R.layout.just_use_for_widget_absleftbottomview, null);mScrollView = (MenuHorizontalScrollView) mMainView.findViewById(R.id.just_use_for_widget_absleftbottomview_ScrollView);mAddLayout = (LinearLayout) mMainView.findViewById(R.id.just_use_for_widget_absleftbottomview_Add_layout);mSubView = returnYouView(mContext, mICallBackShow);mAddLayout.addView(mSubView);}abstract protected View returnYouView(Context context, ICallBackShow callBackShow);}
这是 MenuHorizontalScrollView.java 代码,彻彻底底改的别人的代码:
public class MenuHorizontalScrollView extends HorizontalScrollView {private static final String TAG = MenuHorizontalScrollView.class.getSimpleName();public interface IBottomViewListener {int onGetMeasuredWidth();int onGetWidth();}/* 当前控件 */private MenuHorizontalScrollView me;/* 菜单状态 */private boolean menuOut;/* 扩展宽度 */private final int ENLARGE_WIDTH = 80 + 35;/* 菜单的宽度 */private int menuWidth;/* 当前滑动的位置 */private int current;private int scrollToViewPos;private IBottomViewListener mIBottomViewListener = null;public MenuHorizontalScrollView(Context context) {super(context);// TODO Auto-generated constructor stubinit();}public MenuHorizontalScrollView(Context context, AttributeSet attrs) { super(context, attrs);// TODO Auto-generated constructor stubinit();}public MenuHorizontalScrollView(Context context, AttributeSet attrs,int defStyle) {super(context, attrs, defStyle);// TODO Auto-generated constructor stubinit();}private void init() {this.setHorizontalFadingEdgeEnabled(false);this.setVerticalFadingEdgeEnabled(false);this.me = this;this.me.setVisibility(View.INVISIBLE);this.menuOut = false;}public void initViews(View[] children, IBottomViewListener listener) {mIBottomViewListener = listener;Print.d(TAG, "initViews() width = " + listener.onGetWidth() + " # MeasuredWidth() = " +listener.onGetMeasuredWidth());ViewGroup parent = (ViewGroup) getChildAt(0);for (int i = 0; i < children.length; i++) {children[i].setVisibility(View.INVISIBLE);Print.d(TAG, "parent = " + parent + " # children = " + children);parent.addView(children[i]);}OnGlobalLayoutListener onGlLayoutistener = new MenuOnGlobalLayoutListener(parent, children/*, sizeCallBack*/);getViewTreeObserver().addOnGlobalLayoutListener(onGlLayoutistener);}@Overridepublic boolean onInterceptTouchEvent(MotionEvent ev) {return false;}public void clickMenuBtn() {if (!this.menuOut) {this.menuWidth = 0;} else {this.menuWidth = mIBottomViewListener.onGetMeasuredWidth() - this.ENLARGE_WIDTH;}menuSlide();}/** * 滑动出菜单 */private void menuSlide() {if (this.menuWidth == 0) {this.menuOut = true;} else {this.menuOut = false;}me.scrollTo(this.menuWidth, 0);//if (this.menuOut == true)//this.menuBtn.setBackgroundResource(R.drawable.user_title);//else//this.menuBtn.setBackgroundResource(R.drawable.user_title);}@Overrideprotected void onScrollChanged(int l, int t, int oldl, int oldt) {// TODO Auto-generated method stubsuper.onScrollChanged(l, t, oldl, oldt);if (l < (mIBottomViewListener.onGetMeasuredWidth() - this.ENLARGE_WIDTH) / 2) {this.menuWidth = 0;} else {this.menuWidth = mIBottomViewListener.onGetWidth() - this.ENLARGE_WIDTH;}this.current = l;}@Overridepublic boolean onTouchEvent(MotionEvent ev) {// TODO Auto-generated method stubint x = (int) ev.getRawX();if ((this.current == 0 && x < this.scrollToViewPos)|| (this.current == this.scrollToViewPos * 2 && x > this.ENLARGE_WIDTH)) {return false;} else {if (ev.getAction() == MotionEvent.ACTION_UP) {menuSlide();return false;}}return super.onTouchEvent(ev);}/****************************************************//*- -*//*-Class Area -*//*- -*//****************************************************/public class MenuOnGlobalLayoutListener implements OnGlobalLayoutListener {private ViewGroup parent;private View[] children;public MenuOnGlobalLayoutListener(ViewGroup parent, View[] children ) {this.parent = parent;this.children = children;}@Overridepublic void onGlobalLayout() {// TODO Auto-generated method stubme.getViewTreeObserver().removeGlobalOnLayoutListener(this);this.parent.removeViewsInLayout(0, children.length);int width = me.getMeasuredWidth();int height = me.getMeasuredHeight();scrollToViewPos = 0;for (int i = 0; i < children.length; i++) {int[] dims = getViewDimens(i, width, height); children[i].setVisibility(View.VISIBLE);parent.addView(children[i], dims[0], dims[1]);if (i == 0) {scrollToViewPos += dims[0];}}new Handler().post(new Runnable() {@Overridepublic void run() {me.scrollBy(scrollToViewPos, 0);/* 视图不是中间视图 */me.setVisibility(View.VISIBLE);//menu.setVisibility(View.VISIBLE);}});}private int[] getViewDimens(int index, int width, int height) {int[] dimens = new int[2];dimens[0] = width;dimens[1] = height;/* 视图不是中间视图 */if (index != 1) {dimens[0] = width - ENLARGE_WIDTH;}return dimens;}}}
这是ICallBackShow.java代码:
public interface ICallBackShow {void onShowSubView(int pos);}
<?xml version="1.0" encoding="utf-8"?><FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <LinearLayout android:id="@+id/just_use_for_widget_absleftbottomview_Add_layout" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" ></LinearLayout> <com.zt.slide_widget.widget.MenuHorizontalScrollView android:id="@+id/just_use_for_widget_absleftbottomview_ScrollView" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="#00ffffff" android:fadingEdge="none" android:scrollbars="none" > <LinearLayout android:id="@+id/just_use_for_widget_absleftbottomview_Top" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="#00ffffff" android:orientation="horizontal" > </LinearLayout> </com.zt.slide_widget.widget.MenuHorizontalScrollView></FrameLayout>
==========================================================================
结束,有需要的自己拿去。不想copy的自己到这里下载: http://download.csdn.net/detail/sasoritattoo/7261919
1 0
- 左右滑动自定义控件
- (自定义View)左右滑动控件ScrollLayout
- 自定义控件:仿ViewPager实现左右滑动
- android自定义控件--条目可以左右滑动的listview
- Android自定义SwitchButton左右滑动开关按钮控件
- Android 左右滑动 控件
- 左右滑动日历控件
- Android 左右滑动控件
- 自定义左右滑动菜单
- 低仿探探左右滑动选择控件
- 一个可以左右自由滑动且有较好动画效果的自定义 Gallery 控件
- 自定义左右按钮选择控件
- 自定义控件--滑动删除
- 自定义控件--滑动按钮
- 自定义控件:滑动开关
- 滑动控件自定义使用
- 滑动控件自定义使用
- 自定义控件之滑动
- 简单模拟struts框架,了解strusts的框架实现机制
- PHP基础学习第三讲(循环讲解)
- 在 VS2010上配置Creative sensz3d SDK的开发环境
- POJ 1269 Intersecting Lines
- ping环回地址和ping主机以太网地址的区别
- 左右滑动自定义控件
- JBoss 配置JNDI
- 关系、逻辑运算及自增自减
- 第六周作业--利用哈夫曼编码英文字母表
- Maven最佳实践:管理依赖
- java静态代码块
- C读写配置文件
- OpenCV中的内存泄露问题
- NTSTATUS codes(驱动错误码对照表)