View|体系详解

本文详细探讨了Android中View的基础,包括坐标系、触控事件和滑动机制。讲解了View的位置参数,如坐标系的区别,以及触控事件的DOWN、MOVE、UP等阶段。此外,还介绍了View滑动的7种方法,如设置坐标、改变布局参数、使用动画等。对于事件分发机制,阐述了其重要性、主要方法和全流程,并分析了滑动冲突的处理策略,包括外部拦截法和内部拦截法。
摘要由CSDN通过智能技术生成

一、学习脑图

二、View基础

2.1 什么是View

Q1:怎么理解View

  • View是界面层的控件的一种抽象,代表了一个控件。
  • android在视觉上的呈现。
  • 是所有控件是基类,可以是单个控件View可以是一组控件ViewGroup

Q2:View的重要性?

ViewAndroid中是一个十分重要的概念,虽然说View不属于四大组件,但是它的作用堪比四大组件,在开发中,Activity承担了可视化的功能,Android提供了很多基础的控件,当我们不满足于这些基础控件的功能时,可以用自定义控件,而控件的自定义就需要对View体系有深入的了解。

2.2 View的位置参数

Android系统中,有两种坐标系,分别是Android坐标系和View坐标系。

2.2.1 Android坐标系
  • 将屏幕左上角作为坐标原点
  • 原点向右是X轴正方向
  • 原点向下是Y轴正方向

注意:使用getRawX()getRawY()方法获得的坐标是Android坐标系的坐标

2.2.2 View坐标系

Q1:View的位置由什么来决定?

四个顶点:top(左上角纵坐标)、left(左上角横坐标)、right(右下角横坐标)、bottom(右下角纵坐标)

注意:这些坐标都是相对于父容器来说的,是一种相对坐标

Top = getTop()Left = getLeft(),Right = getRight(),Bottom=getBottom()

自Anroid3.0后,增加了xytranslationXtranslationY这几个参数。

  • xyView左上角的坐标
  • translationXtranslationY:左上角相对于父容器的偏移量

注意:View在平移过程中,topleft表示原始左上角的位置信息,发生改变的值是xytranslationXtranslationY这四个参数。

Q2:getX()getY()getRawX()getRawY()有什么区别?

getXgetY是视图坐标,是相对于控件的距离

getRawXgetRawY是绝对坐标,是与整个屏幕的距离

Q3:View怎么获取自身的宽和高?

width = getRight()-getLeft() = getWidth()

height = getBottom()-getTop() = getHeight()

2.2.3 View的触控
2.2.3.1 MotionEvent

手指接触屏幕后所产生的一系列事件。

  • ACTION_DOWN —— 手指刚接触屏幕
  • ACTION_MOVE —— 手指在屏幕上移动
  • ACTION_UP —— 手指从屏幕上松开的一瞬间

正常情况下,触摸屏幕会出现以下两种情况

  • 点击屏幕后松开,DOWN -> UP
  • 点击屏幕滑动后再松开,DOWN->MOVE->…->MOVE->UP
2.2.3.2 TouchSlop

TouchSlop是系统所能识别出的被认为是滑动的最小距离,是一个常量。

Q1:怎么获取这个常量?

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

Q2:这个常量有什么意义?

在处理滑动时,可以利用这个常量来进行过滤,当两次滑动事件的滑动距离小于这个常量时,可以认为它们不是滑动。

2.2.3.3 VelocityTracker

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

Q:怎么使用VelocityTracker

1.在ViewonTouchEvent方法中追踪当前点击事件的速度

 VelocityTracker velocityTracker = VelocityTracker.obtain(); 
 velocityTracker.addMovement(event);

2.获取当前速度

  velocityTracker.computeCurrentVelocity(1000);
        int xVelocity = (int)velocityTracker.getXVelocity();
        int yVelocity = (int)velocityTracker.getYVelocity();

注意:

  • 获取速度之前需要先计算速度,即getXVelocity()getYVelocity()方法前必须先调用velocityTracker.computeCurrentVelocity(1000);

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值