Android进阶 笔记6
View的事件体系(一)
《Android开发与探索》
目录
一、View的基础知识
1、什么是View
view是Android中所有控件的基类,view本身可以是单个控件也可以是多个控件组成的一组控件,通过这种关系也就形成了View树的结构。
这和web前端中的DOM树的概念是相似的。
2、View的位置参数
1)最基本的坐标系:
View的宽高和坐标的关系:
width = getRight() - getLeft();
height = getBottom() - getTop();
2)View在平移过程中,top和left表示的是原始左上角的位置信息,其值不会改变,发生改变的是x、y、translationX、translationY这四个参数。
translationX 和 translationY是左上角相对于父容器的偏移量,默认为0
x=left+translationX
y=top+translationY
3、MotionEvent
典型的事件类型:
ACTION_DOWN----手指刚接触屏幕
ACTION_MOVE-----手指在屏幕上移动
ACTION_UP----------手指从屏幕上松开的一瞬间
4、TouchSlop
TouchSlop是系统所能识别出的被认为是滑动的最小距离,这是一个常量,设备不同,值不同。
意义:
处理滑动的时候,可以此常量去做一些过滤,比如滑动距离<常量值,就认为不是滑动。
获取:
ViewConfiguration.get(getContext()).getScaledTouchSlop();
定义:
在res/values/config.xml中
< dimen name=“config_viewConfigurationTouchSlop” >8dp< /dimen >
5、VelocityTracker速度追踪
追踪手指在滑动过程中的速度
怎么用?
首先,在View的onTouchEvent方法中追踪速度
VeloctiyTracker velocityTracker = VelocityTracker.obtain();
velocityTracker.addMovement(event);
接着,如果想要获取速度的话,velocityTracker.computeCurrentVelocity(1000);
int xVelocity = (int) velocityTracker.getXVelocity();
int yVelocity = (int) velocityTracker.getYVelocity();
最后,不需要的时候关闭它velocityTracker.clear();
velocityTracker.recycle();
速度 = (终点位置 - 起点位置) / 时间段
单位是ms
手指逆着坐标系的正方向滑动,产生的速度就是负值
经过测试一般建议类似ViewPager这样的空间,将时间间隔设置为1000(也就是1秒)时,加速度阈值设为1000-2000左右体验较好,各位可自行测试。
6、GestureDetector
手势检测,用于辅助检测用户的单机、滑动、长按、双击行为。
p127
二、View的滑动
主要有三种
1)通过View本身提供的scrollTo/scrollBy方法来实现滑动;【适合对view内容的滑动】
2)通过动画让一个View进行平移,主要操作translationX和translationY属性;【适合没有交互的View】
3)通过LayoutParams改变布局参数【适用于有交互的View】
1、scrollTo和scrollBy
scrollTo实现了基于参数的绝对滑动
public void scrollTo(int x, int y);
scrollBy实现了基于参数的相对滑动,它是基于scrollTo的public void scrollBy(int x, iny y){ scrollTo(mScrollX+x, mScrollY+y);}
scrollTo和scrollBy只改变View内容的位置,而不改变View在布局中的位置,view本身的getX,getY方法得到的值是不会变的
mScrollX和mScrollY变化的规律如下:P131
2、动画
注意View动画的View移动只是位置移动,其本身还是在原来位置,新的位置只是View的影像而已,会导致一些bug。
使用属性动画可以解决上述问题。
3、改变布局参数
重写设置LayoutParams里面的参数
如:直接把marginLeft增加100dp
又如:在button左边写一个宽度为0的view,要改变button位置的时候就把View的宽度设置为100dp,这样button就自动往右边挤了。
怎么获取和改变?
MarginLayoutParams params = (MarginLayoutParams) mButton1.getLayoutParams();
params.width += 100;
params.leftMargin += 100;
mButton1.requestLayout();
本文地址:https://blog.csdn.net/melocarter/article/details/109613651