标签:
使用步骤(实现侧滑栏):
1、将ViewGroup中的点击事件都交给ViewDragHelper
@Override public boolean onInterceptTouchEvent(MotionEvent ev) { return mViewDragHelper.shouldInterceptTouchEvent(ev); } @Override public boolean onTouchEvent(MotionEvent event) { mViewDragHelper.processTouchEvent(event); return true; }
2、重写ViewDragHelper.Callback,事件的回调都在Callback处理
private ViewDragHelper.Callback mCallback = new ViewDragHelper.Callback() { @Override //当松手的时候回调该方法 public void onViewReleased(View releasedChild, float xvel, float yvel) { super.onViewReleased(releasedChild, xvel, yvel); //mLinearMain.getLeft()的效果竟然与mLinearMain.getScrollX()一样 if (mLinearMain.getLeft() < 100){ //弹性滑动到0,0点 mViewDragHelper.smoothSlideViewTo(mLinearMain,0,0); } else { //弹性滑动到300,0点 mViewDragHelper.smoothSlideViewTo(mLinearMain,300,0); } Log.d(TAG,mLinearMain.getX()+""); ViewCompat.postInvalidateOnAnimation(SliderFrameLayout.this); } //是否让所点击的View移动 @Override public boolean tryCaptureView(View child, int pointerId) { boolean isMove = false; if (child == mLinearMain) isMove = true; return isMove; } //横向移动 当然还有纵向移动的方法 @Override public int clampViewPositionHorizontal(View child, int left, int dx) { return left; } };
3、因为mViewDragHelper.smoothSlideViewTo(mLinearMain,0,0);方法内部是实现了Scroller.startScroll()
所以需要调用父View的computeScroll()方法
@Override public void computeScroll() { super.computeScroll(); if (mViewDragHelper.continueSettling(true)){ //ViewCompat用于版本兼容的 ViewCompat.postInvalidateOnAnimation(this); } }
4、创建ViewDragHelper
public void initView(){ mViewDragHelper = ViewDragHelper.create(this,mCallback); }
过程中产生的问题:
1、为什么子View的getLeft()能够与getScrollX()得到是一样的
2、RelativeLayout,无法实现子类超出其Width和Height。
3、如何创建左侧滑栏的布局。查到的原理:创建HorizonSliderLayout,然后在onLayout()方法中使用scrollTo()创造的时候让侧滑栏先滑到左边去
标签:
原文地址:http://www.cnblogs.com/rookiechen/p/5514642.html