Android View 基础知识

Android View(一)——View的基础知识 目录一.View的基础知识1.什么是View2.View的位置参数3.MotionEvent4. TouchSlop5. VelocityTracker6. GestureDetector 一.View的基础知识 1.什么是View View是一种界面层的控件的一种抽象,它代表了一个控件,是Android中所有控件的基类。 2.View的位置参数 3.MotionEvent 在我们触摸屏幕的过程中,可以分为三种情况,分别是按下、滑动、弹起。Android中为我们封装好了一个MotionEvent类,使 阅读详情

我们先来看一下 Android 官方是如何介绍 View 的:

        This class represents the basic building block for user interface components. A View occupies a rectangular area on the screen and is responsible for drawing and event handling. View is the base class for widgets, which are used to create interactive UI components (buttons, text fields, etc.). The ViewGroup subclass is the base class for layouts, which are invisible containers that hold other Views (or other ViewGroups) and define their layout properties.

      大概意思是这样:这个类表示用户界面组件的基本构建块。视图在屏幕上占据一个矩形区域,负责绘图和事件处理。视图是小部件的基类,用于创建交互式 UI 组件(按钮、文本字段等),ViewGroup 类布局的基础课,它是看不见的容器持有其它 View(或其他viewgroup)并确定其布局属性。


       View 是 Android 体系中一个非常重要的概念,虽然说 View 不属于四大组件,但是它的作用确比四大组件中的 Broadcast Receiver、Content Provider 的重要性都要大,在我们的实际开发中,Activity 承载着可视化的功能,同时 Android 系统提供了很多控件,有基本的 TextView、Button 等,但是往往很多时候系统提供的控件在实际开发中并不能很好地满足我们的需求,这样就需要我们去自定义能满足需求的组件,这就要求我们对 View 的基础知识必须掌握,并且慢慢达到深入的理解,接下来我们开始介绍 View 的基础知识


一、View 是什么


       在实际开发中我们每天都在使用 View,几乎每天提到 View,那么 View 到底是什么,通过上面的官方文档我们便可见一般,View 是 Android 中所有空间的基类,不管是简单的 TextView 和 Button 还是复杂的几大常用布局 LinearLayout、RelativeLayout 或 ListView、RecyclerView,他们的基类都是 View,所以说 View 是一种界面层的控件的一种抽象,它代表了一个控件,除了 View 还有 ViewGroup,就是控件的组合,也就是说 ViewGroup 内部包含了很多个控件,即一组 View, ViewGroup 也继承于 View,这就是说 View本身就可以是单个控件,也可以是由多个控件组成的一个控件组,根据这些概念,我们现在显然能知道我们平时在开发中的 TextView、Button 是个 View, 而 LinearLayout、RelativeLayout 不但是个 View, 同样也是一个 ViewGroup 等等,以此类推,理解 View 的这种层级关系有助于我们理解 View 的工作机制


二、View 的位置参数


       View 的位置参数主要由它的四个顶点来决定,分别对应于 View 的四个属性:top、left、right、bottom,其中 top 是左上角纵坐标,left 是左上角横坐标,right 是右下角横坐标,bottom 是右下角纵坐标,需要注意的是,这些坐标都是相对于 View 的父容器来说的,因此它是一种相对坐标,View 的坐标和父容器的关系如下图所示:


根据上图我们可以得出 View 的宽度和坐标的关系:

 width = right-left
 height = bottom - top

那么如何得到 View 的这四个参数呢?在 View 的源码中它们对应于 mLeft、mRight、mTop、mBottom 这四个成员变量,获取方式如下所示:

  • Left = getLeft();
  • Right = getRight();
  • Top = getTop();
  • Bottom = getBottom();
从 Android 3.0 开始,View 增加了额外的几个参数:x、y、translationX 和 translationY,其中 x、y 是 View 左上角的坐标,而 translationX 和 translationY 是 View 左上角相对于父容器的偏移量,这几个参数也是相对于父容器的坐标,并且 translationX 和 translationY 的默认值是 0,和 View 的四个基本的位置参数一样,View 也为它们提供了 get/set 方法,这几个参数的换算关系如下所示:
  • x = left + translationX
  • y = top + translationY
View 坐标全景图:

三、MotionEvent 和 TouchSlop


MotionEvent


在手指接触屏幕后所产生的一系列事件中,典型的事件类型有如下几种:

  • ACTION_DOWN------手指刚接触屏幕
  • ACTION_MOVE------手指在屏幕上移动
  • ACTION_UP------手指从屏幕上松开的一瞬间
