Android笔记(四) | View基础

简介: 本文主要总结有关View的常用基础知识,作为V学习View相关内容的根基。主要内容:View的位置参数、MotionEvent、TouchSlop对象、VelocityTracker、GestureDetector和Scroller对象。

本文主要总结有关View的常用基础知识,作为V学习View相关内容的根基。
主要内容:View的位置参数、MotionEvent、TouchSlop对象、VelocityTracker、GestureDetector和Scroller对象。

View类
 View类是Android中所有控件的基类,包括ViewGroup(控件组);这也就意味着,View本身可以是单个控件,也可以是包含多个控件的一组控件。

img_9ca695e558caa784cc827deee921d377.png

View的位置参数
 View的位置主要由四个顶点决定,分别对应于四个属性:top、left、right、bottom。从Android3.0开始,增加了几个额外参数:x、y、translationx、translationY。这些参数都是相对于父容器的。

img_34dbee1c95ab389706a2a09197dd5587.png

x:View发生平移后的左上角横坐标
y:View发生平移后的左上角纵坐标
translationX:View的横向偏移量(初始为0)
translationY:View的纵向偏移量(初始为0)

MotionEvent
 手指触摸屏幕后的典型事件类型有:

  • ACTION_DOWN——手指接触屏幕瞬间;
  • ACTION_MOVE——手指在屏幕上滑动;
  • ACTION_UP——手指离开屏幕瞬间;

通过MotionEvent对象可以得到点击事件发生的x、y坐标:

  • getX()——获取触摸点相对于当前View左上角的横坐标;
  • getY()——获取触摸点相对于当前View左上角的纵坐标;
  • getRawX()——获取触摸点相对于手机屏幕左上角的横坐标;
  • getRawY()——获取触摸点相对于手机屏幕左上角的纵坐标;

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

  1. 这是一个常量,和设备有关,在不同设备上这个值可能不同;
  2. 当手指在屏幕上滑动的距离小于这个值,系统就不会认为这是滑动操作;
  3. 获取方法:
ViewConfiguration.get(getContext()).getScaledTouchSlop();

  这个常量的意义在于,当我们做滑动处理的时候,可以用它来做一些过滤。这样可以改善用户的使用体验。

VelocityTracker
 速度追踪,用于追踪手指在滑动过程中的速度,包括水平和竖直方向的速度。下面是使用示例:

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        //创建VelocityTracker对象,并将触摸界面的滑动事件
        //加入到VelocityTracker当中。
        VelocityTracker velocityTracker = VelocityTracker.obtain();
        velocityTracker.addMovement(event);
        //指定时间间隔为1s,计算速度
        velocityTracker.computeCurrentVelocity(1000);
        //获取水平速度和竖直速度(像素/s) 
        int xVelocity = (int)velocityTracker.getXVelocity();
        int yVelocity = (int)velocityTracker.getYVelocity();
        //销毁对象,回收内存
        velocityTracker.clear();
        velocityTracker.recycle();
        return super.onTouchEvent(event);
    }

速度 = (终点位置 - 起点位置)/时间段(可以为负值)

GestureDetector
 手势检测,用于辅助检测用户的单击、滑动、长按、双击等行为。下面是使用示例:

public class MainActivity extends AppCompatActivity implements
        GestureDetector.OnGestureListener,GestureDetector.OnDoubleTapListener{
    GestureDetector mGestureDetector;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //首先,创建GestureDetector对象并根据需求实现OnGestureListener接口
        //和OnDoubleTapListener接口
        mGestureDetector = new GestureDetector(this,this);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        //将目标View中的触摸事件交给GestureDetector处理(这里是MainActivity中的触摸事件)
        return mGestureDetector.onTouchEvent(event);
    }
}

 做完上面的事情之后,即可以选择性的实现OnGestureListener和OnDoubleTapListener中的方法了,这两个接口中的常用方法如下:

