view是所有控件的父类,他的位置主要由他的四个顶点来决定。分别对应view的四个基本属性:left,top,right,bottom。其中top是左上角纵坐标,left是左上角的横坐标,right右下角的横坐标,bottom右下角的纵坐标。这些坐标都是相对于view的父控件来说的,因此它是一种相对坐标。在Android系统中,x轴和y轴的方向分别是向右和向下的          。                                                                   

根据上图,我们很容易得出宽高和坐标之间的关系

with=right-left;

height=bottom-top;

那么如何获取这四个参数呢?

top=gettop();

left=getleft();

bottom=getbottom();

right=getright();

从Android3.0开始,Android中的view新增了几个参数,x,y,translationx,translationy。其中的x,y是view左上角的坐标,translationx和translationy是view左上角相对于父容器的偏移量,这几个参数也是相对与父容器的坐标,并且translationx和translationy的值默认为零。他们之间的换算关系如下:

x=left+translationx;

y=top+translationy;

注意view在平移过程中top和left是原始位置,不会发生改变,发生改变的是x,y,translationx和translationy这四个参数。

motionevent 和touchslop

手机接触频幕后所产生的事件有如下几种:

action——down

action——move

action——up

点击后松开down>up;

滑动后松开down>move>move>move>up;

在这里系统提供了一下两组方法,getx(),gety()返回当前view的左上角的x,和y;;getrawx();getrawy()返回相对于手机屏幕左上角的x.和y;

touchslop 系统所能识别的被认为是滑动的最小距离。就是手指在手机上滑动,如果之间的距离小于这个距离,就不认为你是在滑动。这是一个长量,在不同设备上,他的滑动距离不同,通过如下方式可以获得:

viewconfiguration.get(getcontext()).getsaledTouchslop();

vellocitytracker用于追踪手指在滑动过程中的速度。包括横向和纵向。它的使用很简单在view的ontouchevent 的方法中追踪当前点击事件的速度:

// 追踪当前速度
VelocityTracker velocityTracker = VelocityTracker.obtain();
velocityTracker.addMovement(event);

// 计算速度
velocityTracker.computeCurrentVelocity(1000);
// 获取速度
int x = (int) velocityTracker.getXVelocity();
int y = (int) velocityTracker.getYVelocity();
// 重置
velocityTracker.clear();
// 回收内存
velocityTracker.recycle();

GestureDetector

手势检测,用于辅助检测用户的单机,长按,滑动,双击等行为。使用如下:

// 新建对象
GestureDetector gestureDetector = new GestureDetector(
(OnGestureListener) this);
// 解决长按后无法拖动的情况
gestureDetector.setIsLongpressEnabled(false);
// 接管ontuchevent方法
boolean consume = gestureDetector.onTouchEvent(event);
return consume;

做完以上,我们就可以有选择的实现ongesturelistener和ondoubleTAPlistener中的方法;介绍如下:

在日常开发中比较常见的有onsingtapup(单击), onfilling (快速滑动),onscroll(拖动),onlongpress(长按),和ondoubletap(双击);

另外要说的是在实际开发中,可以不使用gestureDetector,完全可以在view的ontouchevent中实现监听,这里有个建议,如果是滑动监听就用户自己来实现,如果是监听双击这种行为就是用gesturedetector。

Scroller

弹性滑动对象,用于view的弹性滑动,我们知道,当使用view的scrollto和scrollby方法来进行滑动时,其过程是瞬间完成的,对于用户体验不好。这时使用scroller来完成,他的滑动是有时间过程的。它本身无法让view滑动,需要配合computerscroll方法才能实现滑动过程。

scroller = new Scroller(context);

/**
* 缓慢滑动

* @param destx
* @param desty
*/
private void smooothScroll(int destx, int desty) {
int scroolx = getScrollX();
int date = destx - scroolx;
// 1000毫秒内向destx缓慢滑动
scroller.startScroll(scroolx, 0, date, 1000);
invalidate();
}

我们将在下一节讲解view的滑动与实现

