初学ViewDragHelper

来源:互联网 发布:女明星淘宝店铺大全 编辑:程序博客网 时间:2024/05/22 06:49

使用ViewDragHelper来实现类似QQ侧滑效果,赞!!!

在自定义的ViewGroup里初始化ViewDragHelper
DragViewGroup.java

package com.example.day0118;import android.content.Context;import android.support.v4.view.ViewCompat;import android.support.v4.widget.ViewDragHelper;import android.util.AttributeSet;import android.util.Log;import android.view.MotionEvent;import android.view.View;import android.widget.FrameLayout;public class DragViewGroup extends FrameLayout{    private View mMenuView,mMainView;    private ViewDragHelper mViewDragHelper;    public DragViewGroup(Context context, AttributeSet attrs) {        super(context, attrs);        mViewDragHelper = ViewDragHelper.create(this, callback);//通过其静态工厂方法进行初始化    }    @Override    protected void onFinishInflate() {        super.onFinishInflate();        mMenuView = getChildAt(0);        mMainView = getChildAt(1);    }    @Override    public boolean onInterceptTouchEvent(MotionEvent ev) {        return mViewDragHelper.shouldInterceptTouchEvent(ev);    }    @Override    public boolean onTouchEvent(MotionEvent event) {        mViewDragHelper.processTouchEvent(event);//将触摸事件传递给ViewDragHeleper,此操作必不可少        return true;    }    @Override    public void computeScroll() {        if (mViewDragHelper.continueSettling(true)) {            //回弹的时候调用            ViewCompat.postInvalidateOnAnimation(DragViewGroup.this);        }    }    private ViewDragHelper.Callback callback = new ViewDragHelper.Callback() {        //何时开始检测触摸事件        //指定哪个childView可拖动        @Override        public boolean tryCaptureView(View arg0, int arg1) {            //如果当前触摸的child是mMainView 时开始检测            return mMainView == arg0 || mMenuView == arg0;            //return mMainView == arg0 || mMenuView == arg0;这样就2个View都可以拖拉        }        //处理垂直滑动        @Override        public int clampViewPositionVertical(View child, int top, int dy) {            //返回0则在该方向不滑动             return 0;        };        //处理水平滑动        @Override        public int clampViewPositionHorizontal(View child, int left, int dx) {            //手指拖动的时候调用这个方法            return left;        };        //拖动结束后调用        @Override        public void onViewReleased(View releasedChild, float xvel, float yvel) {            //手指抬起后缓缓移动到指定位置            //这里300指的是px            //若将mMainView改为releasedChild是一样的效果,releasedChild为拖拉的view            if (mMainView.getLeft() < 300) {                //关闭菜单                //相当于Scroller的startScroll方法                mViewDragHelper.smoothSlideViewTo(mMainView, 0, 0);                ViewCompat.postInvalidateOnAnimation(DragViewGroup.this);            } else {                //打开菜单                mViewDragHelper.smoothSlideViewTo(mMainView, 300, 0);                ViewCompat.postInvalidateOnAnimation(DragViewGroup.this);            }        };    };}

xml

<com.example.day0118.DragViewGroup    android:layout_width="match_parent"    android:layout_height="match_parent"    xmlns:android="http://schemas.android.com/apk/res/android">    <TextView         android:layout_width="300px"        android:layout_height="match_parent"        android:background="#333"        android:text="菜单"        android:textColor="#fff"/>    <TextView         android:layout_width="match_parent"        android:layout_height="match_parent"        android:background="#B22222"        android:text="主页"        android:textColor="#fff"/></com.example.day0118.DragViewGroup>

效果
这里写图片描述

0 0
原创粉丝点击