Android View 的事件体系(一) Android群英传/开发艺术探索笔记

原创 2018年04月17日 15:29:13

Android 中的坐标视图体系
1、Android 坐标系:

    系统提供了 getLocationOnScreen(int location[ ]) 这样的方法来获取 Android 坐标系中点的坐标,等效于在触摸事件中使用 getRawX() 、getRawY()方法,获取的是绝对坐标,坐标原点是屏幕的左上角


2、视图坐标系:

        在触摸事件中,通过getX()、getY()来获取坐标位置,坐标原点是以父视图左上角为坐标原点。



3、触摸事件(MotionEvent):
MotionEcent中封装了以下触摸事件的不同类型常量
    //单点触摸按下动作
    public static final int ACTION_DOWN             = 0;

    //单点触摸离开动作
    public static final int ACTION_UP               = 1;

    //触摸点移动操作
    public static final int ACTION_MOVE             = 2;

    //触摸动作取消
    public static final int ACTION_CANCEL           = 3;

    //触摸动作超出边界
    public static final int ACTION_OUTSIDE          = 4;

    //多点触摸按下动作
    public static final int ACTION_POINTER_DOWN     = 5;

    //多点离开动作
    public static final int ACTION_POINTER_UP       = 6;

4、View提供的获取坐标方法(相对父容器的)
getTop():获取到的是View自身的顶边到其父布局顶边的距离
getLeft():获取到的是View自身的左边到其父布局顶边的距离
getRight():获取到的是View自身的右边到其父布局顶边的距离
getBottom():获取到的是View自身的底边到其父布局顶边的距离

5、MotionEvent 提供的方法:
getX():获取点击事件距离控件左边的距离,即视图坐标(相对父容器的)
getY():获取点击事件距离控件顶边的距离,即视图坐标(相对父容器的)
getRawX():获取点击事件距离整个屏幕左边的距离,即绝对坐标(相对屏幕的)
getRawY():获取点击事件距离整个屏幕顶边的距离,即绝对坐标(相对屏幕的)

从上我们能够的出 View 的宽高和坐标的关系:
width = right - left;
height = bottom - top;

这四个参数可从以下方式获取:
left = getLeft();
right = getRitht;
top = getTop;
bottom = getBottom;

从Android3.0开始,另外还有几个参数:x、y、translationX 和 translationY。
x、y是VIew左上角的坐标,translationX 和 translationY 是View左上角相对于父容器的偏移量。默认为0。
且 x = left + translationX,y = top + translationY

就是说在View平移的过程中,top、left、right、button这四个值是不会变化的,是原始位置,变化的是x、y、translationX 和 translationY这四个参数。


6、TouchSlop 系统能识别的最小滑动距离(一般为8dp,因设备而不同),可过滤一些滑动操作

获取方式:ViewConfiguration.get(getContext()).getScaledTouchSlop()

其中的get是为了获取一个ViewConfiguration类型的对象,然后这个对象再调用getScaledTouchSlop方法。

而它的默认值是定义在这里的:

里面的config.xml中:

<!-- Base "touch slop" value used by ViewConfiguration as a  
     movement threshold where scrolling should begin. -->  
<dimen name="config_viewConfigurationTouchSlop">8dp</dimen>  

Android 控件架构

概念:
        Android中所有控件在界面中占得位置均是矩形,分为ViewGroupView,通过ViewGoup使整个界面形成了一个树形结构,由上层控件负责下层子控件的测量和绘制,并传递交互事件。每棵树控件的顶部,都有一个ViewParent对象,是整颗树的核心,所有交互管理事件都是由它来统一调度和分配,从而可以对整个视图进行整体控制

Android 控件继承结构图:



Android 控件树结构图:


ViewGoup:可包含多个子控件,并管理其包含的子控件
ViewParent:控件树的核心,调度和分配所有的交互管理事件

Android界面架构图:


由上图可看出,每个Activity中都包含一个Window对象,在Android中Wiondw对象通常由PhoneWindow来实现。

PhoneWindow将一个DecorView设置为整个应用窗口的根View,是Window的具体继承实现类。而且该类内部包含了一个
DecorView对象,该DectorView对象是所有应用窗口(Activity界面)的根View。显示具体的界面内容

DecorView:窗口界面的顶层视图,里面封装了一些窗口操作的通用方法,其把将要显示的具体内容呈现在了PhoneWindow上,在此所有的View的事件监听,都通过WindowManagerService(窗口管理服务,所有需要显示到屏幕上的内容,都是通过WMS 来操控的,可见设计模式中的Builder 模式和点击打开链接)来进行接收,并通过Activity对象来回调相应的onClickListener。

依据面向对象从抽象到具体我们可以类比上面关系就像如下:
Window是一块电子屏,PhoneWindow是一块手机电子屏,DecorView就是电子屏要显示的内容,Activity就是手机电子屏安装位置。