方法名 描述 所属接口
onDown 手指轻轻触摸屏幕瞬间,由一个ACTION_DOWN触发 OnGestureListener
onSingleTapUp 手指(轻轻触摸屏幕后)松开,伴随一个ACTION_UP而触发,表示单击行为 OnGestureListener
onScroll 手指按下屏幕并拖动,由一个ACTION_DOWN,多个ACTION_MOVE触发,表示拖动行为 OnGestureListener
onFling 用户按下触摸屏,快速滑动后松开,由一个ACTION_DOWN、多个ACTION_MOVE和一个ACTION_UP触发,表示快速滑动行为 OnGestureListener
onLoongPress 用户长久的按住屏幕不放,表示长按行为 OnGestureListener
onDoubleTap 双击,由连续2次单击组成 OnDoubleTapListener

 说明:

  1. 在实际开发中,可以不使用GestureDetector,完全可以自己在View中onTouchEvent方法中实现所需的监听。
  2. 建议:如果只是监听滑动相关,就在onTouchEvent中实现;如果要监听双击这种行为,就使用GestureDetector。
相关文章
|
1月前
|
Linux 编译器 Android开发
FFmpeg开发笔记(九)Linux交叉编译Android的x265库
在Linux环境下,本文指导如何交叉编译x265的so库以适应Android。首先,需安装cmake和下载android-ndk-r21e。接着,下载x265源码,修改crosscompile.cmake的编译器设置。配置x265源码,使用指定的NDK路径,并在配置界面修改相关选项。随后,修改编译规则,编译并安装x265,调整pc描述文件并更新PKG_CONFIG_PATH。最后,修改FFmpeg配置脚本启用x265支持,编译安装FFmpeg,将生成的so文件导入Android工程,调整gradle配置以确保顺利运行。
80 1
FFmpeg开发笔记(九)Linux交叉编译Android的x265库
|
1月前
|
缓存 测试技术 Android开发
深入探究Android中的自定义View绘制优化策略
【4月更文挑战第8天】 在Android开发实践中,自定义View的绘制性能至关重要,尤其是当涉及到复杂图形和动画时。本文将探讨几种提高自定义View绘制效率的策略,包括合理使用硬件加速、减少不必要的绘制区域以及利用缓存机制等。这些方法不仅能改善用户体验,还能提升应用的整体性能表现。通过实例分析和性能测试结果,我们将展示如何有效地实现这些优化措施,并为开发者提供实用的技术指南。
|
1月前
|
前端开发 Android开发 开发者
深入探究Android中的自定义View组件开发
【4月更文挑战第3天】 在现代Android应用程序的开发过程中,创建具有独特功能和高度定制化的用户界面是一个常见需求。为此,理解并掌握自定义View组件的开发成为了开发者必备的技能之一。本文将深入探讨如何在Android中创建自定义View,从基础的绘制原理到事件处理机制,再到性能优化技巧,旨在为读者提供一个全面的技术视角,并通过实例代码演示如何实现一个功能丰富、响应迅速的自定义View组件。
|
1月前
|
Android开发 容器
Android UI设计: 什么是View和ViewGroup?
Android UI设计: 什么是View和ViewGroup?
43 0
|
1月前
|
Unix Linux Shell
FFmpeg开发笔记(八)Linux交叉编译Android的FFmpeg库
在Linux环境下交叉编译Android所需的FFmpeg so库,首先下载`android-ndk-r21e`,然后解压。接着,上传FFmpeg及相关库(如x264、freetype、lame)源码,修改相关sh文件,将`SYSTEM=windows-x86_64`改为`SYSTEM=linux-x86_64`并删除回车符。对x264的configure文件进行修改,然后编译x264。同样编译其他第三方库。设置环境变量`PKG_CONFIG_PATH`,最后在FFmpeg源码目录执行配置、编译和安装命令,生成的so文件复制到App工程指定目录。
63 9
FFmpeg开发笔记(八)Linux交叉编译Android的FFmpeg库
|
8天前
|
XML 前端开发 API
Android中实现Bitmap在自定义View中的放大与拖动
Android中实现Bitmap在自定义View中的放大与拖动
10 1
|
12天前
|
XML API Android开发
06. 【Android教程】Android 的 UI 根基 View与View
06. 【Android教程】Android 的 UI 根基 View与View
7 1
|
29天前
|
Android开发 异构计算 前端开发
Android显示原理,安卓自定义view面试
Android显示原理,安卓自定义view面试
|
29天前
|
Java 测试技术 开发工具
Android 笔记:AndroidTrain , Lint , build(1),只需一篇文章吃透Android多线程技术
Android 笔记:AndroidTrain , Lint , build(1),只需一篇文章吃透Android多线程技术
|
29天前
|
Android开发 开发者 容器
Android自定义View:MeasureSpec的真正意义与View大小控制
Android自定义View:MeasureSpec的真正意义与View大小控制