Android 中view的解释相关推荐

  1. android中view手势滑动冲突的两种解决方法

    android中view手势滑动冲突的解决方法,主要解决方法有两种,外部和内部拦截.有需要的可以参考下. Android手势事件的冲突跟点击事件的分发过程息息相关,由三个重要的方法来共同完成,分别是: ...

  2. Android 中View的绘制机制源代码分析 三

    到眼下为止,measure过程已经解说完了,今天開始我们就来学习layout过程.只是在学习layout过程之前.大家有没有发现我换了编辑器,哈哈.最终下定决心从Html编辑器切换为markdown编 ...

  3. Android中View绘制流程以及invalidate()等相关方法分析

                                                                                                        ...

  4. Android 中View仅仅能接收到ACTION_DOWN无法接收ACTION_MOVE和ACTION_UP解决的方法

    Android 中View仅仅能接收到ACTION_DOWN无法接收ACTION_MOVE和ACTION_UP解决的方法 参考文章: (1)Android 中View仅仅能接收到ACTION_DOWN ...

  5. Android中View转换为Bitmap及getDrawingCache=null的解决方法

    Android中View转换为Bitmap及getDrawingCache=null的解决方法 参考文章: (1)Android中View转换为Bitmap及getDrawingCache=null的 ...

  6. Android中View绘制各种状态的背景图片原理深入分析以及StateListDrawable使用

    /* Call this to force a view to update its drawable state. This will cause drawableStateChanged to b ...

  7. android view 绘制过程,深入理解Android中View绘制的三大流程

    前言 最近对Android中View的绘制机制有了一些新的认识,所以想记录下来并分享给大家.View的工作流程主要是指measure.layout.draw这三大流程,即测量.布局和绘制,其中meas ...

  8. 深入解析Android中View的工作原理

    Android中的任何一个布局.任何一个控件其实都是直接或间接继承自View实现的,当然也包括我们在平时开发中所写的各种炫酷的自定义控件了,所以学习View的工作原理对于我们来说显得格外重要,本篇博客 ...

  9. android draw canvas,Android 中View.onDraw(Canvas canvas)的使用方法

    Android 中View.onDraw(Canvas canvas)的使用方法 View通过View.onDraw(Canvas canvas)来Draw. 我们可以定义自己的继承于View的Tes ...

最新文章

  1. React Native 网络层分析
  2. 阿里巴巴为什么让初始化集合时必须指定大小?
  3. hadoop搭建_hadoop分布式搭建之虚拟机克隆
  4. micro asyn wininet
  5. LeetCode 1533. Find the Index of the Large Integer(二分查找)
  6. potplayer 多个进程_什么是进程
  7. Kubernetes 小白学习笔记(14)--k8s集群路线-kubernetes核心组件详解
  8. 计算机毕业设计java+SSM网上购物超市网站(源码+系统+mysql数据库+Lw文档)
  9. Hive教程(08)- JDBC操作Hive
  10. QLabel绘制滚动文本
  11. 计算机内存与外存的区别及使用配合(内存外存区别与搭配;快速缓存;计算机总线结构;计算机程序内存分布(栈、堆、全局/静态、数据区、代码段))
  12. win10/11 亮度调节拖动条消失的问题
  13. 【java】英语单词对战小游戏
  14. L9110电机驱动电路
  15. git 拉取远端所有分支
  16. 如何旋转树莓派的显示屏幕
  17. 数组 Map 使用小结
  18. MySQL的between语句和in语句的区别
  19. 销售人员如何抓住客户?
  20. 传统银行业务的数字化转型-中原银行大数据建设实践

热门文章

  1. 大数据技能大赛题目(高职组,模块C和D)
  2. idea 占用内存优化调整
  3. 别人的计算机网络看不到,局域网内看不到别人的电脑怎么办
  4. 利用Python进行股票交易分析(三):A股量化交易策略的验证及数据分析。
  5. 「镁客·请讲」打造一台眼睛专属“跑步机”,鹰视菲诺是如何用AI拯救近视的?...
  6. pytest单元测试
  7. mov格式怎么转换成mp4?
  8. 基于百度的UidGenerator改造的全局唯一id生成器
  9. unitoy机器人怎么联网_乐乐智能机器人怎么联网?
  10. 计算机打字盲打方法,盲打