View的基础知识

1. 什么是View
View是所有控件的基类,下到各种Button,TextView,ImageView,上到LinearLayout,RelateLayout,甚至你自定义的控件,都是继承View这个基类,所以说,View是代表着界面层的一个抽象控件。除了View,还有一种叫ViewGroup,也就是控件组。ViewGroup本身也继承了View,View可以理解为存放很多View的组合,例如,LinearLayout本身是一个View,它也是一个ViewGroup。ViewGroup里面有子View,这个子View也是一个ViewGroup。

2. View的位置参数
View的位置是由四个顶点决定,分别是top,left,right,bottom(相对于父容器)

  • top:左上角纵坐标
  • left:左上角横坐标
  • right:右下角横坐标
  • bottom:右下角纵坐标
    注意:在android等移动设备系统中,x轴和y轴的正方向分别对应右和下的方向
    通过以上属性,我们可以获取到 View 的 长度 和 宽度:
    width = right - left
    height = bottom - top
//获取一个button的 坐标 ,长度 ,宽度
int top = mViewGetCoordinate.getTop();
int left = mViewGetCoordinate.getLeft();
int right = mViewGetCoordinate.getRight();
int bottom = mViewGetCoordinate.getBottom();
int width = right - left;

Android 3.0以后,新增了 x,y,translationX, translationY这几个参数。

  • x : View 左上角的横坐标
  • y : View 左上角的纵坐标
  • translationX :View左上角横坐标相对于父容器的偏移量
  • translationY :View左上角纵坐标相对于父容器的偏移量
  • x = left - translationX
  • y = top - translationY

    这里写图片描述
    注意:View在平移的过程中,top和 left 表示的是原始左上角的位置信息,其值不会发生改变 ,此时发生改变的是x , y , translationX , translationY。

3. MotionEvent和TouchSlop
MotionEvent是手指在接触屏幕后产生的一系列事件,主要有一下几种:

 - ACTION_DOWN:手指刚接触到屏幕
 - ACTION_MOVE:手指在屏幕上移动
 - ACTION_UP:手指从屏幕上松开

从MotionEvrnt对象还可以得到点击事件发生的x和y的坐标,系统提供两组方法:

 - getX/getY:返回相对于当前View的的左上角坐标
 - geeRawX/getRawY:返回相对于手机屏幕左上角的坐标

TouchSlop是系统所能识别的=出的被认为是滑动操作的最小距离。这是一个常量,跟设备有关,可以通过以下的方式获取这个常量:

ViewConfiguration.get(getContext()).getScaledTouchSlop()

4. VelocityTracker,GuestDetector和Scroller

VelocityTracker 是速度追踪,用于追踪手指屏幕上的滑动速度,分为垂直方向的速度和竖直方向的速度。
使用过程如下:
首先:在View 的onTouchEvent方法中追踪单击事件的速度。
其次:获取当前的速度。

公式:速度 = (终点未位置 - 起点位置)/时间段

mView.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                VelocityTracker velocityTracker = new VelocityTracker.obtain();
                velocityTracker.addMovement(event);
                velocityTracker.computeCurrentVelocity(1000);
                int xVelocity = (int)velocityTracker.getXVelocity();
                int yVelocity = (int)velocityTracker.getYVelocity();
                Toast.makeText(ViewSlideSpeedActivity.this ,"滑动的水平方向的速度:" + xVelocity +
                "   " + "滑动的竖直方向的速度:" + yVelocity ,Toast.LENGTH_LONG).show();
                velocityTracker.clear();   //重置方法
                velocityTracker.recycle();  //回收方法
                return true;
            }
        });

注意:

  • velocityTracker.computeCurrentVelocity(1000)是设置计算速度的间隔时间
  • 当不需要使用时需要调用clear来重置并回收方法

GuestDetector 是手势检测,用于辅助检测单击长按,滑动,双击等行为

Scroller 是弹性滑动对象 。使用View的scrollTo/scrollBy方法进行滑动时,其过程是瞬间的,体验不好。使用Scroller 可以实现滑动的过度动画效果。

猜你喜欢

转载自blog.csdn.net/cqx13763055264/article/details/80765321