美文网首页
Android 开发艺术探索笔记(八) 之 View 的基础知识

Android 开发艺术探索笔记(八) 之 View 的基础知识

作者: innovatorCL | 来源:发表于2018-02-28 07:38 被阅读13次

在我们了解 View 的知识体系之前,我们先来学习一下 View 的基础知识吧。

1.什么是 View ?

View 是 Android 中所有控件的基类,ViewGroup 也是继承 View 的,也就是 View 本身可以是单个控件也可以是多个控件组成的一组控件。

2.View 的位置参数

View 的位置主要由它的四个顶点决定,分别对应属性的:topleftrightbottom(就是左上右下)。这些坐标全部都是相对于 View 的父容器来说的,是一种相对坐标。获取这些坐标的方法如下:

left = getLeft();

top = getTop();

right = getRight();

bottom = getBottom();

还有 4 个 属性比较重要:xytranslationXtranslationYxy 代表 View 左上角的坐标(同样是相对于父容器的),translationXtranslationY 表示 View 显示相对于初始位置的偏移。

在没有发生平移的时候,默认为 0,此刻 x == left,y == top;但是发生平移后,View 的 lefttop 属性不会改变,代表初始位置的左上角,translationXtranslationY 会发生改变,此时
x = left + translationX,y = top + translationY
理解这些对于后面理解动画很有帮助。

3.MotionEvent 和 TouchSlop

  • MotionEvent

手指接触屏幕后会生成一个触摸事件 MotionEvent,事件的类型如下:

ACTION_DOWN 手指刚接触屏幕

ACTION_MOVE 手指在屏幕上移动

ACTION_UP 手指从屏幕上松开的一瞬间

MotionEvent对象能让我们获取点击位置的 x 和 y 坐标,通过 getX()/getY() 可以获取点击位置相对当前 View 的相对坐标,而 getRawX()/getRawY() 则是获取点击位置在屏幕中的绝对位置。

View坐标体系.png
  • TouchSlop

Android 系统中认为滑动最小的距离,当滑动的距离大于这个常量时才认为产生了滑动。通过 ViewConfiguration.get(getContext()).getScaledTouchSlop() 获取。

4.VelocityTracker 、GestureDetector 和 Scroller

  • VelocityTracker

速度追踪,用于追踪手指在滑动过程中的速度,包括水平和竖直方向的速度。如下使用:

VelocityTracker va = VelocityTracker.obtain();
                va.addMovement(event);
                va.computeCurrentVelocity(1000);
                int xVelocity = (int)va.getXVelocity();
                int yVelocity = (int)va.getYVelocity();
                va.clear();
                va.recycle();

这个表示在 1000 ms 手指从左往右滑过的像素数,顺着 Android 坐标系的速度就是整数,逆着就是负数。

  • GestureDetector

手势检测,用于辅助检测用户单击、长按、滑动、双击等行为,一般实现 OnDoubleTabListener 接口监听用户的双击行为。

  • Scroller

弹性滑动对象,用于实现 View 的弹性滑动。在 View 中典型使用代码如下:

Scroller scroller = new Scroller(mContext);

    /**
     * 缓慢滚动到指定位置
     * @param destX
     * @param destY
     */
    private void smoothScrollTo(int destX,int destY){
        int scrollX = getScrollX();
        int delta = destX - scrollX;
        //1000 ms 内滑向 destX,效果就是慢慢滑动
        scroller.startScroll(scrollX,0,delta,0,1000);
        invalidate();
    }
    
    @Override
    public void computeScroll(){
        if(scroller.computeScrollOffset()){
            scrollTo(scroller.getCurrX(),scroller.getCurrY());
            postInvalidate();
        }
    }

相关文章

网友评论

      本文标题:Android 开发艺术探索笔记(八) 之 View 的基础知识

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