Android自定义Viewandroid的进阶

View的基础知识

2016-11-13  本文已影响335人  郭少_

一、什么是View

Android中,控件大致可分为两大类,即View与ViewGroup。View是Android中所有控件的基类,是控件的一种抽象。ViewGroup即控件组,可以把它看作一个容器,因为它可以包含多个View及ViewGroup。通过ViewGroup,整个界面上的控件形成了一个树形结构,也就是我们常说的控件树。

二、Android中的坐标系

根据参考对象的不同,Android中存在两个坐标系。一个是Android坐标系,一个是视图坐标系,两者的区别在于坐标原点的选取。坐标系的单位长度是1px。

android中的坐标系.png
1. Android坐标系

Android坐标系的坐标原点是手机屏幕左上角,向右为X轴正方向,向下为Y轴正方向。方法getRawX()和getRawY()获得的坐标就是此坐标系中的坐标。

2. 视图坐标系

视图坐标系的坐标原点是父控件的左上角,向右为X轴正方向,向下为Y轴正方向。其实大多数与位置有关的参数都是视图坐标系中的坐标点。

三、位置参数与方法

位置参数与方法繁多,但这些都是必须掌握的,是触摸事件、滑动控件的基础。学习这些参数、方法最有效的方式就是自己打Log,根据Log信息去分析方法的含义。


位置参数方法.png

note:这几个方法获取的是视图坐标值。它们只与view初始摆放位置有关,也就是说在移动控件的过程中,这些方法的返回值是不会随控件的位置改变的,除非认为修改了它们的值,如修改了margin值。

note:前两个方法获取的坐标值是视图坐标值。你可以将触控点理解为当前view中的内容,那么它的父控件就是当前view。
后两个方法获取的坐标值是绝对坐标值。这四个方法通常用来计算偏移量。

四、MotionEvent——触控事件

MotionEvent即触控事件,典型触控事件有如下几种:

通常情况下,我们会在onTouchEvent(MotionEvent event)方法中通过event.getAction()方法获取触控事件的类型,并使用switch语句筛选,模板代码如下:

  public boolean onTouchEvent(MotionEvent event){
  //获取当前输入点的坐标
      int x=(int)event.getX();
      int y=(int)event.getY();
      switch(event.getAction()){
          case MotionEvent.ACTION_DOWN:
          .....//处理按下事件
          break;
          case MotionEvent.ACTION_MOVE:
          .......//处理移动事件
          break;
          case MotionEvent.ACTION_UP:
          .......//处理抬起事件
          break;
        }
        return true;
      }

五、TouchSlop——最小滑动距离

TouchSlop即最小滑动距离,当你两次滑动之间的距离差小于这个常量(这个常量和设备有关)时,系统不认为你进行了滑动操作,这样我们可以使应用具有更好的用户体验。
可以通过如下方法获得这个值:

ViewConfigration.get(getContext()).getScaledTouchSlop();

同样,你也可以在源码中找到这个常量的定义:

Path:frameworks/base/core/res/res/values/config.xml
<dimen name="config_viewConfigrationTouchSlop">

六、VelocityTracker——速度追踪器

速度追踪器,用它可以监测手指水平竖直滑动速度。使用步骤:

  1. 关联触摸事件
    VelocityTracker velocityTracker=VelocityTracker.obtain();
    velocityTracker.addMovement(event);
  2. 计算速度
    velocityTracker.computeCurrentVelocity(1000);
    //这里的参数是指“时间间隔”,速度=(终点-起点)/时间段,由此可知我们计算的速度是平均速度,速度可正可负,单位为像素/秒或者像素/毫秒。
  3. 获取速度(获取之前必须先计算)
    int xVelocity=(int)velocityTracker.getXVelocity();
    int yVelocity=(int)velocityTracker.getYVeloctiy();
  4. 重置并回收
    velocityTracker.clear();
    velocityTracker.recycle();

七、GestureDetector——手势监测器

手势监测,顾名思义,用于监测用户单击,滑动,长按,双击等行为。步骤如下:

  1. 创建GestureDetector对象,实现OnGestureListener接口
    GestureDetector mGestureDetector=new GestureDetector(this);
  2. 接管目标view的onTouchEvent方法
    boolean consume=mGestureDetector.onTouchEvent(event);
    return consume;
  3. 有选择的实现OnGestureListener和OnDoubleTapListener中的方法,这两个接口中有各种各样的诸如,单击,双击,长按,严格单击等等方法。这里不一一列出,可去查看相关文档。

建议:如果只是监听滑动相关的事件,使用onTouchEvent方法,如果监听双击事件,使用GestureDetector实现。

结语

基础知识先写到这里,本人也是一个初学者,未免出现对知识点理解不全面的情况,有问题可留言,希望能与大家互相讨论,共同学习。
转载请注明出处http://www.jianshu.com/p/b600895c585b 谢谢。

上一篇 下一篇

猜你喜欢

热点阅读