《Android开发艺术》读书笔记(View的事件体系)

来源:互联网 发布:sql 修改字段内容 编辑:程序博客网 时间:2024/05/16 19:26

《Android开发艺术》是今年上半年的读书计划之一, 本文是第三章”View的事件体系”的总结。

View基础知识

  1. View是Android所有控件的基类,ViewGroup即是一组View。
  2. View的参数位置, 由四个顶点的坐标确定: top, left, right, bottom.(坐标是相对于View的父容器);Android3.0以后增加了x, y(左上角的坐标) translationX, translationY(左上角相对于父容器的偏移量)。
  3. MotionEvent, 手指接触屏幕后所产生的一系列事件: Action_Down–> Action_Move –> …(move) –> Action_UP; 点击时的坐标getX/getY(相对于父容器), getRawX/getRawY(相对于手机屏幕)。
  4. TouchSlop, 系统识别最小的滑动距离(当距离小于该值, 不认为是进行滑动): ViewConfiguration.get(getContext()).getScaledTouchSlop().
  5. VelocityTracker 追踪手指在滑动过程中的速度。
    VelocityTracker velocityTracker = VelocityTracker.obtion();
    velocityTracker.addMovement(event);
    velocityTracker.computeCurrentVelocity(1000) //1000表示1000ms
    获取的值表示1000ms View移动的像素值。 当不需要使用时,需要调用clear方法进行回收内存:
    velocityTracker.clear();
    velocityTracker.recycle();
  6. GestureDetector, 辅助检测用户的单机, 滑动,长按,双击等行为。用户的触摸行为是在onTouchEvent事件中处理, 所以,需要使用GestureDetector的话, 在onTouchEvent方法中添加如下实现:boolean consume = mGestureDetector.onTouchEvent(event);
  7. Scoller, 弹性滑动对象。 View的scrollTo/scrollBy的方法是瞬间完成移动, 用户体验不佳; 所以使用弹性滑动Scroll, 可以在制定事件完成滑动: scroller.startScroll(scrollX, 0, delta, 0, 1000); // 1000ms内水平滑向destX

View的滑动


  1. scrollTo/scrollBy ,只能将view的内容进行移动, 并不能将view本身进行移动。mScrollX参数代表View左边缘和View内容左边缘的距离; mScrollY同理
  2. 动画,使用translate方法。注意动画也不能改变View的位置, 所以,点击事件并不会在新位置触发。
  3. 布局参数, 通过改变布局参数MarginLayoutParams。
  4. 滑动方式对比:

scrollTo/scrollBy: 操作简单,适合对View内容的滑动;
动画: 操作简单,适用于没有交互的View和实现复杂的动画效果;
改变布局参数:操作复杂, 适用于有交互的View。

弹性滑动

  1. Scroller, 通过源码分析, Scroller通过invalidate方法实现View的弹性滑动,确切的说是computeScroll方法, 具体流程: View重绘–>draw()–>computeScroll()–>getScrollX()–>scrollTo()滑动;–>postInvalidate() 二次重绘制, 如此反复, 直到过程结束。
  2. 动画, 略
  3. 延时策略, 使用Handler或View的postDelay方法, 或者线程的sleep方法。 同样在每次执行过程中实现scrollTo方法, 实现每次滑动一点, 然后整体出现弹性滑动的效果。

View的事件分发机制

未完待续……

1 0