Android View事件体系总结其一

什么是View?

View是Android中所有控件的基类,是一种界面层的控件的一种抽象,它代表了一个控件。

View的位置参数

View的位置主要由它的四个顶点决定,分别对应View的四个属性:top,left,right,bottom。其中top是左上角纵坐标,left是左上角横坐标,right是右下角横坐标,bottom是右下角纵坐标。值得注意的是,这些坐标都是相对于View的父容器来说的。

View的宽 Width=right-left;

View的高 Height=bottom-top;

top,left,right,bottom的值,View中皆有相对的方法

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(默认情况下无偏移)。

其中:

x = left + translationX;

y = right + translationY;

值得注意的是,View在平移过程中,top和left表示的是原始左上角的位置信息,其值并不会发生改变,此时改变的仅有x,y,translationX,translationY这四个参数。

MotionEvent

View的点击事件,事件类型主要有如下几种:

ACTION_DOWN : 手指刚接触屏幕

ACTION_MOVE:手指在屏幕上移动

ACTION_UP : 手指从屏幕上松开的瞬间

通常情况下,手指在屏幕上的各种操作,主要考虑以下几种情况:

点击屏幕操作:事件序列为 DOWM -> UP

手指在屏幕上滑动后松开:事件序列为 DOWN->MOVE ->....->MOVE->UP

在上述手指在屏幕上操作期间,如果我们想要获取手指在屏幕上的位置信息,系统通常提供了两组方法:getX()/getY()和getRawX()和getRawY()。

区别很简单:

getX()/getY()返回的是相对于当前View左上角的x/y坐标。

getRawX/getRawY()返回的是相对于手机屏幕左上角的x/y坐标。

TouchSlop

系统所能识别出被认为是滑动的最小距离。

换句话说,当手指在屏幕上滑动时,在手指按下(DOWN)与手指抬起(UP)两个事件之间移动的距离小于这个常量,那么系统就不认为你是在进行滑动操作,多数是认为点击操作。这个值一个常量,通常与设备有关。

获取常量方法:

        int scaledDoubleTapSlop = ViewConfiguration.get(getContext()).getScaledDoubleTapSlop();

当我们处理滑动是,可以利用这个常量来做一些过滤,比如当两次滑动事件的滑动距离小于这个值,我们就认为未达到滑动距离的临界值,因此我们就不认为它是滑动,这样会有更好的用户体验。

VelocityTracker

速度追踪,用于追踪手指在屏幕上滑动过程中的速度,包括水平和竖直方向的速度。

        VelocityTracker velocityTracker = VelocityTracker.obtain();
        velocityTracker.computeCurrentVelocity(1000);
        float xVelocity = velocityTracker.getXVelocity();
        float yVelocity = velocityTracker.getYVelocity();

需要注意两点:

其一:获取速度前必须先计算,即必须先调用computeCurrentVelocity(int units)方法

其二:这里获取的速度是指单位时间内手指划过的像素数。比如设置1000ms,划过的像素为400像素,那么在一秒内平均速度就为400像素。

最后,当不需要使用VelocityTracker对象时,需要调用clear方法来重置并回收内存;

 velocityTracker.clear();
 velocityTracker.recycle();

GestureDetector

手势检测,用于辅助检测用户的单击,滑动,长按,双击等行为。

GestureDetector gestureDetector = new GestureDetector(new GestureDetector.OnGestureListener() {
            @Override
            public boolean onDown(MotionEvent e) {
                return false;
            }

            @Override
            public void onShowPress(MotionEvent e) {

            }

            @Override
            public boolean onSingleTapUp(MotionEvent e) {
                return false;
            }

            @Override
            public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
                return false;
            }

            @Override
            public void onLongPress(MotionEvent e) {

            }

            @Override
            public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
                return false;
            }
        });

onDwon : 手指轻轻触摸屏幕的一瞬间,由一个ACTION_DWON触发。

onShowPress : 手指轻触屏幕,尚未松开或滑动,由一个ACTION_DWON触发。

注意:与onDwon的区别,它强调的是没有松开或拖动的状态。

onSingleTapUp : 手指从屏幕上松开,伴随这一个ACTION_UP事件,这是单击行为。

onScroll :手指按下屏幕并拖动,由一个ACTION_DWON,多个ACTION_MOVE触发,属于拖动行为。

onLongPress:手指长按屏幕不放。

onFling:手指按下屏幕,快速滑动后松开,由一个ACTION_DOWN,多个ACTION_MOVE,一个ACTION_UP触发。

onDoubleTap:双击行为。由两个单机行为组成,它不可能与onSingleTapConfirm共存。

onSingleTapConfirm :严格的单机行为。

注意:与onSingleTapUp的区别,如果触发了onSingleTapConfirm,那么后面不可能再紧跟这另一个单机行为。

onDoubleEvent:表示发生了双击行为。

下一章 Android View事件体系汇总其二

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值