正常情况下,一次手指触摸屏膜的行为会触发一系列的点击事件,需要考虑如下几中情况:
  • 点击屏膜后离开松手,事件序列为 DOWN -> UP
  • 点击屏膜滑动一会儿再松开,事件序列为DOWN -> MOVE -> ...... MOVE -> UP
       上述两种情况是典型的事件序列,同时通过 MotionEvent 对象我们可以得到点击事件发生的 x 和 y 坐标,为此,系统提供了两组方法:getX/getY  和  getRawX/getRawY。它们的区别其实很简单,getX/getY 返回的是相对于当前的 View 左上角的 x 和 y 坐标,而 getRawX/getRawY 返回的是相对手机屏幕左上角的 x 和 y 坐标

TouchSlop

       TouchSlop 是系统所能识别出的被认为是滑动的最小距离,换句话说,当手指在屏幕上移动时如果滑动的距离小于这个常量,那么系统就认为你不是在进行滑动操作,原因很简单,滑动的距离太短,体统认为它不是在滑动,这是一个常量,和设备有关,在不同的设备上这个值可能是不同的,通过如下方式获取这个常量:
ViewConfiguration.get(getContext().getScaledTouchSlop())。那么这个常量有什么意义呢?当我们在处理滑动时,可以利用这个常量来做一些过滤,比如当两次滑动事件的滑动距离小于这个值,我们就可以认为没有达到滑动距离的要求,因此就可以认为它没有滑动,这样做有更好的用户体验


四、VelocityTracker、GestureDetector

VelocityTracker

速度追踪,用于追踪手指在滑动过程中的速度,包括水平和竖直方向的速度,它的使用过程比较简单,首先在 View 的 onTouchEvent 方法中追踪当前单击事件的速度:
VelocityTracker velocityTracker = VelocityTracker.obtain();
velocityTracker.addMovement(event);
接着,当我们想知道当前的滑动速度时,这个时候可以采用如下方法来获得当前的速度:
velocityTracker.computeCurrentVelocity(1000);
int xVelocity = (int) velocityTracker.getXVelocity();
int yVelocity = (int) velocityTracker.getYVelocity();

在这一步中有两点需要注意:

第一点:获取速度之前必须先计算速度,即 getXVelocity 和 getYVelocity 这两个方法的前面必须要调用 computeCurrentVelocity() 方法
 
第二点:这里的速度是指一段时间内手指所划过的像素数,比如将时间间隔设为 1000ms 时,在 1s 内,手指在水平方向从左向右滑过100 像素,那么水平速度就是 100,注意速度可以为负数,当手指从右往左滑动时,水平方向速度即为负值,这个需要理解一下,速度的计算可以用如下公式来表示:
  • 速度 =(终点位置 - 起点位置)/ 时间段
       根据上面的公式再加上 Android 系统的坐标,可以知道,手指逆着坐标系的正方向滑动,所产生的速度就为负值,另外,computeCurrentVelocity() 这个方法的参数表示的是一个单元时间或者说时间间隔,它的单位是毫秒(ms),计算速度时得到的速度就是在这个时间间隔内手指在水平或竖直方向上所滑动的像素数,针对上面的例子,如果我们通过
velocityTracker.computeCurrentVelocity(100) 来获取速度,那么得到的速度就是手指在 100ms 内所滑过的像素数,因此水平速度就成了 10 像素/每 100ms,即水平速度为 10

最后,当不需要使用它的时候,需要调用 clear() 方法来重置并回收内存:
velocityTracker.clear();
velocityTracker.recycle();
上面就是如何使用 VelocityTrackr 对象的全过程

GestureDetector

手势测试,用于辅助用户的单击、滑动、长按、双击等行为,参考过程如下:
首先,需要创建一个 GestureDetector 对象并实现 OnGestureListener 接口,根据需要我们还可以实现 OnDoubleTapListener 从而能够监听双击行为:

 GestureDetector mGestureDetector = new GestureDetector(this);
 //解决长按屏膜后无法拖动现象
 mGestureDetector.setIsLongpressEnabled(false);

接着
,接管目标 View 的 onTouchEvent() 方法,在监听 View 的 onTouchEvent() 方法中添加如下实现:

