Android之View基础知识总结

本文介绍了Android中View的基本概念及其位置参数,并详细探讨了MotionEvent、TouchSlop、VelocityTracker和GestureDetector等触控相关组件的工作原理。

View基本概念

View是一种界面层的控件抽象,它代表了一个控件。除了View之外,还有ViewGroup。ViewGroup,顾名思义就是控件组,内部可以包含很多子类

的ViewGroup和子类的View。Android中,View和ViewGroup的有一个树形的结构关系,让我们看一下。
View树形结构
Android设计中,ViewGroup也继承了View,这就意味着View本身就可以是单个控件也可以是由多个控件组成的一组控件,通过这种关
系就形成了上面的View树的结构。明白了View的这种层级结构有助于理解View的工作机制。

View的位置参数

View的位置主要是由它的四个顶点来决定的,分别对应于四个属性:top、left、right、bottom。他们的具体含义分别是:top为左上角的纵坐

标,left为左上角的横坐标,right为右下角的横坐标,bottom为右下角的纵坐标。需要注意的是,这四个属性是一个相对坐标,是View相
对于它的父容器来说的。
参数描述
我们从上图看出View的宽度、高度和坐标的关系:
width = right - left;
height = bottom - top;
那么,上述的这四个参数是任何得到的呢。在Android源代码中它们分别对应四个参数:mTop、mLeft、mRight、mBottom。
获取的方式是:
mTop = getTop();
mLeft = getLeft();
mRight = getRight();
mBottom = getBottom();
特别需要说明的一点,从android3.0开始,View增加了几个参数:x、y、translationX和translationY,其中x和y是View的左上角的横
坐标和纵坐标,而translationX和translationY是View相对于其父容器的偏移量。

MotionEvent和TouchSlop

手指在设备屏幕上操作时会产生一系列的事件中,典型的事件类型有如下几种情况。
ACTION_DOWN: 手指在刚刚按下,刚刚接触到屏幕
ACTION_MOVE: 手指在屏幕上移动;
ACTION_UP:    手指刚刚从屏幕上松开的一瞬间
正常情况下,一次操作会在android设备上引发两种情况。
简单的情况:点击屏幕后立马松开,引发ACTION_DOWN ---> ACTION_UP。
复杂的情况:点击屏幕后滑动一会儿再松开,引发ACTION_DOWN ---> ACTION_MOVE --->.....--->ACTION_MOVE--->ACTION_UP。
那么上面的两种情况是如何进行区分的呢?即如何判断手指在屏幕上面有没有滑动,这里需要一个参数:TouchSlop。这个参数很重要,它被认为是

屏幕上能滑动的最小距离,换句话说,如果滑动小于这个距离的话就代表没有滑动。它也是一个常量,跟设备有关,不同的Android设备有
其固定的TouchSlop值。我们想要拿到它的值可以通过如下方法
float touchSlop = ViewConfiguration.get(Context context).getScaledTouchSlop();

VelocityTracker

Velocity顾名思义,速度追踪。就是指手指在滑动过程中的速度情况,这里的速度包括横向的速度和纵向的速度。它的使用过程很简单,我们需要在

view的onTouchEvent方法中追踪当前事件的速度:

.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                VelocityTracker velocityTracker = VelocityTracker.obtain();
                velocityTracker.addMovement(motionEvent);
                return false;
            }
        });
当我们想知道当前的滑动速度时,可以采用如下方式。
.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                VelocityTracker velocityTracker = VelocityTracker.obtain();
                velocityTracker.addMovement(motionEvent);
                velocityTracker.computeCurrentVelocity(1000);
                float velocityX = velocityTracker.getXVelocity();
                float velocityY = velocityTracker.getYVelocity();
                return false;
            }
        });
上述方法有必要解释一下,velocityTracker.computeCurrentVelocity(1000)这句话表示的是速度统计的时间间隔,单位是毫秒。这里我们

设置1000就表示我们计算的是1s内手指在横坐标和纵坐标滑动的速度。velocityTracker.getXVelocity()和velocityTracker.getYVelocity()
表示的是横坐标和纵坐标方向上的速度了,这里格外需要注意的是滑动的单位是像素px。
当我们不需要使用它的时候,最好是重置一下速度追踪器,并回收内存。

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

GestureDetector

手势检测,用于辅助检测用户的单击、滑动、长按、双击等行为。要使用GestureDetector,首先我们要创建一个GestureDetector对象,并

实现OnGetureListener接口。根据需要,我们还可以实现OnDoubleTabListener接口,从而实现监听双击行为。

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

                    @Override
                    public void onShowPress(MotionEvent motionEvent) {

                    }

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

                    @Override
                    public boolean onScroll(MotionEvent motionEvent, MotionEvent motionEvent1, float v, float v1) {
                        return false;
                    }

                    @Override
                    public void onLongPress(MotionEvent motionEvent) {

                    }

                    @Override
                    public boolean onFling(MotionEvent motionEvent, MotionEvent motionEvent1, float v, float v1) {
                        return false;
                    }
                });
上面的实现的方法大致说明如下
onDown: 手指轻轻触摸屏幕的一瞬间,由ACTION_DOWN触发
onShowPress:手指轻轻触摸屏幕,尚未松开或拖动,它强调的是手指没有松开或者拖动的状态
onSingleTabUp:手指松开,伴随着ACTION_UP而触发(个单击行为)
onScroll:手指按下并拖动,由一个ACTION_DOWN,多个ACTION_MOVE触发(拖动行为)
onLongPress:长久按着屏幕不放
onFling:按下屏幕迅速滑动后松开,由一个ACTION_DOWN,多个ACTION_MOVE和一个ACTION_UP组成(快速滑动行为)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值