【Android】View 的基础知识

1. 什么是 View?

View 是 Android 中所有UI组件的基础类。它表示屏幕上的一个矩形区域,负责绘制内容和处理用户交互事件。所有的 UI 组件(如按钮、文本框等)都是 View 的子类,而 ViewGroup 是一种特殊的 View,它可以包含其他 View 或 ViewGroup,用于定义布局结构。View 的主要功能包括绘制内容、响应用户事件以及与父容器的交互。它可以显示文本、图片、视频等内容,并处理触摸、点击等操作。

2. View 的位置参数

View的位置主要由四个参数决定,这些参数都是相对其父容器的坐标:

  • left:View左边到父容器左边的距离
  • top:View顶部到父容器顶部的距离
  • right:View右边到父容器左边的距离
  • bottom:View底部到父容器顶部的距离

在Android中,x轴和y轴的正方向分别为右和下。

获取View宽高的方法:

// 获取View的宽度
int width = view.getRight() - view.getLeft();
// 或者使用简便方法
int width = view.getWidth();// 获取View的高度
int height = view.getBottom() - view.getTop();
// 或者使用简便方法
int height = view.getHeight();

从Android 3.0开始,View增加了额外的参数:

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

它们之间的关系为:

x = left + translationX
y = top + translationY

3. MotionEvent 和 TouchSlop

3.1 MotionEvent

MotionEvent是触摸事件类,包含了触摸动作、位置等信息。常见的触摸事件类型包括:

  • ACTION_DOWN:手指按下屏幕
  • ACTION_MOVE:手指在屏幕上移动
  • ACTION_UP:手指从屏幕抬起
  • ACTION_CANCEL:触摸事件被取消

获取触摸点坐标的方法:

@Override
public boolean onTouchEvent(MotionEvent event) {// 获取相对于当前View的x坐标float x = event.getX();// 获取相对于当前View的y坐标float y = event.getY();// 获取相对于屏幕的原始坐标float rawX = event.getRawX();float rawY = event.getRawY();return true;
}

3.2 TouchSlop

TouchSlop是系统识别的被认为滑动的最小距离,小于这个距离的移动不会被识别为滑动。这个常量由设备制造商定义,不同设备可能不同。

获取TouchSlop的方法:

ViewConfiguration.get(context).getScaledTouchSlop()

在实际开发中,处理滑动时应考虑TouchSlop,以避免过于敏感的滑动检测:

