Android 艺术开发探索读后感-view基础知识

来源:互联网 发布:java多线程实例 编辑:程序博客网 时间:2024/06/03 11:23

view常用的基础知识包括:View的位置参数,MotionEvent和TouchSlop对象,VelocityTracker,GestureDetector和Scroller对象。

View的位置参数

view的位置主要由它的四个顶点来决定,分别对应view的四个属性:top,left,right,bottom。注意:这些坐标都是相对于View的父容器来说的,因此是一种相对坐标,View和父容器的关系见下图。另外在Android中,X轴和Y轴的方向为右和下。


从图中我们得出view的宽高和坐标的关系:

width=right-left

height=bottom-top

如何获取这个四个参数的值呢?在View源码中分别对应mTop,mBottom,mLeft和mRight这四个成员变量,获取方式如下:

Top=getTop();

Bottom=getBottom();

Left=getLeft();

Right=getRight();

从Android3.0开始,view增加了而我的几个参数:X,Y,translationX和translationY。其中X和Y是View左上角的坐标。translationX和translationY是View左上角相对于父容器的偏移量。这几个参数也是相对于父容器的坐标,并且translationX和translationY默认值为0,当然View也为他们提供了get/set方法,这几个参数的换算关系如下:

X=left+translationX;

Y=top+translationY

注意:当View平移的过程中,top和Left的值不会变,改变的是x,y,translationX和translationY这四个参数的值。

MotionEvent和TouchSlop

MotionEvent

在手指接触屏幕后所产生的一系列事件中,典型的事件类型如下几种:

ACTION_DOWN——手指刚接触拼命;

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坐标。

TouchSlop

TouchSlop是系统所能识别的被认为是滑动的最小距离,它是一个常量,跟设备有关,不同设备,值可能不同。获取这个常量的方式为:ViewConfiguration.get(getContext()).

 getScaledTouchSlop()。这个常量的意义为:可以利用这个常量来做一些过滤,当滑动的距离小于这个值的时候我们就可以认为没有滑动,这样做可以有更好的用户体验。

VelocityTracker,GestureDetector和Scroller

VelocityTracker

速度追踪,追踪手指在屏幕上滑动的速度,包括水平方向和竖直方向的速度。用法很简单,首先,在View的onTouchEvent方法中追踪当前单击事件的速度:

VelocityTracker velocityTracker=VelocityTracker.obtain();

VelocityTracker.addMovement(event);

接着,当我们想要获取当前滑动速度时,可以采用如下方式:

velocityTracker.computeCurrentVelocity(1000);
int xVelocity= (int) velocityTracker.getXVelocity();int yVelocity= (int) velocityTracker.getYVelocity();

这里需要注意两点:第一点,获取速度之前必须先计算速度,即调用getXVelocity()/getYVelocity()之前必须调用computeCurrentVelocity()(单位为ms)方法;第二点,这里的1000表示在1000ms内的滑过的像素数,速度可以有负值,跟坐标同一个方向的为正值,反之为负值。获取速度的公式如下:

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

另外当我们不需要VelocityTracker时,需要调用clear()方法来重置并回收内存

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

手势检测,用于辅助检测用户的单击,滑动,长按,双击等行为,使用过程如下:

首先,创建一个GestureDetector对象并实现onGestureListener接口,根据需要还可以实现onDoubleTapListener从而能够监听双击行为:

GestureDetector gestureDetector=new GestureDetector(this);//解决长按屏幕无法拖动的现象gestureDetector.setIsLongpressEnabled(false);
接着,接管目标View的onTouchEvent方法,在待监听View的onTouchEvent方法中添加如下实现:

boolean consume=gestureDetector.onTouchEvent(event);

return consume;

做完以上两步就可以选择性的实现onGestureListener和onDoubleTapListener中的方法了

onGestureListener和onDoubleTapListener中的方法介绍




上表中常用的方法有:onSingleTapUp(单击),onFling(快速滑动),onScroll(拖动),onLongPress(长按)和onDoubleTap(双击),实际开发中如果只是监听滑动相关的,自己在onTouchEvent中实现就好了,如果是监听双击这样的行为,那么就使用GestureDetector。

Scroller

弹性滑动对象,用于实现View的弹性滑动。View的ScrollTo/ScrollBy方式来进行滑动都是瞬间完成的,用户体验不是很好。那么就可以使用Scroller来实现弹性滑动,即在一定时间内的滑动,它需要配合computeScroll方法完成弹性滑动功能。它的典型代码是固定的,如下:

Scroller scroller=new Scroller(mContext);//缓慢滑动到指定位置private  void smoothScrollerTo(int destX,int destY){    int scrollX=getScrollX();    int delta=destX-scrollX;    //1000ms内滑向destX,效果就是慢慢滑动    scroller.startScroll(scrollX,0,delta,0,1000);    invalidate();}@Overridepublic void computeScroll() {    if (scroller.computeScrollOffset()){        scrollTo(scroller.getCurrX(),scroller.getCurrY());        postInvalidate();    }}
具体的会在下篇中的View的滑动中讲解

0 0