在显示上,DecorView将屏幕分为TitleViewContentView两部分。
ContentView:一个ID为content的FrameLayoutactivity_main.xml就是设置在这样一个FramLayout中的。

DocrView标准视图树:



        视图树的第二层装载了一个LinearLayout,作为ViewGroup,这一层的布局结构会根据对应的参数设置不同的布局,如最常用的布局--上面显示TitleBar下面是Content这样的布局,也就是上图的布局。
        如果用户通过设置requestWindowFeature(Window.FEATURE_NO_TITLE)来设置全屏显示,视图树中就只有Content了,
所以requestWindowFeature() 方法一定要在调用setContentView()方法之前。

  • 在代码中,当程序在onCreat()法中调用setContentView()方法后,ActivityManagerService会回调 onResume()方法,此时系统会把整个 DocrView添加到 PhoneWindow中,并让其显示出来。
全屏显示:通过设置requestWindowFeature(Window.FEATURE_NO_TITLE)来设置全屏显示,视图树中就只有Content了,所以requestWindowFeature()方法一定要在调用setContentView()方法之前。
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/daxiong25/article/details/79973625

《Android开发艺术探索》——View的事件体系

一、view基础知识 什么是View (1)View是Android中所有控件的基类,不管是简单的Button和TextView还是复杂的RelativeLayout和ListView,它们的共同基类...
  • ilsla
  • ilsla
  • 2016-03-07 15:08:45
  • 808

读《Android群英传》的一些感想

朋友,你或许也有这样的困扰,做Android开发一两年之后,发现很多基础的东西虽然都知道,但是却无法融会贯通灵活的运用。能独立的开发APP,但使用的大多都是第三方开源的框架或者是在网上搜到的代码实现,...
  • finddreams
  • finddreams
  • 2015-10-15 13:21:29
  • 5780

Android开发艺术探索——新的征程,程序人生路漫漫!

第1章 Activity的生命周期和启动模式 / 1 1.1 Activity的生命周期全面分析 / 1 1.1.1 典型情况下的生命周期分析 / 2 1.1.2 异常情况下的生命周期分析 / ...
  • qq_26787115
  • qq_26787115
  • 2016-05-04 21:38:08
  • 2802

一个规范的自定义View——Android开发艺术探索笔记

如何定义一个规范的自定义View
  • L664675249
  • L664675249
  • 2016-03-03 13:58:08
  • 2194

Android中View的事件分发机制——Android开发艺术探索笔记

点击事件的事件分发就是对MotionEvent事件的分发过程,当一个MotionEvent产生了以后,系统需要把这个事件传递给一个具体的View,而这个传递的过程就是分发的过程。...
  • L664675249
  • L664675249
  • 2016-02-25 15:32:10
  • 3091

Android艺术开发探索第三章————View的事件体系(下)

Android艺术开发探索第三章————View的事件体系(下) 在这里就能学习到很多,主要还是对View的事件分发做一个体系的了解 一.View的事件分发 上篇大致的说了一下View的基础知...
  • qq_26787115
  • qq_26787115
  • 2016-11-05 21:13:31
  • 3754

Android开发艺术探索读书笔记(二)-跨进程通信

在Androi系统中,为了对内存有一个统一的优化管理,通常对每个进程所能使用的最大内存做出限制。而在开发大型应用程序或者游戏的时候,为了获得更多的内存来支持程序的运行。往往需要在应用中开启多个线程来取...
  • dengminghli
  • dengminghli
  • 2017-02-05 22:04:51
  • 852

彻底理解View事件体系!

View的事件体系整体上理解还是比较简单的,但是却有很多细节。这些细节很容易忘记,本文的目标是理解性的记忆,争取做到看完不忘。最近在复习,希望本文能对你也有所帮助。如果你已经对View事件体系有一定的...
  • huachao1001
  • huachao1001
  • 2016-06-27 14:18:02
  • 4353

Android-View的事件体系

一、View基础知识 1、什么是View: View是一种界面层的控件的一种抽象,它代表了一个控件。 ViewGroup为控件组。 View中也可以包含多个控件,形成控件树。 ...
  • shandian000
  • shandian000
  • 2017-01-17 17:00:39
  • 212

Android群英传-自定义View、控件

注意点 绘制View的显示内容,需要重写onDraw()方法 该View若要使用wrap_content属性,必须重写onMeasure()方法 通过自定义attrs属性,还可以设置新的属性配置值 V...
  • feather_wch
  • feather_wch
  • 2016-08-17 11:14:22
  • 585
收藏助手
不良信息举报
您举报文章:Android View 的事件体系(一) Android群英传/开发艺术探索笔记
举报原因:
原因补充:

(最多只允许输入30个字)