1、view介绍
view是Android中所有控件的基类,不管是button,还是Text View,或复杂的布局RelativeLayout和ListView,它们的基类,都是View,它是界面层控件的一个抽象。通过VIewGroup可以看出,ViewGroup中含有多个View,但它也是继承自View,所以,View可以是一个单独的控件,也可以是多个控件组成的一组控件。
2、View的位置参数
View的位置由它的四个顶点来决定,分别是top(左上角横坐标)、left(左上角纵坐标)、right(右下角横坐标)、bottom(右下角纵坐标)如图:
获取方法:
Left = getLeft();
Right = getRight();
Top = getTop();
Bottom = getBottom();
所以View的宽高width = right-left、height = bottom-top。
从Android3.0开始,View增加了几个参数,x、y、translationX、translationy,其中x和y是view左上角坐标,另外两个是view左上角相对父容器的偏移量,默认值为0。这几个参数是相对于父容器的坐标,View也为它们提供了get和set方法。
X、y的换算:x= left+translation y = top + translation
3 、MotionEvent和TouchSlop
1.MotionEvent
在手指触摸屏幕后产生的一系列事件,典型事件类型一般一下几种:
ACTION_DOWN—手指刚触摸屏幕
ACTION_MOVE----手指在屏幕上移动
ACTION_UP----手指从屏幕上移开
DOWM——UP:点击事件(点下去直接松开,没有移动)
DOWN——MOVE…MOVE——UP:点击并滑动一会再松开
上述事件的序列,同是通过Motion Event对象我们可以获取到点击的XY坐标,为此系统提供了getX/getY和getRaw X/getRawY方法。区别是前者是View的左上角x,y的坐标,后者是view相对于手机屏幕左上角的x和y的坐标。
2.TouchSlop
TouchSlop是系统所能识别出的,最小的滑动距离,意思是说,假如手指移动的距离小于这个距离,系统认为,没有做滑动操作。可以通过ViewConfiguration.get(getContext()).
getScaledTouchSlop()。可以用做一些滑动的过滤,比如误触这类的操作,可以据此为临界值。源码中定义:frameworks/base/core/res/res/values/config.xml中,如下图:
4、VelocityTracker、Gesture Detector和Scroller
1.VelocityTracker
速度追踪,用于追踪手指在滑动过程中的速度,包括水平和竖直方向。使用过程的话需要借助View的onTouchEvent.首先追踪当前点击事件的速度:
VelocityTracker velocityTracker = VelocityTracker.obtain(); velocityTracker.addMovement(event);
然后获取当前的滑动速度
第一步:velocityTracker.computeCurrentVelocity(1000); 第二部:int xVelocity = (int) velocityTracker.getXVelocity(); 第三步:int YVelocity = (int) velocityTracker.getYVelocity();
第四步:velocityTracker.clear()、velocityTracker.recycle(),重置,回收.
注意:1.获取速度之前,需先计算,即上述1方法
2.这里所谓的速度,其实是在一个时间段内手指所划过的像素点
3.速度有正负,从左往右滑动为正,右往左,为负。
公式:速度= (终点位置-起点位置)/时间段
2.GestureDetecot
手势检测,用于辅助检测用户的单击、滑动、长按、双击等行为,使用如下:
第一步:创建DestrureDetector对象并实现OnGestureListener接口,通过实现OnDoubleTapListener监听双击行为
GestureDetector mGestureDetector = new GestureDetector(this);
//解决长按屏幕后无法拖动的现象
mGesttureDetector.setIsLongpressEnable(false);
第二步:待监听View的onTouchEvent中实现
Boolean consume = mGestureDetector.onTouchEvent(event);
Return consume;
做完上述两步,可以根据需求,实现OnGestureListener和OnDoubleTapListener,方法说明如下:
常用方法主要包括:onSingleTapUp(单击)、onFling(快速滑动)、onScroll(拖动)、onLongPress(长按)和onDoubleTap(双击)。作者建议:如果监听滑动相关,在onTouchEvent中实现,监听双击行为,在GestureDetector中实现。
3.Scroller
弹性滑动对象,用于实现View的弹性滑动,View的scrollTo/scrollBy方法是没有滑动效果,都是瞬间完成,用户体验不是很好,实现方式如下:
Scroller scroller = new Scroller(this);
//缓慢的移动到指定的位置
private void smoothScrollTo(int dextX,int dextY){
int scrollX = getScrollX();
int delta = scrollX - scrollX;
//1000ms内滑向destx,效果慢慢滑动
scroller.startScroll(scrollX,0,delta,0,1000);
invalidate();
}
@Override
public void computeScroll(){
if (scroller.computeScrollOffset()) {
scrollTo(scroller.getCurrX(),scroller.getFinalY());
postInvalidate();
}
}
特别声明:内容总结来源《Android开发艺术探索》,仅记录学习,如有侵权或不对之处,还请告知,定当删除或改正