boolean consume =  mGestureDetector.onTouchEvent(event);
return consume;

       做完上面两步,我们就可以有选择的实现 OnGestureListener 和 OnDoubleTapListener 中的方法了,OnGestureListener 和 OnDoubleTapListener 这两个接口的方法中比较常用的有:
  • onSingleTapUp() ---- 单击
  • onFling() ---- 快速滑动
  • onScroll() ---- 拖动
  • onLongPress() ---- 长按
  • onDoubleTop() ---- 双击
       另外需要说明的是在实际开发中可以不使用 GestureDetector,完全可以自己在 View 的 onTouchEvent 方法中实现所需要的监听,这里建议:如果只是监听滑动相关的,建议自己在 onTouchEvent 方法中实现,如果要监听双击这种行为的话,那么就使用 GestureDetector



安卓基础知识之View篇(一):View 必须要知道的基础知识 安卓基础知识系列旨在简明扼要地提供面试或工作中常用的基础知识,让对安卓还不太熟悉的小伙伴更快地入门。同时自己在工作中,也没法完全记住所有的基础细节,写这样的系列文章,可以让自己形成一个更完备的知识体系,同时给自己日后留个知识参考。 开始的开始 View 是除了安卓四大组件以外用的最多的控件,我们需要利用 Android 内置的 View 控件(TextView、LinearLayout等)完成业务需求,有时甚至需要自定义控件来满足特殊的业务需求。View 还负责与用户的交互(点击、滑动、长按等操作),掌. 阅读详情

相关推荐

Android View系列一: View基础知识

1.什么是ViewView是Android中所有控件的基类,是一种界面层的控件的一种抽象,它代表了一个控件,除了View,还有ViewGroup(控件组),ViewGroup内部包含了许多控件,即一组View.ViewGroup继承View.2.View的位置参数View的位置由四个顶点决定:top left right bottom top:是左上角纵坐标. left:是左上角横坐标. ri

姚佳伟 6124

View类详解(自定义view二)

Class Overview This class represents the basic building block for user interface components. A View occupies a rectangular area on the screen and is responsible for drawing and event handling. View

黑色的记忆 chester, come on 1794

Android自定义View系列之理论基础知识

