《Android开发艺术探索》第3章读书笔记

  • View是所有组件的根,包括ViewGroup也继承自view。

  • View的位置属性left、top是左上角相对于父控件的位置,right和bottom是右下角相对于父控件的位置。
    因此,right = left + width,bottom = top + height。
    可以通过getLeft()、getTop()、getRight()、getBottom()获取相应值。

  • View的x、y属性是左上角的坐标。
    translationX和translationY是左上角相对于父控件的偏移量,默认都是0。
    因此,x = left + translationX,y = top + translationY。
    注意:left、top、right、bottom这四个值是固定不变的代表原始属性,View在移动过程中改变的是translationX和translationY,进而改变x、y。

  • 通过getX()、getY()获取View的x、y的值,通过getRawX()、getRawY()获取View相对于屏幕左上角的x、y的值。这两个是不一样的,区别在于相对于父控件还是屏幕的左上角。

  • 手指接触屏幕的一系列事件称之为MotionEvent,细分为:
    ACTION_DOWN - 手指刚接触屏幕
    ACTION_MOVE - 手指在屏幕上移动
    ACTION_UP - 手机从屏幕上松开的一瞬间
    因此,MotionEvent通常分为两个系列
    DOWN - UP为点击,DOWN - MOVE - MOVE - ... - UP为滑动。

  • TouchSlop是系统所能识别出来的滑动的最小距离,也就是滑动的距离单位。这是个常量,因机型而异。可以通过```
    ViewConfiguration.get(getContext()).getScaledTouchSlop()


- VelocityTracker用于获取滑动的速度,用过以下代码实现

VelocityTracker velocityTracker = VelocityTracker.obtain();
velocityTracker.addMovement(event);
velocityTracker.computeCurrentVelocity(1000);
int xVelocity = (int) velocityTracker.getXVelocity();
int yVelocity = (int) velocityTracker.getYVelocity();

其中velocityTracker.computeCurrentVelocity(1000);是设置时间单位,单位是毫秒。1000就是每秒的速度,所求的速度单位是像素。

- GestureDetector用于手势操作的捕获并进行相应操作。
这个这本书写得太简单了,[这篇文章](http://www.cnblogs.com/sw926/p/3208158.html)写得比较清楚。
大概意思是,像onClick()这种事件其实是一串MotionEvent的序列了,其实是可以拆分到Down、Move、Up之类的细分Event的。GestureDetector就能干这种事。
做法是写个类实现OnGestureListener或者OnDoubleTapListener接口。
这两个接口有各自不同的方法:
OnGestureListener
onDown 手指触摸屏幕的一瞬间
onShowPress 手指触摸屏幕后瞬间后的那个状态
onSingleTapUp 手指从屏幕上离开的那个瞬间
onLongPress 长按
onScroll 手指按下屏幕并滑动,比较慢的滑动
onFling 手指按下屏幕,迅速滑动一下然后松开
OnDoubleTapListener
onSingleTapConfirmed 单击
onDoubleTap 双击
onDoubleTapEvent 双击发生过程的期间
如果在重写期间想打印具体什么操作可以

@Override
public void onLongPress(MotionEvent e) {
Log.i(getClass().getName(), "onLongPress-----" + getActionName(e.getAction()));
}

实现以上接口后自己在相应方法写下操作。然后创建对象:
例如我写了个MyOnGestureListener,那么就:

GestureDetector mGestureDetector = new GestureDetector(this, new MyOnGestureListener());
...
// 把Button的TouchEvent交给mGestureDetector去捕获和处理
mButton.setOnTouchListener(new OnTouchListener() {

@Override
public boolean onTouch(View v, MotionEvent event) {
    mGestureDetector.onTouchEvent(event);
    return true;

}







你可能感兴趣的:(《Android开发艺术探索》第3章读书笔记)