第三章-View事件体系(基础介绍)

本文介绍了Android中View的基础知识,包括View的定义、位置参数、MotionEvent和TouchSlop、VelocityTracker、GestureDetector及Scroller的使用。讲解了View作为所有控件基类的角色,坐标系统,以及如何追踪手指滑动速度和处理手势检测。
摘要由CSDN通过智能技术生成

View基础知识

  • 什么是View
  • View的位置参数
  • MotionEvent和TouchSlop
  • VelocityTracker,GestureDetector和Scroller

在这里插入图片描述

一、View的基础知识

本节主要介绍View的一些基础知识,从而为更好地介绍后续的内容做铺差,主要介绍的内容有:View的位置参数、MotionEvent和TouchSlop、VelocityTracker,GestureDetector和Scroller对象,通过对这些基础知识的介绍,可以方便读者理解更复杂的内容。类似的基础概念还有不少,但是本节所介绍的都是一些比较常用的,其他的自行理解。

1.什么是View

在介绍View的基础知识之前,我们首先要知道到底什么是View。View是Android中所有控件的基类,不光是简单的Button和TextView还是复杂的RelativeLayout和Listview,它们的共同基类都是View。所以说,View是一种界面层的控件的一种抽象,它代表了一个控件,除了View,还有ViewGroup,ViewGroup内部包含了许多个控件,即一组View。在Android的设计中,ViewGroup也继承了View,这就意味着View本身就可以是单个控件也可以是由多个控件组成的一组控件,通过这种关系就形成了View树的结构,这和Web前端中的DOM树的概念是相似的。根据这个概念,我们知道,Button显然是个View,而LinearLayout不但是一个View而且还是一个ViewGroup,而ViewGroup内部是可以有子View的,这个子View同样还可以是ViewGroup
在这里插入图片描述

2.View的位置参数

View的位置主要由它的四个顶点来决定,分别对应于View的四个属性:top、left、right,bottom,其中top是左上角纵坐标,left是左上角横坐标,right是右下角横坐标,bottom是有下角纵坐标。需要注意的是,这些坐标都是相对于View的父容器来说的,因此它是一种相对坐标,View的坐标和父容器的关系如图3所示。在Android中,x轴和y轴的正别为右和下,这点不难理解,不仅仅是Android,大部分显示系统都是按照这个标准来定义坐标系的。
在这里插入图片描述

从图中的关系我们很容易得到宽高的关系
width = right- left
height = bottom - top

那么如何得到View的四个参数呢?也很简单,View的源码中它们对应于mLeft、mRight、mTop、mBottom这4个成员变量。获取的方式如下:
Left = getLeft();
Right = getRight();
Top = getTop();
Bottom = getBottom():

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

x = left + translationX
y = top + translationY

需要注意的是,View在平移的过程中,top和left表示在原始左上角的位置信息,其值并不会发生改变,此时发生改变的是x,y,translationX,translationY,这四个参数。

3.MotionEvent和TouchSlop
在这里插入图片描述

在这里插入图片描述
源码在线阅读地址:http://androidxref.com/9.0.0_r3/
在这里插入图片描述

4、VelocityTracker,GestureDetector和Scroller

a.VelocityTracker

速度追踪,用于追踪手指在屏幕上滑动的速度,包括水平和竖直方向上的速度使用过程很简单,首先,在View的onTouchEvent方法里追踪

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

接着,当我们先知道当前的滑动速度时,这个时候可以采用如下的方式得到当前的速度

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

在这一步中有两点需要注意,第一点获取速度的之前必须先计算速度,即getXVelocity和getYVelocity这两个方法前面一定要调用computeCurrentVelocity方法;第二点,这里的速度是指一段时间内手指滑动的屏幕像素数,比如将时间设置为1000ms时,在1s内,手指在水平方向手指滑动100像素,那么

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值