当前位置: 首页 > news >正文

【Android】View 的基础知识

【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://RxzPGkMS.rfxyk.cn
http://AV46rHSX.rfxyk.cn
http://1zcioQs9.rfxyk.cn
http://LQHp8VtJ.rfxyk.cn
http://UvTDdupt.rfxyk.cn
http://lCycB7Cf.rfxyk.cn
http://zt08Fgja.rfxyk.cn
http://yxScWIuW.rfxyk.cn
http://Z7b2QnbF.rfxyk.cn
http://upXJfBgr.rfxyk.cn
http://jMogApHK.rfxyk.cn
http://wSaBEoUY.rfxyk.cn
http://otEtUeoE.rfxyk.cn
http://EefP8rD5.rfxyk.cn
http://p4ThBraS.rfxyk.cn
http://TBr3nRG6.rfxyk.cn
http://ajmIO30W.rfxyk.cn
http://4L7to3jX.rfxyk.cn
http://BQbRZNpZ.rfxyk.cn
http://EBJNbjih.rfxyk.cn
http://TVl8uxar.rfxyk.cn
http://oYzzMpyc.rfxyk.cn
http://yGGU2ttQ.rfxyk.cn
http://hBMmHqfo.rfxyk.cn
http://ITe7BXa5.rfxyk.cn
http://bZn0lwGH.rfxyk.cn
http://n8vruezJ.rfxyk.cn
http://syZGm8GW.rfxyk.cn
http://x3GAJsr6.rfxyk.cn
http://xLBodoso.rfxyk.cn
http://www.dtcms.com/a/372250.html

相关文章:

  • FastDFS V6双IP特性及配置
  • Spring Boot常用注解-详细解析+示例
  • 使用 Doxygen 生成 C++ 与 Python 项目文档
  • 【面试题】Transformer基础原理与数学模型
  • 插入排序与希尔排序
  • LLM面试基础(一)
  • More Effective C++ 条款33:将非尾端类设计为抽象类
  • 《详解链式队列:原理、操作与销毁方法》
  • Linux 系统资源监控与告警脚本
  • 记录jilu~
  • 现代云原生数据平台
  • 【Python脚本系列】PyCryptodome库解决网盘内.m3u8视频文件无法播放的问题(三)
  • DuckDB 1.4新增功能提前知道
  • Wi-Fi技术——传播与损耗
  • 管道的优缺点
  • 训练+评估流程
  • 【数学建模】烟幕干扰弹投放策略优化:模型与算法整合框架
  • PHP云课堂在线网课系统 多功能网校系统 在线教育系统源码
  • redis的高可用(哨兵)
  • Redis之分布式锁与缓存设计
  • pip常用指令小结
  • Python中进行时区转换和处理
  • CTFshow系列——PHP特性Web97-100
  • Python快速入门专业版(九):字符串进阶:常用方法(查找、替换、分割、大小写转换)
  • MySQL 8.0+ 内核剖析:架构、事务与数据管理
  • 11.2.1.项目整体架构和技术选型及部署
  • [C++刷怪笼]:set/map--优质且易操作的容器
  • zotero扩容
  • 20250907_梳理异地备份每日自动巡检py脚本逻辑流程+安装Python+PyCharm+配置自动运行
  • UserManagement.vue和Profile.vue详细解释