private int mTouchSlop;
private float mLastX;public MyView(Context context) {super(context);mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
}@Override
public boolean onTouchEvent(MotionEvent event) {float x = event.getX();switch (event.getAction()) {case MotionEvent.ACTION_DOWN:mLastX = x;break;case MotionEvent.ACTION_MOVE:float deltaX = Math.abs(x - mLastX);if (deltaX > mTouchSlop) {// 这是一个有效的滑动}break;}return true;
}

4. VelocityTracker、GestureDetector

4.1 VelocityTracker

VelocityTracker用于追踪手指滑动的速度,包括水平和垂直方向的速度。速度的计算单位通常是"每秒移动的像素数(px/s)"。

使用VelocityTracker的基本步骤:

// 在View的onTouchEvent方法中
private VelocityTracker mVelocityTracker;@Override
public boolean onTouchEvent(MotionEvent event) {if (mVelocityTracker == null) {mVelocityTracker = VelocityTracker.obtain();}mVelocityTracker.addMovement(event);switch (event.getAction()) {case MotionEvent.ACTION_DOWN:// 处理按下事件break;case MotionEvent.ACTION_MOVE:// 处理移动事件break;case MotionEvent.ACTION_UP:// 计算速度mVelocityTracker.computeCurrentVelocity(1000); // 计算单位:1000ms内的像素数float xVelocity = mVelocityTracker.getXVelocity();float yVelocity = mVelocityTracker.getYVelocity();// 使用速度值进行相关处理// 回收VelocityTrackerif (mVelocityTracker != null) {mVelocityTracker.recycle();mVelocityTracker = null;}break;}return true;
}

注意:获取速度值前必须先调用computeCurrentVelocity()方法,参数表示时间单位(毫秒)。

4.2 GestureDetector

GestureDetector用于辅助检测用户的单击、长按、滑动、双击等手势。它简化了复杂手势的识别过程。

使用GestureDetector的基本步骤:

  1. 创建GestureDetector实例
  2. 实现GestureDetector.OnGestureListener接口
  3. 在View的onTouchEvent()方法中转发触摸事件
public class MyView extends View implements GestureDetector.OnGestureListener, GestureDetector.OnDoubleTapListener {private GestureDetector mGestureDetector;public MyView(Context context) {super(context);mGestureDetector = new GestureDetector(context, this);// 解决长按后无法拖动的问题mGestureDetector.setIsLongpressEnabled(false);}@Overridepublic boolean onTouchEvent(MotionEvent event) {return mGestureDetector.onTouchEvent(event);}// OnGestureListener方法@Overridepublic boolean onDown(MotionEvent e) {// 按下动作return true; // 必须返回true,否则后续事件不会传递}@Overridepublic void onShowPress(MotionEvent e) {// 按下但未移动或抬起}@Overridepublic boolean onSingleTapUp(MotionEvent e) {// 单击抬起return false;}@Overridepublic boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {// 滚动操作return false;}@Overridepublic void onLongPress(MotionEvent e) {// 长按事件}@Overridepublic boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {// 快速滑动后抬起return false;}// OnDoubleTapListener方法@Overridepublic boolean onSingleTapConfirmed(MotionEvent e) {// 严格的单击确认(非双击中的第一次点击)return false;}@Overridepublic boolean onDoubleTap(MotionEvent e) {// 双击事件return false;}@Overridepublic boolean onDoubleTapEvent(MotionEvent e) {// 双击事件中的ACTION_DOWN、ACTION_MOVE和ACTION_UPreturn false;}
}

如果不需要处理所有手势,可以使用SimpleOnGestureListener类,它提供了所有方法的空实现,只需重写需要的方法。


请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/96070.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/96070.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/96070.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

西门子 S7-200 SMART PLC 实现电机点动与连续运行综合控制

在工业生产中,电机控制并非单一模式:调试设备时需要 “按动即转、松开即停” 的点动功能,正常生产时则需要 “一键启动、持续运行” 的连续控制。本文以西门子 S7-200 SMART PLC 为载体,详细讲解电机点动控制原理,并设…

如何解决pip安装报错ModuleNotFoundError: No module named ‘sphinx-rtd-theme’问题

【Python系列Bug修复PyCharm控制台pip install报错】如何解决pip安装报错ModuleNotFoundError: No module named ‘sphinx-rtd-theme’问题 摘要 在使用 PyCharm 开发 Python 项目时,pip install 报错是常见痛点。特别是在构建文档或引入第三方库时,开…

HakcMyVM-Literal

目录信息搜集漏洞利用权限提升信息搜集 主机发现 ┌──(kali㉿kali)-[~] └─$ nmap -sn 192.168.21.0/24 Nmap scan report for 192.168.21.5端口扫描 ┌──(kali㉿kali)-[~] └─$ nmap -sS -sV -O -p- 192.168.21.5 Starting Nmap 7.95 ( https://nmap.org ) a…

0904 类的继承

Part 1.梳理思维导图一.继承中的特殊成员函数1.构造函数父类的构造函数会被继承到子类中&#xff0c;在构造的顺序中&#xff0c;是先构造父类&#xff0c;再构造子类#include <iostream>using namespace std;class Father { public:string name; protected:int *age; pr…

PDF教程|如何把想要的网页保存下来?

前段时间有个小伙伴咨询了小白&#xff1a;领导想要某个网页的整个页面&#xff0c;有没有比较好的方法把它保存下来&#xff1f; 在他找到小白之前&#xff0c;这种事情他已经接到好几次了&#xff0c;每次都是怎么解决的呢&#xff1f;其实很简单&#xff0c;就是打开Word&a…

【bash】命令查看当前目录下文件个数

要用 ls 查看当前目录下的文件个数&#xff0c;可以结合 wc -l 来统计行数&#xff1a; ls -1 | wc -l说明&#xff1a; ls -1&#xff1a;以一行一个文件的方式列出。wc -l&#xff1a;统计行数&#xff0c;也就是文件/目录的数量。 ⚠️ 需要注意&#xff1a; 这个方法会把文…

「日拱一码」081 机器学习——梯度增强特征选择GBFS

目录 什么是梯度增强特征选择&#xff08;GBFS&#xff09; 为什么 GBM 适合做特征选择 GBFS 的一般步骤 代码示例 什么是梯度增强特征选择&#xff08;GBFS&#xff09; GBFS 并非一个像 Lasso 或随机森林那样有严格标准定义的独立算法&#xff0c;而是一种基于梯度提升机…

解构汇编, 万物起源

汇编的诞生汇编全景图核心主干: CPU架构主要分支: 语法和工具共同的地貌: 核心概念延伸: 跨平台 & 跨架构跨平台跨架构总结以 GAS vs. NASM 为例NASM 不支持跨架构 ≠ 无法在ARM架构上的系统安装汇编的诞生 机器语言的困境 早期的程序员直接使用机器语言进行编程机器语言由…

广州旅游网站系统 - 纯静态旅游展示平台

&#x1f31f; 广州旅游网站系统 - 纯静态旅游展示平台观世界才有世界观 - 一个集景区展示、旅游攻略、文化传播于一体的精美旅游网站&#x1f4cb; 项目概述 这是一个专注于广州旅游文化的纯静态网站系统&#xff0c;采用现代化的前端技术栈&#xff0c;为游客提供全方位的广州…

Qt UDP通信学习

Qt UDP通信学习 一、项目概述 本项目基于Qt框架实现了UDP通信功能&#xff0c;支持单播与广播消息收发&#xff0c;展示了UDP套接字的基本用法&#xff0c;适合初学者学习Qt网络模块的实际应用。 二、项目结构 55.pro&#xff1a;Qt工程文件&#xff0c;配置模块与源码文件main…

古德哈特定律(Goodhart‘s Law)

古德哈特定律&#xff08;Goodhart’s Law&#xff09;表述为“当一个指标变成了目标&#xff0c;它将不再是个好指标”。 该定律由英国经济学家查尔斯古德哈特&#xff08;Charles Goodhart&#xff09;在1975年提出&#xff0c;最初用于批判撒切尔夫人政府的货币主义政策&…

在 ASP.NET Core 8 Web API 中实现基于角色的授权 安全且可扩展 API 的最佳实践

掌握基于角色的授权&#xff1a;使用专家策略保护您的 ASP.NET Core 8 Web API。在 ASP.NET Core 8 Web API 中实现基于角色的授权&#xff1a;安全且可扩展 API 的最佳实践介绍授权是任何 Web 应用程序的关键组件。在开发 API 时&#xff0c;使用基于角色的授权保护端点可确保…

AutoHotkey识别图片

一、下载ImagePut插件 下载地址&#xff1a;GitHub - iseahound/ImagePut: A core library for images in AutoHotkey. Supports AutoHotkey v1 and v2. 二、将插件和要搜索的图片导入项目 #Include ./plugin/ImagePut.ahk ; 截取当前屏幕 pic : ImagePutBuffer(0) point : p…

CamX-Camera常用编译命令和adb指南

g_camxsettings vendor/qcom/proprietary/camx/src/settings/g_camxsettings.xml 控制相机debug的信息都在该文件里面 0、相关代码 framwork层 frameworks/av/camera/ frameworks/av/services/camera frameworks/av/services/camera frameworks/hardware/interfaces/camerase…

LabVIEW 实现颜色平滑渐变控制

LabVIEW 中实现 LED 颜色从蓝到红的平滑渐变显示在 LabVIEW 开发中&#xff0c;若需让 LED&#xff08;或类 LED 显示控件&#xff09;实现从蓝色到红色的平滑色彩渐变&#xff08;模拟温度等参数从低到高的视觉反馈&#xff09;&#xff0c;可通过自定义颜色查找表 数值缩放映…

阴阳学:从入门到精通

第一篇&#xff1a;入门篇——阴阳基础理论1.1 阴阳的起源与哲学意义阴阳概念的历史渊源《易经》中的阴阳思想阴阳与宇宙、自然、人生的关系阴阳对思想、行为、社会的影响1.2 阴阳的基本属性与符号阴阳的特征、象征与对立统一阴阳在自然界的表现&#xff08;昼夜、冷热、动静等…

Java工业通信实战(三):Modbus RTU串口通信实现

想象一下&#xff0c;你要和一台工业设备"对话"&#xff0c;比如询问温度传感器"现在多少度&#xff1f;“或者告诉电机"转快一点”。 Modbus RTU就是这种"对话"的标准语言&#xff0c;就像人与人之间说普通话一样。 它采用主从结构&#xff0c;…

CentOS安装或升级protoc

卸载旧版本 sudo yum remove protobuf protobuf-c protobuf-compiler -y sudo rm -f /usr/bin/protoc sudo rm -rf /usr/include/google/protobuf 下载 wget https://github.com/protocolbuffers/protobuf/releases/download/v3.15.0/protoc-3.15.0-linux-x86_64.zip unz…

人工智能在医学图像中的应用:从机器学习到深度学习

目的&#xff1a;人工智能&#xff08;AI&#xff09;模型在生物医学研究和医疗服务中扮演着越来越重要的角色。本综述聚焦于在现实世界背景下&#xff0c;开发AI应用作为临床决策支持系统时需要澄清的挑战性问题。方法&#xff1a;进行了一项叙述性综述&#xff0c;包含对1989…

基于Echarts+HTML5可视化数据大屏展示-智慧小区大数据分析

效果展示&#xff1a;代码结构&#xff1a;主要代码实现 index.html布局 <!doctype html> <!DOCTYPE html> <html lang"en"><head><meta charset"utf-8"><title>智慧农业大数据展示</title><link rel"s…