Android 中view的解释

来源:互联网 发布:linux配置环境变量 编辑:程序博客网 时间:2024/05/17 16:53

view是所有控件的父类,他的位置主要由他的四个顶点来决定。分别对应view的四个基本属性:left,top,right,bottom。其中top是左上角纵坐标,left是左上角的横坐标,right右下角的横坐标,bottom右下角的纵坐标。这些坐标都是相对于view的父控件来说的,因此它是一种相对坐标。在Android系统中,x轴和y轴的方向分别是向右和向下的          。                                                                   

根据上图,我们很容易得出宽高和坐标之间的关系

                                                  with=right-left;

height=bottom-top;

那么如何获取这四个参数呢?

top=gettop();

left=getleft();

bottom=getbottom();

right=getright();

从Android3.0开始,Android中的view新增了几个参数,x,y,translationx,translationy。其中的x,y是view左上角的坐标,translationx和translationy是view左上角相对于父容器的偏移量,这几个参数也是相对与父容器的坐标,并且translationx和translationy的值默认为零。他们之间的换算关系如下:

x=left+translationx;

y=top+translationy;

注意view在平移过程中top和left是原始位置,不会发生改变,发生改变的是x,y,translationx和translationy这四个参数。

motionevent 和touchslop

手机接触频幕后所产生的事件有如下几种:

action——down

action——move

action——up

点击后松开down>up;

滑动后松开down>move>move>move>up;

在这里系统提供了一下两组方法,getx(),gety()返回当前view的左上角的x,和y;;getrawx();getrawy()返回相对于手机屏幕左上角的x.和y;

touchslop 系统所能识别的被认为是滑动的最小距离。就是手指在手机上滑动,如果之间的距离小于这个距离,就不认为你是在滑动。这是一个长量,在不同设备上,他的滑动距离不同,通过如下方式可以获得:

viewconfiguration.get(getcontext()).getsaledTouchslop();

vellocitytracker用于追踪手指在滑动过程中的速度。包括横向和纵向。它的使用很简单在view的ontouchevent 的方法中追踪当前点击事件的速度:

              // 追踪当前速度
VelocityTracker velocityTracker = VelocityTracker.obtain();
velocityTracker.addMovement(event);


// 计算速度
velocityTracker.computeCurrentVelocity(1000);
// 获取速度
int x = (int) velocityTracker.getXVelocity();
int y = (int) velocityTracker.getYVelocity();
// 重置
velocityTracker.clear();
// 回收内存
velocityTracker.recycle();

GestureDetector

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

// 新建对象
GestureDetector gestureDetector = new GestureDetector(
(OnGestureListener) this);
// 解决长按后无法拖动的情况
gestureDetector.setIsLongpressEnabled(false);
// 接管ontuchevent方法
boolean consume = gestureDetector.onTouchEvent(event);
return consume;

做完以上,我们就可以有选择的实现ongesturelistener和ondoubleTAPlistener中的方法;介绍如下:


在日常开发中比较常见的有onsingtapup(单击), onfilling (快速滑动),onscroll(拖动),onlongpress(长按),和ondoubletap(双击);

另外要说的是在实际开发中,可以不使用gestureDetector,完全可以在view的ontouchevent中实现监听,这里有个建议,如果是滑动监听就用户自己来实现,如果是监听双击这种行为就是用gesturedetector。


Scroller

弹性滑动对象,用于view的弹性滑动,我们知道,当使用view的scrollto和scrollby方法来进行滑动时,其过程是瞬间完成的,对于用户体验不好。这时使用scroller来完成,他的滑动是有时间过程的。它本身无法让view滑动,需要配合computerscroll方法才能实现滑动过程。

scroller = new Scroller(context);

/**
* 缓慢滑动

* @param destx
* @param desty
*/
private void smooothScroll(int destx, int desty) {
int scroolx = getScrollX();
int date = destx - scroolx;
// 1000毫秒内向destx缓慢滑动
scroller.startScroll(scroolx, 0, date, 1000);
invalidate();
}

我们将在下一节讲解view的滑动与实现


0 0