一、坐标系(屏幕坐标系和布局坐标系) 在Android坐标系中,以屏幕左上角作为原点,这个原点向右是X轴的正轴,向下是Y轴正轴,所以开发中调用方法的时候就有了以屏幕上边和左边为参考值,有了参考值你才好定位呀。 除了上面说的Android坐标系,到了View布局的时候有布局坐标系(也称View坐标系,但这种坐标系是相对的,因为Android中的View/ViewGroup是嵌套存在),布局坐标的关系如下图 上图中最里层是一个View(如TextView/Button/ImageView....

sunbinkang的博客 714

android自定义View之(二)------简单进度条显示样例篇

1.View的说明     View的官方文档解释为:     This class represents the basic building block for user interface components. A View occupies a rectangular area on the screen and is responsible for drawing and even

hfreeman2008的专栏 1751

Android-高级-UI-进阶之路-(一)-View-的基础知识你必须知道

在介绍 View 的基础知识之前,我们需要知道它到底是什么?View 在 Android 中是所有控件的基类(结构参考上图),不管是简单的 TextView , 还是复杂的 ViewGroup 、 CustomView 亦或者 RecyclerView 它们的共同顶级父类都是 View, 所以说, View 是一种界面层控制的一种抽象,它代表的是一个控件。从上图可知 ViewGroup 是 View 的子类,ViewGroup 在视图层它可以有任意子 View。

2401_84132381的博客 817

【液晶专题】从外挂到In-Cell/ On-Cell/ OGS再也不会傻傻分不清楚了

触控技术经历了从外挂式到内嵌式的革新,主要方案包括外挂式(Out-Cell)、OGS、On-Cell和In-Cell。

一点硬件 1252

Android中尺寸单位杂谈

<br />讲解一<br />在android系统中单位DP也就是DIP:device independent pixels(设备独立像素). <br />dip : device independent pixels(设备独立像素). 不同设备有不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGA、HVGA和     QVGA 推荐使用这个,不依赖像素。    <br /> <br /><br /><br />px : pixels(像素). 不同设备显示效果相同,一般我们HVGA代表320x48

muyu114的专栏 8419

vivado下ECO操作-不重新综合实现修改属性并生成.bit

ECO即engineer change order,即工程变更指令,可以对设计做局部小改动并只对改动部分重新布局布线并生成.bit。在一个工程动辄编译几个小时情况下,可以在调试中节省大量时间。比如我们在调试中,需要改变时钟占空比或者相位,需要改变寄存器初值等等,此时用ECO暂时改动,待验证后在重新编译无疑是最有效率的方法。 实现ECO通常有两种方式,一是通过vivado界面完成,另一种方法就是tcl脚本。所有的ECO操作都可以通过tcl操作完成,有的操作用vivado界面无法完成,只能通过tcl。以下主要

4657

Android :安卓学习笔记之 Android View 的基础知识和冲突事件处理

Android View的简单理解和使用Android View1、View的基础知识1.1 什么是View1.2 View的位置参数1.3 MotionEvent和TouchSlop1.3.1. MotionEvent1.3.2.TouchSlop1.4 VelocityTracker、GestureDetector和Scroller1.4.1 VelocityTracker:速度追踪1.4.2 GestureDetector:手势检测1.4.3 Scroller:弹性滑动对象2、View的滑动2.1 使

JMW1407的博客 891

WhatsApp协议算法

我想其实有很多人还不太了WhatsApp群控,简单来说,它和我们常使用的微信聊天软件是类似的,只不过它是基于通讯录的,操作起来比较简单便捷,所以现在有很多国家都喜欢用WhatsApp。一般情况下,筛号不会造成账号被封的情况,但是呢,如果筛号的频率太快,就会被系统限制筛号能力,不再返回筛号结果,所以,筛号数量和速度一定要控制好。前天逛街突然灵光一现,为什么不试试多路访问呢,简单来说就是信道复用技术,马上跑回家,调取接口,接入通道,导入已经转换成协议的账号,成功登录!

2403_87755661的博客 1943

RK3568 Android12预置APK的三种模式详解:不可卸载、可卸载与永久删除

本文深入解析RK3568 Android12系统中APK预置的三种模式:不可卸载、可卸载与永久删除,详细介绍了每种模式的技术实现、应用场景及实战案例。针对Rockchip平台特性,提供从目录创建到系统编译的完整指南,帮助开发者根据产品需求选择最佳预置方案,并解决常见问题。

k8s6orchestrator的博客 967

【Android】View 的基础知识

简单介绍了 Android 中 View 的基础知识

LiuYaoheng的博客 781

告别游戏卡关!用Cheat Engine 7.5修改单机游戏数据的保姆级教程(附Tutorial靶场练习)

本文提供了一份详细的Cheat Engine 7.5使用教程,帮助玩家轻松修改单机游戏数据。从基础操作到高级技巧,包括精确值扫描、模糊扫描、指针扫描和代码注入,教程还涵盖了《植物大战僵尸》和《星露谷物语》的实战案例,确保玩家能够安全、高效地优化游戏体验。

weixin_30082367的博客 784

【Android】View—基础知识,滑动,弹性滑动

在 Android 中,View是用户界面(UI)中的基本组件,用于绘制图形和处理用户交互。所有的 UI 组件(如按钮、文本框、图片等)都是View的子类。可以说,View是构建 Android 应用界面的基础。View是一种界面层的控件的一种抽象,它代表了一个控件。除了View还有ViewGroup,里面包含了许多个控件,即一组View。在Android设计中,ViewGroup也继承了View,也就意味着View本身可以是单个控件也可以是由多个控件组成的一组控件。

2301_79977698的博客 1395

【STABLE_BASELINE3】强化学习算法实战:模型的保存,读取,再训练

STABLE-BASELINE3,模型读取,再训练:有时候需要在已经训练好的模型基础上进行再次训练。

Kiek17的博客 4868

Bode图、ABCD矩阵与EET结合:三步搞定复杂电路传递函数分析

在模拟电路与电源控制设计中,传递函数和频率响应是衡量系统稳定性的核心指标。Bode图以直观的幅频/相频曲线揭示带宽与相位裕度,ABCD二端口矩阵可将级联网络结构化表达,而EET额外元素定理则针对寄生电容、负载效应等局部修正提供显式公式。三者互补,组合成一套从整体拓扑到局部寄生修正的完整分析方法:先用ABCD搭建主体网络,再用EET快速加入额外元件,最后用Bode图验证传递函数和稳定裕度。该方法适用于滤波器设计、电源环路补偿、运放稳定性分析等线性小信号场景,支持Python/SciPy和SPICE交叉验证,显

weixin_32496547的博客 363

Android高级UI进阶之路(一) —— View的基础知识

View 可以说是在日常开发中,天天使用的角色,虽然说 View 不属于四大组件,但是它的作用跟重要程度你真不可小视。该类型的文章打算写一个系列,对于自己复习或新手学习提供一个方式。更多Android系列教程上传在GitHub:在介绍 View 的基础知识之前,我们需要知道它到底是什么?

金戈鐡馬 1162

计算数列位置N的值

本文介绍了一个数列生成问题,要求根据输入的两个整数M和N生成特定规则的数列,并输出第N个位置上的数值。数列生成规则为:前M个元素为1到M;后续元素根据前M个元素是否重复来决定计算方式(求和或求差)。文章提供了C++、Java和Python三种语言的实现方案,均包含输入处理、数列初始化、循环计算和结果输出等步骤。各语言实现中均使用集合去重特性判断重复元素,并通过内置函数或自定义方法求取最大值和最小值。该问题主要考察基础编程能力,包括数组/列表操作、最值计算和重复元素判断等基本编程技巧。

面试高手的博客 655

Android——View基础知识

View是Android中所用控件的基类,是一种界面层控件的一种抽象,除了View还有ViewGroup。在Android的设计中,ViewGroup继承View,及View本身可以是单个控件也可以是多个控件组成的一组控件,通过这种关系就形成了View树的结构。

qq_53092981的博客 2080

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Android-View事件体系之View的基础知识

Android-View事件体系之View的基础知识View虽然不是四大组建,但是其作用却不属于四大组建,甚至凌驾于ContentProvider和BroadcastReceiver之上。所以从这节开始讲解一下View的相关知识。View的基础知识什么是ViewView是Android中所有控件的基类,所以View是一种界面层的控件的一种抽象,它代表了一个控件。除了View,还有一个ViewGrou

欧阳帆的专栏 418

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Android View学习笔记(一):View基础知识

一、简介  在安卓中,View代表视图,是安卓中十分重要的一个概念,重要程度不亚于四大组件,用户每时每刻都在与View打交道,包括展示数据、事件传递等。因此,熟练掌握View的应用以及原理是Android进阶的必经之路。最近笔者在学习任玉刚著的《Android 开发艺术探索》中的View的相关知识,便把学习心得及总结记录下来,与大家交流学习。二、View的定义  引用官方文档的描述:A View o

蓝天白云梦的csdn博客 2645

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

【Android】view的基础知识

的平移滑动效果,是一种较为灵活且常用的方式。这种方法不仅可以控制滑动的距离和方向,还能够调整滑动的速度、加速度等效果,让动画更流畅和自然。是 Android 中的 UI 组件的基类,代表了用户界面上的一个可视元素。LayoutParams用于保存一个view的布局参数,我们可以通过改变view的布局参数来改变位置。可以直接对 View 的属性进行动画操作,是另一种实现弹性滑动效果的方式。是 Android 提供的一个辅助类,用于实现 View 的平滑滑动。的初始位置的偏移量,单位是像素。

Patrick_yuxuan的博客 1322

Android 从0开始自定义控件之 View 基础知识与概念(一)

> 转载请标明出处: [http://blog.youkuaiyun.com/airsaid/article/details/53057091](http://blog.youkuaiyun.com/airsaid/article/details/53057091) > 本文出自:[周游的博客](http://blog.youkuaiyun.com/airsaid) [TOC] #前言 自定义View可以说是Android路

Airsaid 7890

Android开发艺术探索知识回顾——第3章 View的事件体系:1、View的基础知识

第3章 View的事件体系 本章将介绍Android中十分重要的一个概念:View,虽然说View不属于四大组件,但是它的作用堪比四大组件,甚至比Receiver和Provider的重要性都要大。在Android开发中,Activity承担这可视化的功能,同时Android系统提供了很多基础控件,常见的有Button, TextView, CheckBox等。 很多时候仅仅使用系统提供的控件是不能满足需求的,因此我们就需要能够根据需求进行新控件的定义,而控件的自定义就需要对Andr...

鲁迷那的专栏—坚持实践后再写出来! 356

Android自定义view之基础知识

Android自定义view之基础知识 虽然Android已经自带了很多实用的view和layout,加以调教能实现很美观的界面,但是有一些情况下,需要实现特殊的界面效果,比如我们比较熟悉的各种播放器的滑动条环节音量的界面,不同的音量对应不同的格数,但是不必要为每个格都单独开辟一个ImageView,如果只使用一个ImageView,那么又需要准备很多的图片,这样显然是不划算的,这个时候就需要自

zuguorui的专栏 967

Android View的基础知识

Android View的事件体系view的基本属性一些杂乱的API获取手指移动的速度 view的基本属性 top bottom left right 一些杂乱的API 获取手指移动的速度 VelocityTracker tracker = VelocityTracker.obtain(); tracker.addMovement(event);//event是MotionEv...

闪闪的小黑的博客 321
上一篇: Android 使用 Gradle 统一配置依赖管理
下一篇: Android 数据存储方案
QDJdeveloper
博客等级 码龄11年 108粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值