Android的View初探(一)

Android中的View体系十分重要。

Android中的view虽然不属于四大组件,但是可以把他当做第五大组件。

View的基础知识

主要包含View的位置参数、MotionEvent和TouchSlope对象、VelocityTracker、GestureDetector、Scroller对象等:
1.View是Android中所有控件的父类
不管是简单的TextView、Button还是Recyclerview、RelativeLayout,他们共同的父类都是View,View是一种界面层的控件的一种抽象,他代表了一个控件。除此之外还有ViewGroup,控件组,就是说ViewGroup内部又包含了若干个View,Android中ViewGroup也是继承的View类,以此说明View可以是单个的控件,也可以是由多个控件组成的一组控件。通过这种关系就形成了View的树结构,通常认为,Button显然是个View,而RelativeLayout不但是一个View而且还是一个ViewGroup,而ViewGroup内部是可以有子View的,子View同样还可以是一个ViewGroup,以此类推。

2.View的位置参数
View的位置主要由他的四个顶点来决定,分别对应View的四个属性即:top、left、right、bottom,其中top是左上角纵坐标,left是左上角的横坐标,right是右下角的横坐标,bottom是右下角纵坐标,这些坐标都是相对于View的父容器来说的,因此是一种相对坐标。
View的坐标位置和父容器的关系
在Android中,x轴和y轴的正方向分别为右和下。上图中我们可以得出

width = right - left;
height = bottom - top;

我们可以在View的源码中找到对应的四个参数对应的四个成员变量:mLeft,mRight,mTop,mBottom,可以如下获取:

Left = getLeft();
Right = getRight();
Top = getTop();
Bottom = getBottom();

从Android3.0开始,View增加了额外的几个参数:x、y、translationX和translationY,其中x和y是View左上角的坐标,而translationX和translationY是View左上角对应父容器的偏移量,这几个参数也是相对于父容器的坐标,并且translationX和translationY的默认值是0,和View的四个基本的位置参数一样,View也给他们提供了get/set方法。他们之间的换算方法如下:

x = left+translationX;
y = top+translationY;

另外,View在平移的过程中,top和left表示的是原始左上角的位置信息,其值不会发生改变,此时产生改变的是x、y、translationX、translationY四个参数。
3.Motion和TouchSlop
1.MotionEvent
在手指接触屏幕后所产生的一系列事件中,典型的事件类型中有如下几种:1、ACTION_DOWN-手指刚接触到屏幕,2、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坐标。
2.TouchSlop
TouchSlop是系统锁能识别出来的被认为是滑动的最小距离,换句话说,当手指再屏幕上滑动时,如果滑动的距离小于这个常量,则系统不认为是在做滑动操作。这是一个常量,不同的设备可能这个常量不一致。可以通过ViewConfiguration.get(getContext()).getScaledTouchSlop()。可以通过这个常量对滑动操作做一些过滤以此来提高用户的体验。
3.VelocityTracker、GestureDetector和Scroller
1.VelocityTracker
速度追踪,用于追踪手指滑动过程中的速度,包括水平、竖直方向的速度,首先在View的onTouchEvent方法中追踪当前单击事件的速度:

VelocityTracker velocityTracker = VelocityTracker.obtain();
velocityTracker.addMovement(event);

接着,当我们知道当前的滑动速度时,可以采用如下方式获得当前速度:

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

首先要注意的是在获取速度之前要先计算速度,即getXVelocity和getYVelocity这两个方法的前面必须要调用computeCurrentVelocity方法:第二点,这里的速度是指一段时间内手指所划过的像素数,比如将参数设置为1000ms,在1s内手指在水平方向从左向右划过100像素,此时水平速度即为100.速度可以是负数,当手指从右向左滑动时,水平方向为负值。
可以用如下公式来表示:

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

依据公式以及Android系统的坐标系,手指逆着坐标系的正方向滑动,产生的速度为负值,computeCurrentVelocity这个方法的参数表示的是一个时间单元或者说时间间隔,它的单位是毫秒,计算速度时得到的速度就是在这个时间间隔内手指在水平方向或竖直方向上所滑动的像素数,对于上面的例子,如果我们通过velocityTracker.computeCurrentVelocity(100);因此水平速度就成了10像素/每100ms。(假设匀速滑动)所以得到水平速度为10。最后,当不需要它的时候就clear重置并释放内存。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值