View基础知识
2017-12-01 本文已影响0人
Android天之骄子
View位置参数
View的位置主要由它的四个顶点来决定,即left、top 、right、bottom。其中left
是左上角横坐标,top
左上角的纵坐标,right
右下角的横坐标,bottom
右下角纵坐标。这些值都是相对View的父容器说的;如图
获取相应坐标(相对坐标),相对于父容器的坐标。
- getLeft()即
left
- getTop()即
top
- getRight()即
right
- getBottom()即
bottom
View的自身大小
- getWidth()=
getRight()
-getLeft()
- getHight()=
getBottom()
-getTop()
从Android3.0开始,View增加看了额外的几个参数,
-
x
view发生偏移后左上角的横坐标 -
y
view发生偏移后左上角的纵坐标 -
translationX
相对于父容器在X轴的偏移量(默认0) -
translationY
,相对于父容器在Y轴的偏移量(默认0)
有如下的关系:x = left + translationX
,y = top + translationY
;View也提供了get/set方法,View在平移的过程中,top
、left
表示的原始左上角的位置信息,其值不会发生改变,改变的是X
、Y
、translationX
、translationY
。
MotionEvent和TouchSlop
1.MotionEnent
在手指接触屏幕后所产生的一系列事件中,典型的事件类型有如下几种:
- ACTION_DOWN——手指刚接触屏幕。
- ACTION_MOVE——手指在屏幕移动。
-
ACTION_UP——手指从屏幕松开的一瞬间。
正常情况下,一次手指接触屏幕会发生一系列点击事件,如下: - 点击屏幕后松开,事件序列为DOWN——UP
- 点击屏幕滑动一段距离再松开,事件序列为DOWN——MOVE——MOVE。。。UP。
同时通过MotionEnent
对象可以获取到点击位置的坐标 -
getX相对于当前View左上角的X坐标(注意不同于View.getX()),此方法属于
MotionEnent
对象 -
getY相对于当前View左上角的Y坐标(注意不同于View.getY()),此方法属于
MotionEnent
对象 - getRawX相对于当前屏幕左上角的X坐标
- getRawY相对于当前屏幕左上角的Y坐标
2.TouchSlop
TouchSlop是系统所能识别出最小的滑动距离,也就是说,当手指在手机屏幕上滑动的距离小于这个值,系统就不会认为是在做滑动操作。这是一个常量,和设备有关,通过如下方式即可获取到这个常量值:ViewConfiguration.get(getContext()).geetScaledTouchSlop()
/**
* Distance a touch can wander before we think the user is scrolling in dips.
* Note that this value defined here is only used as a fallback by legacy/misbehaving
* applications that do not provide a Context for determining density/configuration-dependent
* values.
*
* To alter this value, see the configuration resource config_viewConfigurationTouchSlop
* in frameworks/base/core/res/res/values/config.xml or the appropriate device resource overlay.
* It may be appropriate to tweak this on a device-specific basis in an overlay based on
* the characteristics of the touch panel and firmware.
*/
private static final int TOUCH_SLOP = 8;
VelocityTracker
速度追踪,用于追踪手指在滑动过程中的速度,包括水平和竖直方向的速度,用法,首先在View的onTouchEvent
方法中追踪当前单击事件的速度:
VelocityTracker velocityTracker = VelocityTracker.obtain(); //获取VelocityTracker实例
velocityTracker.addMovement(motionEvent); //对MOVE事件追踪
velocityTracker.computeCurrentVelocity(1000); //在响应时间内计算速度
float xVelocity = velocityTracker.getXVelocity(); //获取X轴方向速度
float yVelocity = velocityTracker.getYVelocity(); //获取Y方向速度
两点需要注意:
- 获取速度之前,要先进行计算速度
- 这里的速度是指一段时间内手指划过的像素数。
当不使用时,需要clear来进行重置并回收。
velocityTracker.clear();
velocityTracker.recycle();
GestureDetector
手势检测,用于检测用户的单击、滑动、双击、长按等行为。使用如下
new GestureDetector(this, new GestureDetector.OnGestureListener() {
@Override
public boolean onDown(MotionEvent motionEvent) {
手指接触屏幕的一瞬间,由一个ACTION_DOWN触发
return false;
}
@Override
public void onShowPress(MotionEvent motionEvent) {
手指刚接触屏幕,没有松开也没发生移动,强调的是没有松开和移动的状态
}
@Override
public boolean onSingleTapUp(MotionEvent motionEvent) {
手指刚接触屏幕松开,由ACTION_UP触发
return false;
}
@Override
public boolean onScroll(MotionEvent motionEvent, MotionEvent motionEvent1, float v, float v1) {
手指按下屏幕并发生滑动,一个ACTION_DOWN和多个ACTION_MOVE触发
return false;
}
@Override
public void onLongPress(MotionEvent motionEvent) {
长按
}
@Override
public boolean onFling(MotionEvent motionEvent, MotionEvent motionEvent1, float v, float v1) {
抛动也是快速滑动即手指按下后快速滑动后松开,由一个ACTION_DOWN、多个ACTION_MOVE和一个
ACTION_UP触发
return false;
}
})
Scroller
View的 mScrollX
, mScrollY
是指View的边界相对于View内容的距离