View基础知识
什么是View
View是Android中所用控件的基类,是一种界面层控件的一种抽象,除了View还有ViewGroup。在Android的设计中,ViewGroup继承View,及View本身可以是单个控件也可以是多个控件组成的一组控件,通过这种关系就形成了View树的结构。
View的位置参数
View的位置主要由四个顶点决定,分属于View的四个属性:top、left、right、bottom, 注意这些坐标都是相对于View的父布局来说即是一种相对坐标
- 从Android3.0开始,View增加了额外几个参数:x、y、translationX、translationY,其中 x 和 y 是View左上角的坐标,而 translationX 和 translationY 是View左上角相对于父容器的偏移量。
- View在平移过程中,top和left表示的是原始左上角的位置信息,不会发生改变,此时改变的是x、y、translationX和translationY这四个参数
MotionEvent和TouchSlop
- MotionEvent
在手指接触屏幕后所产生的一系列事件,主要有如下几种:
- ACTION_DOWN 手指刚接触屏幕
- ACTION_MOVE 手指在屏幕上移动
- ACTION_UP 手指从屏幕上松开
正常情况下,一次手指触屏屏幕会触发一系列点击事件
- 点击屏幕后松开:DOWN -> UP
- 点击屏幕滑动后松开:DOWN -> MOVE-> …> MOVE-> UP
2.TouchSlop
是系统所能识别出的被认为是滑动的最小距离,如果手指在屏幕上滑动时,两次滑动距离小于这个常量,则系统不会认为你在进行滑动操作
作用:可以作为过滤器使用,当两次滑动距离小于该常量,则不认为用户在进行滑动操作,提高用户体验,在源码中对应为:config_viewConfigurationTouchSlop
<!--Base "touch slop" value used by ViewConfiguration as a movement threshold
where scrolling should begin. -->
<dimen name="config_viewConfigurationTouchSlop">8dp</dimen>
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();
不需要使用时,需要进行内存回收
velocityTracker.clear();
velocityTracker.recycle();
注意:
获取速度之前必须先计算速度
这里的速度是指一段时间内手指所滑过的像素数,及可以为负数,计算公式:速度=(终点位置-起点位置)/时间段
- GestureDetector
手势检测,用于辅助检测用户的单击、滑动、长按、双击等操作
创建一个GestureDetector对象并实现OnGestureListener接口(OnDoubleTapListener 监听双击行为)
GestureDetector mGestureDetector = new GestureDetector(this);
//解决长按屏幕后无法拖动的现象
mGestureDetector.setIsLongpressEnabled(false);
接管目标View的onTouchEvent方法
boolean consume = mGestureDetector.onTouchEvent(event);
return consume;
之后即可实现OnGestureListener和OnDoubleTapListener中的方法,具体如图:
注意:
- 比较常用的有:onSingleTapUp(单击)、onFling(快速滑动)、onScroll(拖动)、onLongPress(长按)和onDoubleTap(双击)
- 实际开发中,完全可以自己在View的onTouchEvent方法中实现监听滑动(根据个人喜好选择性使用)
- Scroller
弹性滑动对象,用于实现View的弹性滑动,实现有过渡效果的滑动,配合View的computeScroll方法使用:
Scroller scroller = new Scroller(mContext);
// 缓慢滚动到指定位置
private void smoothScrollTo(int destX,int destY) {
int scrollX = getScrollX();
int delta = destX -scrollX;
// 1000ms内滑向destX,效果就是慢慢滑动
mScroller.startScroll(scrollX,0,delta,0,1000);
invalidate();
}
@Override
public void computeScroll() {
if (mScroller.computeScrollOffset()) {
scrollTo(mScroller.getCurrX(),mScroller.getCurrY());
postInvalidate();
}
}
标签:GestureDetector,int,基础知识,velocityTracker,滑动,Android,屏幕,View
From: https://blog.csdn.net/qq_53092981/article/details/144373708