Android View系列一: View基础知识

1.什么是View

View是Android中所有控件的基类,是一种界面层的控件的一种抽象,它代表了一个控件,除了View,还有ViewGroup(控件组),ViewGroup内部包含了许多控件,即一组View.ViewGroup继承View.

2.View的位置参数

View的位置由四个顶点决定:top left right bottom

top:是左上角纵坐标.

left:是左上角横坐标.

right:是右下角横坐标.

bottom:是右下角纵坐标.

这些坐标都是相对于View的父容器来说的,因此它是一种相对坐标

得到View的宽度:

width=right-left

得到View的高度:

height=bottom-top

如何得到View的这四个参数呢?

Left=getLeft();

Right=getRight();

Top=getTop();

Bottom=getBottom();

此外,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在平移的过程中,top和left表示的是原始左上角的位置信息,其值并不会发生改变,此时发生改变的是x,y,translationX和translationY这四个参数.

3.MotionEvent和TouchSlop

1.MotionEvent

在手指触摸屏幕时会产生一系列事件,典型的事件有:

ACTION_DOWN–手指刚接触屏幕

ACTION_MOVE–手指在屏幕上移动

ACTION_UP–手指从屏幕上松开的一瞬间

一次手指触摸屏幕会产生一系列事件:

点击屏幕后离开松开,事件序列为DOWN->UP;

点击屏幕滑动一会再松开,事件序列为DOWN->MOVE->…>MOVE->UP.

通过MotionEvent对象我们可以得到点击事件发生的x和y坐标.系统提供了两组方法:getX/getY和getRawX/getRawY.

getX/getY和getRawX/getRawY区别:

getX/getY:返回的是相对于当前View左上角的x和y坐标,

getRawX/getRawY:返回的是相对于手机屏幕左上角的x和y坐标.

2.TouchSlop

TouchSlop是系统所能识别出的被认为是滑动的最小距离,当手指在屏幕上滑动时,如果两次滑动之间的距离小于这个常量,那么系统就不认为你是在进行滑动操作.

因为,滑动的距离太短,系统不认为它是滑动.

这是一个常量,设备不同值不同,可以通过如下方式获取此常量:

ViewConfiguration.get(getContext()).getScaledTouchSlop().

可以在源码中找到这个常量的定义:在frameworks/base/core/res/res/values/config.xml文件中,”config_viewConfigurationTouchSlop”对应这个常量定义:

<dimen name="config_viewConfigurationTouchSlop">8dp</dimen>

4.VelocityTracker GestureDetector和Scroller

1.VelocityTracker

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方法;

第二点:这里的速度是指一段时间内手指所滑过的像素数,

第三点:速度可以为负数,当手指从右往左滑动时,水平方向速度即为负值.

速度的计算公式:

速度=(终点位置-起点位置)/时间段

通过公式和Android坐标系,可知道,手指逆着坐标系的正方向滑动,所产生的速度就为负值.

computeCurrentVelocity这个方法的参数表示的是一个时间单元或者说时间间隔,它的单位是毫秒(ms),计算速度时得到的速度就是在这个时间间隔内手指在水平或竖直方向上所滑动的像素数.

最后,当不需要使用它的时候,需要调用clear方法来重置并回收内存:

velocityTracker.clear();
velocityTracker.recycle();

2.GestureDetector

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中的方法:onSingleTapUp(单击),onFling(快速滑动),onScroll(拖动),onLongPress(长按)和onDoubleTap(双击).

如果只是监听滑动相关的,在onTouchEvent中实现,如果要监听双击这种行为的话,那么就使用GestureDetector.

3.Scroller

Scroller弹性滑动对象,用于实现View的弹性滑动,Scroller来实现有过渡效果的滑动,其过程不是瞬时完成的,而是在一定的时间间隔内完成的.

使用方法:

Scroller scroller=new Scroller(mContext);
//缓慢滑动到指定位置
private void smoothScrollTo(int destX,int destY){
    int scrollX=getScrollX();
    int delta=destX-scrollX;
    //1000ms内滑向destX,效果就是慢慢滑动
    mScroller.startScroll(scrollX,0,delta,0,1000);
    invalidate();
}
@Override
public void computeScroll(){
    if(mScroller.computeScrollOffset()){
    scrollTo(mScroller.getCurrX(),mScroller.getCurrY());
    postInvalidate();
    }
}
时间: 2024-09-29 09:44:03

Android View系列一: View基础知识的相关文章

【小白的java成长系列】——Java基础知识

