ViewDragHelper
DrawerLayout/SlidingPaneLayout
1.初始化ViewDragHelper
ViewDragHelper通常定義在一個ViewGroup內部,並通過其靜態工廠方法進行初始化
實例化:ViewDragHelper.creat(this,callback)
this:要監聽的View通常是一個ViewGroup(parentView)
2.攔截事件
重寫攔截方法 onInterceptTouchEvent(MotionEvent ev) / return mViewDragHelper.shouldInterceptTouchEvent(ev)
在onTouchEvent方法中,將觸摸事件也傳遞給ViewDragHelper
mViewDragHelper.processTouchEvent(event); return true;
3.處理computeScroll()
模板:
@Override public void computeScroll() { if (mViewDragHelper.continueSettling(true)){ ViewCompat.postInvalidateOnAnimation(this); } super.computeScroll();}
4.處理回調Callback
private ViewDragHelper.Callback callback=new ViewDragHelper.Callback()
tryCaptureView指定創建ViewDragHelper時ViewGroup中哪個子View可以被移動
具體的滑動方法—clampViewPositionVertical(垂直方向滑動)和clampViewPosition—Horizontal(水平方向滑動)
return 0爲不移動,垂直方向top 水平方向left right
onViewReleased() 手指離開屏幕後實現的操作
mViewDragHelper.smoothSlideViewTo—相當於startScroll方法
onFinishInflate方法遍歷獲取子View
Tips:ViewDragHelper.Callback源碼中(未用方法)
onViewCaptured 在觸摸到View回調
onViewDragStateChanged:在拖拽狀態改變時回調 return:1.IDLE 空閒 2.DRAGGING 拖動 3.SETTLING 按住不動
onViewPositionChanged:在位置改變是回調,常用滑動時更改scale進行縮放。
代碼:
import android.content.Context; import android.support.annotation.AttrRes; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v4.view.ViewCompat; import android.support.v4.widget.ViewDragHelper; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; import android.widget.FrameLayout; /** * Created by YRC on 2017/10/20. */ public class DragViewGroup extends FrameLayout { private View mMainView,mMenuView; private ViewDragHelper mViewDragHelper; public DragViewGroup(@NonNull Context context) { super(context); initView(); } public DragViewGroup(@NonNull Context context, @Nullable AttributeSet attrs) { super(context, attrs); initView(); } public DragViewGroup(@NonNull Context context, @Nullable AttributeSet attrs, @AttrRes int defStyleAttr) { super(context, attrs, defStyleAttr); initView(); } private void initView() { mViewDragHelper=ViewDragHelper.create(this,callback); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); int mwidth=mMenuView.getMeasuredWidth(); } @Override protected void onFinishInflate() { super.onFinishInflate(); mMenuView=getChildAt(0); mMainView=getChildAt(1); } /** * 檢查提供給父視圖的onInterceptTouchEvent的此事件是否應導致父級攔截觸摸事件流。 * @param ev * @return */ @Override public boolean onInterceptTouchEvent(MotionEvent ev) { return mViewDragHelper.shouldInterceptTouchEvent(ev); } @Override public boolean onTouchEvent(MotionEvent event) { mViewDragHelper.processTouchEvent(event); return true; } private ViewDragHelper.Callback callback=new ViewDragHelper.Callback() { @Override public boolean tryCaptureView(View child, int pointerId) { return mMainView==child; } @Override public int clampViewPositionVertical(View child, int top, int dy) { return 0; } @Override public int clampViewPositionHorizontal(View child, int left, int dx) { if (left<0){ return 0; }else { return left; } } @Override public void onViewReleased(View releasedChild, float xvel, float yvel) { super.onViewReleased(releasedChild, xvel, yvel); if (mMainView.getLeft()<500){ mViewDragHelper.smoothSlideViewTo(mMainView,0,0); ViewCompat.postInvalidateOnAnimation(DragViewGroup.this); }else { mViewDragHelper.smoothSlideViewTo(mMainView,300,0); ViewCompat.postInvalidateOnAnimation(DragViewGroup.this); } } }; @Override public void computeScroll() { if (mViewDragHelper.continueSettling(true)){ ViewCompat.postInvalidateOnAnimation(this); } super.computeScroll(); }
}
xml
<com.example.yrc.part5.DragViewGroup android:layout_width="match_parent" android:layout_height="match_parent"> <FrameLayout android:layout_width="match_parent" android:layout_height="match_parent" android:background="@android:color/holo_blue_light"> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Menu" /> </FrameLayout> <FrameLayout android:layout_width="match_parent" android:layout_height="match_parent" android:background="@android:color/holo_orange_dark"> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Main" /> </FrameLayout> </com.example.yrc.part5.DragViewGroup>