在做一个view背景特效的时候被坐标的各个获取方法搞晕了,几篇抄来抄去的博客也没弄很清楚。

现在把整个总结一下。

其实只要把下面这张图看明白就没问题了。

涉及到的方法一共有下面几个:

view获取自身坐标:getLeft(),getTop(),getRight(),getBottom()

view获取自身宽高:getHeight(),getWidth()

motionEvent获取坐标:getX(),getY(),getRawX(),getRawY()

首先是view的几个方法,

获取自身的宽高的这两个方法很清楚,不用多说,获取坐标的这几个就有点混乱了。

根据上面的图应该会比较容易明白,图中屏幕上放了一个ViewGroup布局,里面有个View控件

getTop:获取到的,是view自身的顶边到其父布局顶边的距离

getLeft:获取到的,是view自身的左边到其父布局左边的距离

getRight:获取到的,是view自身的右边到其父布局左边的距离

getBottom:获取到的,是view自身的底边到其父布局顶边的距离

这些方法获取到的数据可以用在什么地方呢?
比如要实现一个自定义的特殊布局,像http://blog.csdn.net/singwhatiwanna/article/details/42614953
这里要实现的是一个水波纹特效布局,该布局内的任何控件点击后都会出现波纹效果

那么在点击了布局内的一个控件之后,就要通过不断刷新布局,去更新这个控件上面的波纹半径,为了节省资源,每次刷新布局都时候不会整个布局都刷新,而只是通过

[java] view plaincopy
  1. postInvalidateDelayed(INVALIDATE_DURATION, left, top, right, bottom);

在布局的画布上每次只去更新点击事件所点击的对应的控件的位置,那么这里就可以用view的那四个方法,分别获取自身的四条边对应的坐标

从而让布局去刷新重绘。

当然博客中是使用绝对坐标去计算的,因为这里实现的是一个布局,可能里面还会嵌套另外的布局,经过多次嵌套之后所获取到的值,是相对于控件直接对应的父布局(这个布局有可能已经是我们重写的布局的子布局了)的距离,这样去刷新的区域肯定是不准确的,所以博客里面使用相对屏幕的绝对坐标计算需要刷新的控件区域。

如果这里自定义的不是布局,而只是一个控件的话,就可以通过以上方法获取到坐标,然后要求自己所在的布局去重绘这一区域就可以了。当然这只是一种思路,其实没必要去要求布局重绘,完全可以直接view自身重绘就可以了。

然后是motionEvent的方法:

getX():获取点击事件相对控件左边的x轴坐标,即点击事件距离控件左边的距离

getY():获取点击事件相对控件顶边的y轴坐标,即点击事件距离控件顶边的距离

getRawX():获取点击事件相对整个屏幕左边的x轴坐标,即点击事件距离整个屏幕左边的距离

getRawY():获取点击事件相对整个屏幕顶边的y轴坐标,即点击事件距离整个屏幕顶边的距离

这些方法可以用在什么地方呢?

getRawX和getRawY在之前那篇博客里广泛使用了,可以去那里看用法,getX()和getY()这两个方法在对view进行自定义的时候可能用的会比较多。

之后有篇博客写开头实现的特效,可以看下,下面是链接。

view和view group重写

作者:jason0539

微博:http://weibo.com/2553717707

博客:http://blog.csdn.net/jason0539(转载请说明出处)

转载于:https://www.cnblogs.com/Free-Thinker/p/8920595.html

