欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android进阶 笔记6

程序员文章站 2022-03-25 12:53:07
View的事件体系(一)《Android开发与探索》目录View的事件体系(一)一、View的基础知识1、什么是View2、View的位置参数3、MotionEvent4、TouchSlop5、VelocityTracker速度追踪6、GestureDetector二、View的滑动1、scrollTo和scrollBy2、动画3、改变布局参数一、View的基础知识1、什么是Viewview是Android中所有控件的基类,view本身可以是单个控件也可以是多个控件组成的一组控件,通过这种关系也...

View的事件体系(一)

《Android开发与探索》


一、View的基础知识

1、什么是View

view是Android中所有控件的基类,view本身可以是单个控件也可以是多个控件组成的一组控件,通过这种关系也就形成了View树的结构。
这和web前端中的DOM树的概念是相似的。

2、View的位置参数

1)最基本的坐标系:
Android进阶 笔记6
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
Android进阶 笔记6

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