11.View的基础知识

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();
        }
    }


猜你喜欢

转载自blog.csdn.net/savelove911/article/details/51352594