今天来说说java的基础知识,个人感觉都不知道要说啥的,还是为后面的内容做一些铺垫吧~ 今天主要说的都是java面向对象之前的基础知识,比如数据类型呀,表达式运算符呀~等等一系列的知识,下节来说说面向对象.今天这节我就不用程序来说明,直接用文字说明.因为个人感觉真木有啥好说的,这些程序后续都会说到的,比较简单,写写就会了的..好吧~开始了... 1. Java数据类型划分: 基本数据类型:都是一个个具体的值 数值型:表示具体的数字,所有的整数默认情况下都是int,所有的小数都是double型的

android、IOS和手机基础知识

一.手机基础知识 1.固件.刷固件.固件版本 固件是指固化的软件,英文为firmware,它是把某个系统程序写入到特定的硬件系统中的flashROM.手机固件相当于手机的系统,刷新固件就相当于刷系统.不同的手机对应不同的固件,在刷固件前应该充分了解当前固件和所刷固件的优点缺点和兼容性, 并做好充分的准备.固件版本是指官方发布的固件的版本号!里面包含了应用部分的更新和基带部分的更新,官方新固件的推出的主要目的是为了修复已往固件中存在的BUG以及优化相关性能. 2.ROM(包)智能手机配置中的ROM

Android布局需要知道的基础知识

eclipse配置环境变量: 1.在 eclipse 中的 Window --> preferences  --> Android(安装了ADT的前提下才能看到Android) --> SDK Location: 将SDK路径导入 2.将 sdk 目录中的 platform-tools. tools 配置到 环境变量的 Path 中 && cmd 命令 : adb(查看android是否配置好环境). java(查看java是否配置好环境) && 配置 j

【Android】15.3 Notification基础知识

分类:C#.Android.VS2015: 创建日期:2016-02-29 一.如何向用户发出通知 1.使用Toast通知用户 前台任务中的通知(Notifications)一般用于长时间显示用户正在关注的服务的消息.但有时候,我们可能只希望将最终结果短暂地显示出来,比如告诉用户文件已下载完毕等,此时可以用Toast告诉用户. 由于服务是在后台运行的,所以可以在服务中用Handler来实现Toast的显示.例如: var myHandler = new Handler (); ... myHan

前端系列之CSS基础知识概述

1.什么是DIV (1).div就是html一个普通标签,进行区域划分.特性:独自占一行.独自不能实现复杂效果.必须结合css样式进行渲染. (2).div通常其是块级元素 (3).div是定义文档中的分区或节(division/section). (4).div标签是以把文档分割为中立的.不同的部分.它可以用作严格的组织工具,并且不使用任f可格式与其关联. (5).如果用id或class来标记div,那么该标签的作用会殳得更加有效. 2.什么是CSS (1).css通常称为css样式或层叠样式

EJB系列 - 会话Bean基础知识

本人博客文章网址:https://www.peretang.com/basic-knowledge-of-session-bean/ 什么是会话 有限的时间周期内,客户端和服务器之间的连接 为什么使用会话bean 因为EJB大部分服务都是专门提供给会话bean的 1. 并发和线程安全: 容器利用很多技术来自动确保开发者不必担心并发或线程安全的问题   2. 远程处理和Web服务的服务提供   3. 事务和安全管理   4. 拦截器 会话bean的规范 1. 至少具有一个业务接口(EJB3.1后可

前端系列之HTML基础知识概述

1.什么是HTML HTML:Hyper Text Markup Language :超文本标记语言. 超文本:功能比普通文本更加强大. 标记语言:使用一组标签对内容进行描述的语言,它不是编程语言. 2.HTML能干什么 HTML用于编写网页,平时上网通过浏览器我们看到的大部分页面都是由html编写的.在浏览器访问网页时,可以通过"右键/查看网页源代码"看到具体的html代码. 网页内容包含:HTML代码.css代码.JavaScript代码等内容. HTML代码:用于展示需要显示的数

前端系列之JavaScript基础知识概述

?微信公众号:compassblog 欢迎关注,欢迎转发,互相学习,共同进步! 有任何问题,请后台留言联系! 1.什么是JavaScript (1).JavaScript是web上一种功能强大的编程语言,用于开发交互式的web页面.它不需要进行编译,而是直接嵌入在HTML页面中,由浏览器执行.(2).JavaScript被设计用来向HTML页面添加交互行为.(3).JavaScript是一种脚本语言(脚本语言是一种轻量级的编程语言).(4).JavaScript由数行可执行计算机代码组成.(5)

python入门系列:Python基础知识

Python注释 单行注释 这是一个单行注释 print("test")多行注释 '''这里就是python的多行注释方式可以直接分行进行注释操作本质上是字符串'''import thisprint("hello world")特殊注释 #!/usr/bin/python3指定解释器的版本#encoding=utf-8python 2.x解决中文文本乱码Python变量 变量使用 使用之前不用声明:做参数传递时,所有的变量都是引用 定义变量 arg = val a