android|android view滑动学习笔记
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);
}
【android|android view滑动学习笔记】二,重写拦截事件方法
触摸事件的方法
//拦截事件
@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
就这几行代码非常简单,两个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);
}
如有错误或异议,欢迎指正留言。
推荐阅读
- android第三方框架(五)ButterKnife
- Android中的AES加密-下
- 带有Hilt的Android上的依赖注入
- 列出所有自定义的function和view
- android|android studio中ndk的使用
- tableView|tableView 头视图下拉放大 重写
- Android事件传递源码分析
- RxJava|RxJava 在Android项目中的使用(一)
- 记录iOS生成分享图片的一些问题,根据UIView生成固定尺寸的分享图片
- Android7.0|Android7.0 第三方应用无法访问私有库