View 的属性

1. View的基本信息

View 的位置主要由它的四个顶点来确定,分别对应 View 的四个属性:top,left,right,bottom。左上角坐标为 top 和 left,右下角坐标为 right 和 bottom。这些坐标都是 View 相对于父容器来说的,因此他是一种相对坐标,在 Android 中,X轴和Y轴的正方向分别是右和下,这些就不做过多解释了。

2. 得到View的四个属性

当然也很简单,在 View 的源码中它们对应于 mLeft,mRigth,mTop,mBottom 这四个成员变量,获取方式如下:
left = getLeft();
top = getTop();
right = getRight();
bottom = getBottom();

从 Android 3.0开始, View 增加了额外的几个参数:X,Y,translationX,translationY,其中 X 和 Y 是 View 左上角的坐标,而 translationX 和 translationY 是 View 是左上角相对于父容器的偏移量。这几个参数也是相对于父容器的坐标,并且 translationX 和 translationY 默认值是 0,和 View 的四个基本属性一样,View 也为它们提供了 set/get 方法,表示如下:
x = left + translationX;
y = top + translationY ;

需要注意的是,在 View 移动过程中,top 和 left 是不会改变的,始终表示 View 的左上角的位置信息,只有 x,y,translationX,translationY 这四个参数在变化。

3. MotionEvent 和 TouchSlop

(1)MotionEvent

在手指触摸屏幕后所产生他的一系列事件中,典型的事件类型有以下几种:
ACTION_DEWN:手指刚接触屏幕
ACTION_MOVE:手指在屏幕上移动
ACTION_UP:手指从屏幕上松开的一瞬间
正常情况下,一次手指触摸屏幕会触发一系列点击事件,考虑如下几种情况:
点击屏幕松开:DOWN--------UP
点击屏幕滑动一会再松开:DOWN-----MOVE--...---MOVE----UP
上述情况是典型的事件序列,同时他通过 MotionEvent 对象我们可以得到点击事件发生的 x 和 y 坐标,为此,系统提供了两组方法:getX/getY 和 getRawX/getRawY, 他们的区别很简单,getX/getY 返回的是当前 View 左上角的 x 和 y 坐标,而 getRawX/getRawY 返回的是相对于手机屏幕左上角的 x 和 y 坐标.

(2) TouchSlop

TouchSlop 是指系统所能识别出的被认为是滑动的最小距离。这是一个常量,和设备有关,不同的设备,该值是不一样的。通过如下方式可以获取:ViewConfiguration.get(getApplicationContext()).getScaledTouchSlop(),具体有啥用,这就需要读者自己考虑了。比如说来个筛选,过滤掉那些不是滑动的操作。

4. VelocityTracker,GestureDetector 和 Scroller

(1) VelocityTracker

追踪速度,用于追踪手指在滑动的过程中的速度,包含水平和垂直速度。它的使用过程很简单,首先,在 View 的 onTouchEvent 方法中追踪当前点击事件的速度:

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        VelocityTracker velocityTracker = VelocityTracker.obtain();
        velocityTracker.addMovement(event);
    }

接着,当我们先知道当前的滑动速度时。这个时候可以采用如下方式获取当前的速度:

        //computeCurrentVelocity的单位是毫秒
        velocityTracker.computeCurrentVelocity(1000);
        int xVelocity = (int) velocityTracker.getXVelocity();
        int yVelocity = (int) velocityTracker.getYVelocity();

在这一步,有两点需要注意,第一点,获取速度之前必须先计算速度,即在 getXVelocity() 和 getYVelocity() 这两个方法调用之前,必须先调用 computeCurrentVelocity() 这个方法;第二点,这是的速度指手指在一段时间内,手指所划过的像素数。需要注意的是,速度可以为负值,手指向右滑动或者向下滑动都是正值,向左或者向上滑动为负值。公式表示为

速度 = (终点位置 - 起始位置) / 时间段

最后当我们不需要使用它的时候,需要调用 clear 方法重置并且回收内存:

        velocityTracker.clear();
        velocityTracker.recycle();
(2) GestureDetector

手势检测,用于检测用户的点击,双击,滑动,长按等行为。
首先,我们需要创建一个 GestureDetector 对象并实现 OnGestureListener 接口,根据需要我们还可以实现其他的接口,进行其他行为的监听。

        private GestureDetector gestureDetector = new GestureDetector(this);
        //解决长按屏幕后无法拖动的情况
        gestureDetector.setIsLongpressEnabled(false);

然后,我们在 View 的 onTouchEvent 中做如下处理:

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        return gestureDetector.onTouchEvent(event);
    }

至此完成,这个接口的方法介绍如下,也可以使用其他的进行测试:



(2) Scroller

弹性滑动对象,用于实现 View 的弹性滑动,相似于动画效果,不是瞬间完成的,至于具体的操作,请看下篇文章。

你可能感兴趣的:(View 的属性)