viewDragHelper仿qq侧滑的效果
学习资料 《android群英传》
老规矩先上图
1.gif
滑动的本质就是移动一个view,改变其当前所在的位置,它的原理与动画效果实现非常相似。都是通过不断的改变view的坐标来实现这一效果。
所以就必须监听用户触摸的事件,并传入坐标,动态的不断的改变坐标,从而实现view跟随用户的触摸滑动而滑动。
先学习viewDragHelper的基本用法
一,初始化ViewDragHelper
public DragView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initView();
}
private void initView() {
viewDragHelper=ViewDragHelper.create(this,callback);
}
二,重写拦截事件方法
触摸事件的方法
//拦截事件
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
return viewDragHelper.shouldInterceptTouchEvent(ev);
}
//触摸事件
@Override
public boolean onTouchEvent(MotionEvent event) {
viewDragHelper.processTouchEvent(event);
return true;
}
只要这三步,实现的是触摸滑动,如图:
三,处理computeScollege()
四,处理回调Callback();关键部分
public ViewDragHelper.Callback callback=
new ViewDragHelper.Callback() {
//tryCaptureView如何返回ture则表示可以捕获该view,你可以根据传入的第一个view参数决定哪些可以捕获
@Override
public boolean tryCaptureView(View child, int pointerId) {
return true;
}
//处理水平滑动,返回左边的坐标,可以进行计算,layout方法进行设置显示的位置
@Override
public int clampViewPositionHorizontal(View child, int left, int dx) {
return left;
}
//处理垂直滑动和处理水平的思想一样
@Override
public int clampViewPositionVertical(View child, int top, int dy) {
return top;
}
五,onViewRelease方法,拖动结束后进行调用
六,通过以上学习,实现一个qq侧滑功能如图
4.gif
侧滑其实和view滑动原理是一样的
我把自己理解的需要注意和重点分为以下几点;
一,侧滑其实就是两个view,他们的图层不同,在xml布局中需要把菜单和主界面区分好,如图:activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<com.example.a11059.myview.DragView xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:text="dsdsd"
android:gravity="center"
android:background="@color/colorPrimary"
android:layout_width="300dp"
android:layout_height="match_parent" />
<TextView
android:text="dsdsd"
android:layout_gravity="center"
android:background="@color/colorAccent"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</com.example.a11059.myview.DragView>
就这几行代码非常简单,两个TextView,一个作为主界面,一个作为菜单。
菜单在主界面的前面,所以这两个图层在手机上会,显示第二个TextView。
当它进行滑动时,(这里只允许进行水平滑动)底层的Textview就会显示出来。
//拖动结束后调用
// @Override
// public void onViewReleased(View releasedChild, float xvel, float yvel) {
// super.onViewReleased(releasedChild, xvel, yvel);
// if (mMainView.getLeft()<500){
// //关闭菜单
// //相当
// viewDragHelper.smoothSlideViewTo(mMainView,0,0);
// //这句相当于重绘
// ViewCompat.postInvalidateOnAnimation(DragView.this);
// }else {
// //把mMainView设置到固定的位置
// viewDragHelper.smoothSlideViewTo(mMainView,300,0);
// ViewCompat.postInvalidateOnAnimation(DragView.this);
// }
// }
二
拖动后的回调,这里需要把上层的TextView进行限制,不然Textview的位置就会随着手指拖动乱跑。这里限制当主界面的左侧小于500,关闭菜单,其实就是把主界面覆盖上去。
三
mMainView 和mMenuView通过onFinishInflate方法创建实例
//加载布局文件后调用
@Override
protected void onFinishInflate() {
super.onFinishInflate();
mMenuView=getChildAt(0);
mMainView=getChildAt(1);
}
如有错误或异议,欢迎指正留言。