读Android群英传第五章
来源:互联网 发布:虚拟机运行mac os x慢 编辑:程序博客网 时间:2024/04/30 09:19
Android Scroll 分析
5.1.1 Android的坐标系 如何获取Android坐标系点的位置?
通过系统提供的getLocationOnScreen(int location[]);5.1.2 getX()、getY()、getRawX()、getRawY()
getRawX()、getRawY()主要是获取在android坐标系的坐标 getX()、getY()主要是获取在视图坐标系的坐标5.1.3 触控事件–MotionEvent
(1) MotionEvent 中封装的一些常用的时间常量
// 单点触摸按下动作public static final int ACTION_DOWN = 0;// 单点触摸离开动作public static final int ACTION_UP = 1;// 触摸点移动动作public static final int ACTION_MOVE = 2;// 触摸动作取消public static final int ACTION_CANCEL = 3;// 触摸动作超出边界public static final int ACTION_OUTSIDE = 4;// 多点触摸按下动作public static final int ACTION_POINTER_DOWN = 5;// 多点离开动作public static final int ACTION_POINTER_UP = 6;
(2) 一般情况下在onTouchEvent(MotionEvent e)的固定模板
public boolean onTouchEvent(MotionEvent e){ int x = (int)e.getX(); int y = (int)e.getY(); switch(e.getAction()){ case MotionEvent.ACTION_DOWN: break; case MotionEvent.ACTION_MOVE: break; case MotionEvent.ACTION_UP: break; default: break; } return true;}
(3) View 提供的 getTop()、getBottom、getLeft()、getRight()
这些方法表示的含义:该View到父View的上下左右的距离
5.2 实现滑动的七种方法
第一种:通过调用layout方法
其中书中有俩个例子,刚开始没敲代码时看的不是很明白后来发现使用getRawX()、getRawY()需要每次MOVE的时候进行初始化而在使用 getX()、getY()确不需要是因为getX()和getY()的坐标系也是在随着滑动在改变,然而getRawX()和getRawY()的坐标系是固定的。第二种:通过offsetLeftAndRight(offsetX)与offsetTopAndBottom(offsetY)
其中offsetX和offsetY分别是左右和上下的偏移量第三种:通过LayoutParams布局参数
其中我们需要主要的是如果该View的父View是哪个ViewGroup,那我们的LayoutParams就对应着父View的LayoutParams
比如我们的父View是LinearLayout那么我们的LayoutParams就是LinearLayout.LayoutParams。
获取LayoutParams对象:通过getLayoutParams()方法
示例:
LinearLayout.LayoutParams params = (LinearLayout.LayoutParams)getLayoutParams();
params.leftMargin = getLeft() + offsetX;
params.topMargin = getTop() +offsetY;
setLayoutParams(params);第四种:通过ScrollTo()和ScrollBy() 我们需要注意的是这个移动的参照物是画布,移动的是手机屏幕,即屏幕在画布上移动。所以在我们使用这俩个方法的时候发现手指移动,方块移动的方向是相反的。结局办法就是 设置成相反值。
第五种:通过Scroller
由于通过ScrollTo()和ScrollBy()这些方法使View移动是瞬间的,没有什么过渡效果,给人一种很突兀的感觉。
然而Scroller就可以实现平滑的移动。
使用示例:
重写computeScroll()
public void computeScroll(){ super.computeScroll(); // 判断Scroller是否执行完毕 if(mScroller.computeScrollOffset()){ ((View)getParent()).scrollTo(mScroller.getCurrX(),mScroller.getCurrY()); invalidate(); }}
在我们需要使用平滑移动的事件中使用Scrller类的startScroll()开启平滑移动过程。
public void startScroll(int StartX, int StartY, int dx, int dy, int duration);
public void startScroll(int StartX, int StartY, int dx, int dy);
case MotionEvent.ACTION_UP:
View viewGroup = (View)getParent();
mScroller.startScroll(viewGroup.getScrollX(),viewGroup.getScrollY(),-offsetX,-offsetY);
invalidate();
break;第六种:属性动画
第七种:通过ViewDragHelper
- 读Android群英传第五章
- Android群英传第五章Scroll分析读书笔记
- Scroll滑动分析-《Android群英传》第五章
- 《Android群英传》读书笔记(4)第五章:Android Scroll分析
- Android群英传笔记——第五章:Android Scroll分析
- Android群英传第五章笔记·Android Scroll分析
- Android群英传笔记——第五章:Android Scroll分析
- 第五章Android Scroll分析(Android群英传)
- Android群英传学习——第五章、Android Scroll分析
- 读Android群英传第四章
- Android群英传知识点回顾——第五章:Android Scroll分析
- Android群英传——第五章实现滑动的7种方法(一二三)
- Android群英传——第五章实现滑动的7种方法(五)Scroller
- 《Android群英传》第一章~第二章
- Android群英传 第二章-ADB
- Android群英传——第五章常用触控事件MotionEvent与获取View坐标长度的各种方法
- Android群英传——第五章实现滑动的7种方法(四)scrollTo和scrollBy
- Android群英传——第五章实现滑动的7种方式(六七)ViewDragHelper自定义侧滑菜单
- JSON使用MaxDepth反序列化设置最大深度
- H5 缓存机制浅析 移动端 Web 加载性能优化
- FFmpeg命令及基础
- IOS加载Gif图片的N种方式 By-H罗
- dispatch_barrier_async 隐藏的坑
- 读Android群英传第五章
- powershell 汉洛塔
- 曾经的自己 现在的我
- android轮询最佳实践service+AlarmManager+Thread
- IntelliJ IDEA 常用插件收集
- cocos2dx 中 ProgressTimer的使用
- 利用 SGA 共享池,避开 parse 阶段
- Map遍历的几种方法
- 如何使用ueditor