View体系

207 阅读3分钟

一、View的位置参数

位置参数都是相对父容器的坐标。坐标单位都是 pixel,可归类为以下三类:

View 的原始左上角(left, top)、右下角(right, bottom)的坐标决定 View 的位置

View 的左上角坐标(x, y)

translationX、translationY 表示 View 的左上角相对父容器的偏移量

区别:

View 在平移的过程中,top、left 表示原始左上角的坐标,其值不会发生改变。此时该改变的是x、y、translationX、translationY Android 3.0 开始,才追加 x、y、translationX、translationY

它们的转换规则为

  • x = left + translationX

  • y = top + translationY

相关API

  • getTop()

  • getBottom()

  • getLeft()

  • getRight()

  • getX()

  • getY()

  • getTranslationX()

  • getTranslationY()

二、实现View滑动的六种方法

使用layout的方法;

使用offsetLeftAndRight()与offsetTopAndBottom();

使用LayoutParams();

使用scrollTo()与scrollBy();

使用Scroller类

使用属性动画:

1.使用onLayout的方法可以试着view的位置,那么我们就可以通过改变left,right,top,bottom来使View移动,结合MontionEvent来实现view跟着手指的滑动移动。

2.使用offsetLeftAndRight()与offsetTopAndBottom()和Layout方法一样,都是对左上右下移动的一个封装 offsetLeftAndRight()是对左右的一个封装 offsetTopAndBottom()是对上下的一个封装

3.使用LayoutParams() 我们可以使用LayoutParams的方法来实现view的移动,LayoutParams可以设置view的位置,也可以通过geLayoutParams方法来获得当前view的位置。自然也可以使用setLayoutParams方法来修改View的位置,结合TouchEvent方法就可以让View进行变动。

属性动画的属性值:

translationX和translationY:这两个属性作为增量控制View对象从他的布局容器的左上角开始位置。

rotation、rotationX、rotationY:这三个属性控制View对象围绕它的支点进行2D和3D旋转。

PrivotX和PrivotY:控制View对象的支点位置,围绕这个支点进行旋转和缩放变换处理。默认该支点位置就是View对象的中心点。

alpha:透明度,默认是1(不透明),0代表完全透明。

x和y:描述View对象在它容器中的最终位置,它是最初的做上角坐标和translationX,translationY值的累计的和。

动画的监听

完整的动画具有start,Repeat,End,Cancel四个过程:

after(Animator anim) 将现有动画插入到传入的动画之后执行

after(long delay) 将现有动画延迟指定毫秒后执行

before(Animator anim) 将现有动画插入到传入的动画之前执行

with(Animator anim) 将现有动画和传入的动画同时执行

Scroller的构造函数

要想使用Scroller,必须先调用new Scroller(),我们先来看看Scroller的构造函数:

Scroller有三个构造函数,通常情况我们都用第一种,第二种需要传进去一个差值器Interpolator ,如果不传则采用默认的差值器(viscous)。

点击事件有三个重要的方法它们分别是:

dispatchTouchEvent(MotionEvent ev):用来进行事件的分发

onInterceptTouchEvent(MotionEvent ev):用来进行事件的拦截,在dispatchTouchEvent()中调用,需要注意的是View没有提供该方法

onTouchEvent(MotionEvent ev):用来处理点击事件,在dispatchTouchEvent()方法中进行调用

点击事件由下而上的传递规则

点击事件传给最底层的View,如果他的onTouchEvent()方法返回true,则事件由最底层的View消耗并处理了,如果返回false则表示该View不做处理,则传递给父View的onTouchEvent()处理,如果父View的onTouchEvent()仍旧返回返回false,则继续传递给改父View的父View处理,如此的反复下去。

View的measure流程

MeasureSpec类帮助我们来测量View,测量模式分为三种:

UNSPECIFIED:未指定模式,View想多大就多大,父容器不做限制,一般用于系统内部的测量。

AT_MOST:最大模式,对应于wrap_comtent属性,只要尺寸不超过父控件允许的最大尺寸就行。

EXACTLY:精确模式,对应于match_parent属性和具体的数值,父容器测量出View所需要的大小,也就是specSize的值。