android之View坐标系(view获取自身坐标的方法和点击事件中坐标的获取)相关推荐

  1. python通过api获取数据_在一次点击PythonRequests中从API获取所有数据

    import requests url = 'http://www.justdial.com/autosuggest.php?' param = { 'cases':'popular', 'strtl ...

  2. Windows下C/C++模拟鼠标点击,PC端没有鼠标设备也能够获取鼠标坐标、移动鼠标坐标、模拟鼠标点击事件,方法一 亲测有效

    ------- [ 转载请保留 ] ------- 作者:西_瓜_瓜 博客:https://blog.csdn.net/xi_gua_gua/article/details/105773298 --- ...

  3. Android ---------高德卫星地图绘制多个点和点的点击事件自定义弹窗

    最近开发中,遇到一个多个点绘制,并实现点击事件,出现自定义窗口显示相关信息等功能,所以写了这篇博客. 从后台请求数据,得到多个经纬度,然后绘制在地图上,并实现点击,出现相关信息(自定义弹框实现) 先来 ...

  4. android app 主界面,android ViewPager实现App主界面Tab菜单页面切换和点击事件

    Tabhost实现页面滑动切换比较麻烦,这里介绍一下viewPage 控件. 实现了三屏滑动带标题点击和tab页面内按钮的的点击事件实现: viewPage  的优点是可以滑动切换缺点是MainAct ...

  5. android按钮点击toast,关于button点击事件中setOnClick等元素的解读以及方法?以及toast的位置以及作用?...

    此文末参考链接: 此段代码的教程以及使用接口的方式.switch语句的教程链接为链接1. 汇总里说的有更多的实现方法,为链接2. 文中链接为视觉统一,链接均于文末,以上为方便文中跳转,加了文中的跳转链 ...

  6. android高德地图多个mark点击,Android ---------高德卫星地图绘制多个点和点的点击事件自定义弹窗...

    最近开发中,遇到一个多个点绘制,并实现点击事件,出现自定义窗口显示相关信息等功能,所以写了这篇博客. 从后台请求数据,得到多个经纬度,然后绘制在地图上,并实现点击,出现相关信息(自定义弹框实现) 先来 ...

  7. Android TextView设置自动识别的超链接字体颜色,及自身点击事件无响应的解决办法

    前言 我们在给TextView设置超链接的时候,可能最简单的,Android已经给出了一个非常的简单的做法就是: 在xml中设置: <!--all表示匹配所有,web表示匹配网址 --> ...

  8. C#中获取程序当前路径的方法[转]2011-10-25 15:40C#中获取程序当前路径的方法

    System.Diagnostics命名空间 string str1 =Process.GetCurrentProcess().MainModule.FileName;//可获得当前执行的exe的文件 ...

  9. python中用于获取用户输入的函数是_在Python中,用于获取用户输入的函数是.

    在Python中,用于获取用户输入的函数是. 答:input() 关于新生儿生理性体重下降的恢复时间,下列正确的是出生后 答:7~10天 中国大学MOOC: 未来城市只有同时具备下列哪几个组成部分,才 ...

最新文章

  1. 网络服务-SAMBA
  2. 如何解决秒杀的性能问题和超卖的讨论 及防止按钮多次点击
  3. 蛤玮学计网 -- 简单的判断ip
  4. 离线安装Eclipse的Color theme plugin
  5. 如何进行正确的SQL性能优化
  6. win7 网络打印机 未授予用户在此计算机上的请求登录类型,Win7提示未授予用户在此计算机上的请求登录类型...
  7. JQ实现王者荣耀手风琴效果
  8. 将Excel文件数据导入到SqlServer数据库的三种方案
  9. php 数组 utf8,PHP数组编码gbk与utf8互相转换的两种方法实例分享
  10. python分页PDF
  11. 360浏览器怎么开java_360安全浏览器怎么打开javascript
  12. 为什么要切换IP地址?
  13. Selenium认识与实战(学习版)
  14. asp.net pdf如何转换成tif_如何将pdf转换成word?它可以解决大多数文档转换问题
  15. js 手机或者座机电话号码验证
  16. charles证书下载
  17. 幼儿园数学目标_幼儿园数学活动目标的制定
  18. vue中使用layui实现树形菜单增删改查功能
  19. 算法笔记:Playing Atari with Deep Reinforcement Learning
  20. 天玑9000和高通骁龙870哪个好

热门文章

  1. 2018年全国多校算法寒假训练营练习比赛(第三场)
  2. PHP与base64
  3. Unicode字段也有collation
  4. Unix/Linux环境C编程入门教程(39) shell命令之系统管理
  5. Flex 学习笔记------as 与 js 的通信
  6. USACO 3.2 Stringsobits(DP)
  7. DPDK KNI实现(二十五)
  8. OVS DPDK--物理端口配置(三)
  9. linux存储--可执行文件结构和进程内存模型(三)
  10. matlab中libsvm 3.11,libsvm-3.11(matlab)