标签:
1.View简介
View是Android中所有控件的基类,不管是简单的Button、TextView还是复杂的ListView、GridView什么的,都是直接或者间接继承View。因此,View是界面层的控件的一种抽象。除了View以外,还有ViewGroup,ViewGoup代表着一组控件,并且ViewGroup也继承于View。这表示,View本身可以是单个,也可以是多个控件,这样子就形成了View树的结构,因此,View在xml中的表示就很直观。
View这个体系,用的设计模式,就是我们常说的:组合(COMPOSITE) 设计模式。Composite使得用户对单个对象和组合对象的使用具有一致性。
2.View的位置参数
View的位置主要由它的四个顶点决定,分别对应View的四大属性:top、left、right、bottom,其中top是左上角的横坐标,left是左上角的横坐标,right是右上角的横坐标,bottm是右下角的纵坐标。这些坐标是相对于View的父容器来说的。
由此可以知道View的宽高和坐标的关系:
width = right - left;
height = bottom - top;
从Android 3.0开始,View增加了额外的几个参数,x、y、translationX和translationY,其中x 和 y 是View左上角的坐标,而translationX和TranslationY是View左上角相对的偏移量,这几个参数也是相对于父容器的坐标,并且translationX和translationY的初始值是0.
x = left + translatioX
当我们设置通过setTranslationX和setTranslationY来设置View的偏移量时候,我们可以让View进行平移。在平移过程中,top 、left表示的是原始左上角的信息,它不会因为平移而改变,这时候,改变的是x和translationX,以及y和translationY.
3.MotionEvent和TouchSlop
3.1 MotionEvent
触摸事件主要有如下几种:
- ACTION_DOWN
- ACTION_MOVE
- ACTION_UP
正常情况下, 一次手指头触摸屏幕的行为会触发一系列点击事件,考虑如下情况
- 点击屏幕后离开松开,事件序列为DOWN->UP
- 滑动为:DOWN->MOVE->MOVE ->……->MOVE->UP
3.2 TouchSlop
TouchSlop是系统能识别出的被认为是滑动的最小距离,换句话说,当手指在屏幕上滑动的时候,如此两次滑动具体太短,系统不会认为他是一个滑动。
可以通过如下获取这个常量:
ViewConfiguration.get( getContext()).getScaledTouchSlop()
这个常量,5.0中在如下文件被定义:
frameworks/base/core/res/res/values/config.xml
<!-- Base "touch slop" value used by ViewConfiguration as a
movement threshold where scrolling should begin. -->
<dimen name="config_viewConfigurationTouchSlop">8dp</dimen>
5.0以下,就是在ViewConfiguration中固定的值:
/**
* Distance a touch can wander before we think the user is scrolling in pixels
*/
private static final int TOUCH_SLOP = 16;
4.VelocityTracker和Scroller
4.1 VelocityTracker
速度追踪,用于追踪手指在滑动过程中的速度,包括水平和竖直方向的速度,它的使用过程很简单,首先在View的onTouchEvent方法中追踪当前单击事件的速度。
//从SynchronizedPoll中去取出一个速度追踪器
<span style="white-space:pre"> </span>VelocityTracker velocityTracker = VelocityTracker.obtain();
velocityTracker.addMovement( event );
接着,当我们想知道当前的滑动速度的时候,这个可以采用如下方式来获得当前的速度:
velocityTracker.compuCurrentVelocity( 1000);
int xVelocity = (int)velocityTracker.getXVelocity();
int yVelocity = (int)velocityTracker.getYVelocity();
注意:值可能为负的。
速度 = ( 终点位置 - 起点位置 ) /时间段;
当我们不再使用它的时候,需要用clear()来重置并且回收内存。
4.2 Scroller
在View中,有scrollTo和scrollBy方法,可以染给我们对控件的内容进行滑动。但是,这个滑动缺少了过渡效果。而我们是用scroller的话,就可以实现有过渡效果的滑动了。因为scroller可以把我们的滑动,分为许多次滑动,从而实现这种过渡效果。
示例代码如下:
Scroller scroller = new Scroller( mContext );
//这个方法是自己定义的 不是复写的
private void smoothScrollTo( int destX, int destY)
{
int scrollX = getScrollX();
int delta = destX - scrollX;
mScroller.startScroll( scrollX, 0 , delta 0 , 1000);
//在UI线程中执行
invalidate();
}
@override
public void compueScroll()
{
if( mScroller.computeScrollOffset())
{
scrolTo( mScroller , getCurrX(), mScorller.getCurrY());
//computeScroll可能在子线程执行,所以用这个postInvalidate方法。
postInvalidate();
}
}
11.View的基础知识
标签:
原文地址:http://blog.csdn.net/savelove911/article/details/51352594