【自定义View】1.View的滑动
来源:互联网 发布:古代西亚北非文明知乎 编辑:程序博客网 时间:2024/06/08 01:21
【难度★☆☆☆☆】自定义View是我们成为高级工程师的必经之路,尤其是创业公司,更需要自定义View,许多都以新奇的交互来制胜,比如探探的卡片滑动效果。如果说自定义View要从哪开始学起,那么滑动就是一个很好的选择。
现在我们实现这么一个效果,一个布局中有一个View,那个View会随着我们手指的拖动而滑动,这种效果该如何实现?
我们第一反应应该是自定义一个DragView类继承View,然后重写onTouchEvent()方法,然后根据我们手指滑动的轨迹来调整DragView的显示位置。没错,就是这个思路,下面我们来实现一下。
private float lastX; private float lastY; @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: lastX = event.getRawX(); lastY = event.getRawY(); break; case MotionEvent.ACTION_UP: break; case MotionEvent.ACTION_MOVE: float dx = event.getRawX() - lastX; float dy = event.getRawY() - lastY; //控制View移动的方法 move(dx, dy); lastX = event.getRawX(); lastY = event.getRawY(); break; } return true; }
注意这里getRawX()和getX()的区别,Raw是“未经处理”的意思,getRawX()获取的是触点相对于整个屏幕的坐标,以屏幕左上角为原点。而getX()是经过处理后的坐标,aa也就是触点相对于当前View的坐标,是以View的左上角为坐标原点。
很简短的一段逻辑,记录手指每次移动的相对距离,然后调用move方法来移动控件,最后 return true代表这个控件消费了事件,如果不理解的同学需要先看这篇文章Android事件分发机制,来理解onTouchEvent是如何被调用的,然后再往下看。
接下来就是move方法的实现,我们实现View滑动的思路有3种:第1种就是改变View的属性,类似于属性动画的原理,可以看看这篇文章:Android动画原理;第2种是改变View的布局参数来实现滑动;第3种是使用View的scrollBy方法来实现滑动,我们先来看第一种的实现。
private void move(float dx, float dy) { setTranslationX(getTranslationX()+dx); setTranslationY(getTranslationY()+dy); }
这里是依靠重新设置View的TranslationX属性值来实现滑动,我们看看效果。
效果还不错,我们试试另一种方法,就是改变布局来实现滑动
private void move(float dx, float dy) { setLeft((int) (getLeft()+dx)); setRight((int) (getRight()+dx)); setTop((int) (getTop()+dy)); setBottom((int) (getBottom()+dy)); }
效果和上图一样。最后我们看用scrollBy()来实现的滑动
private void move(float dx, float dy) { //这里要用负数,因为滑动的是布局的边框,正好和内容的滑动方向相反 int x = (int) -dx; int y = (int) -dy; this.scrollBy(x, y); }
结果居然没有滑动效果!后来才知道,原来这个是滑动View的内容,而不是View本身。所以我们在View上画个小点就能看出来他是怎么工作的了。
果然,只有小点在随着滑动,也就是View的内容。所以我们有内容滑动的时候可以用srcollBy或者srcollTo,如果View本身要滑动上面两种方法是很好的选择。
最后,View的滑动是很多炫酷效果的基石,我们自己一定要自己动手写一个,自己写一个胜过看10篇文章!
我的所有自定义view代码都在这 https://github.com/pop1234o/CustomViewApp,欢迎star。
- 【自定义View】1.View的滑动
- 初识自定义View-View的弹性滑动
- 自定义View基础(二)View的滑动
- 自定义View的总结(自定义滑动开关)
- 自定义View-滑动开关
- 自定义View滑动开关
- 自定义View---怎么解决View的滑动冲突
- Android 自定义View:实现View的滑动效果
- Android 自定义View:实现View的滑动效果
- 自定义View(三):View的触摸与滑动
- 自定义滑动操作的 Table View Cell
- 自定义view,跟随手指滑动的圆球
- 自定义View之垂直滑动的ViewPager
- 自定义View页面的滑动切换
- 自定义View的5中滑动方式
- 自定义view,实现上下滑动
- 自定义View之滑动操作
- 自定义view(滑动开关)
- Unity游戏开发——UnityUGUI打包图集
- java后台实现发送邮件的功能
- 解码为yuv
- HDU 4734 F(x) 数位DP
- 121. Best Time to Buy and Sell Stock
- 【自定义View】1.View的滑动
- LeetCode 135 : Candy
- CentOS 6.5 下 CDH 5.2.1 集群安装
- 关于使用file上传图片获取图片绝对路径
- HTML初学习
- H5~居中、盒模型、float(浮动)、position(定位)等问题
- BZOJ 4241 历史研究
- iOS 宏定义~RGB(颜色)
- MySQL数据表中的字段操作