Android开发进阶经验分享

View基础知识

2017-12-01  本文已影响0人  Android天之骄子

View位置参数

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

View的位置关系图.png

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

View的自身大小

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


MotionEvent和TouchSlop

1.MotionEnent

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

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方向速度

两点需要注意:

    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内容的距离

上一篇 下一篇

猜你喜欢

热点阅读