View基础知识

作者: Android天之骄子 | 来源:发表于2017-12-01 14:38 被阅读0次

View位置参数

View的位置主要由它的四个顶点来决定,即lefttoprightbottom。其中left是左上角横坐标,top左上角的纵坐标,right右下角的横坐标,bottom右下角纵坐标。这些值都是相对View的父容器说的;如图

View的位置关系图.png

获取相应坐标(相对坐标),相对于父容器的坐标。

  • getLeft()即left
  • getTop()即top
  • getRight()即right
  • getBottom()即bottom

View的自身大小

  • getWidth()=getRight() - getLeft()
  • getHight()=getBottom() - getTop()

Android3.0开始,View增加看了额外的几个参数,

  • x view发生偏移后左上角的横坐标
  • y view发生偏移后左上角的纵坐标
  • translationX 相对于父容器在X轴的偏移量(默认0)
  • translationY,相对于父容器在Y轴的偏移量(默认0)
    有如下的关系:x = left + translationX, y = top + translationY;View也提供了get/set方法,View在平移的过程中,topleft表示的原始左上角的位置信息,其值不会发生改变,改变的是XYtranslationXtranslationY

MotionEvent和TouchSlop

1.MotionEnent

在手指接触屏幕后所产生的一系列事件中,典型的事件类型有如下几种:

  • ACTION_DOWN——手指刚接触屏幕。
  • ACTION_MOVE——手指在屏幕移动。
  • ACTION_UP——手指从屏幕松开的一瞬间。
    正常情况下,一次手指接触屏幕会发生一系列点击事件,如下:
  • 点击屏幕后松开,事件序列为DOWN——UP
  • 点击屏幕滑动一段距离再松开,事件序列为DOWN——MOVE——MOVE。。。UP
    同时通过MotionEnent对象可以获取到点击位置的坐标
  • getX相对于当前View左上角的X坐标(注意不同于View.getX()),此方法属于MotionEnent对象
  • getY相对于当前View左上角的Y坐标(注意不同于View.getY()),此方法属于MotionEnent对象
  • getRawX相对于当前屏幕左上角的X坐标
  • getRawY相对于当前屏幕左上角的Y坐标

2.TouchSlop

TouchSlop是系统所能识别出最小的滑动距离,也就是说,当手指在手机屏幕上滑动的距离小于这个值,系统就不会认为是在做滑动操作。这是一个常量,和设备有关,通过如下方式即可获取到这个常量值:ViewConfiguration.get(getContext()).geetScaledTouchSlop()

    /**
     * Distance a touch can wander before we think the user is scrolling in dips.
     * Note that this value defined here is only used as a fallback by legacy/misbehaving
     * applications that do not provide a Context for determining density/configuration-dependent
     * values.
     *
     * To alter this value, see the configuration resource config_viewConfigurationTouchSlop
     * in frameworks/base/core/res/res/values/config.xml or the appropriate device resource overlay.
     * It may be appropriate to tweak this on a device-specific basis in an overlay based on
     * the characteristics of the touch panel and firmware.
     */
    private static final int TOUCH_SLOP = 8;

VelocityTracker

速度追踪,用于追踪手指在滑动过程中的速度,包括水平和竖直方向的速度,用法,首先在ViewonTouchEvent方法中追踪当前单击事件的速度:

    VelocityTracker velocityTracker = VelocityTracker.obtain();     //获取VelocityTracker实例
    velocityTracker.addMovement(motionEvent);      //对MOVE事件追踪
    velocityTracker.computeCurrentVelocity(1000);    //在响应时间内计算速度
    float xVelocity = velocityTracker.getXVelocity();    //获取X轴方向速度
    float yVelocity = velocityTracker.getYVelocity();    //获取Y方向速度

两点需要注意:

  • 获取速度之前,要先进行计算速度
  • 这里的速度是指一段时间内手指划过的像素数。
    当不使用时,需要clear来进行重置并回收。
    velocityTracker.clear();
    velocityTracker.recycle();

GestureDetector

手势检测,用于检测用户的单击、滑动、双击、长按等行为。使用如下

        new GestureDetector(this, new GestureDetector.OnGestureListener() {
            @Override
            public boolean onDown(MotionEvent motionEvent) {
                手指接触屏幕的一瞬间,由一个ACTION_DOWN触发
                return false;
            }

            @Override
            public void onShowPress(MotionEvent motionEvent) {
                手指刚接触屏幕,没有松开也没发生移动,强调的是没有松开和移动的状态
            }

            @Override
            public boolean onSingleTapUp(MotionEvent motionEvent) {  
                 手指刚接触屏幕松开,由ACTION_UP触发
                return false;
            }

            @Override
            public boolean onScroll(MotionEvent motionEvent, MotionEvent motionEvent1, float v, float v1) {
                手指按下屏幕并发生滑动,一个ACTION_DOWN和多个ACTION_MOVE触发
                return false;
            }

            @Override
            public void onLongPress(MotionEvent motionEvent) {
                长按
            }

            @Override
            public boolean onFling(MotionEvent motionEvent, MotionEvent motionEvent1, float v, float v1) {
                抛动也是快速滑动即手指按下后快速滑动后松开,由一个ACTION_DOWN、多个ACTION_MOVE和一个
                ACTION_UP触发
                return false;
            }
        })

Scroller

View的 mScrollX, mScrollY是指View的边界相对于View内容的距离

相关文章

网友评论

    本文标题:View基础知识

    本文链接:https://www.haomeiwen.com/subject/vudbbxtx.html