Android开发之getX,getRawX,getWidth,getTranslationX等的区别

摘要:
希望对大家有帮助,如有谬误,欢迎批评指正,如有疑问欢迎留言一、getX、getRawX、getTranslationX等的图形表示首先我们来看看这几个方法在图形上的表示,然后再用代码的形式进行验证我们来看下这几个方法的几何图形的表示:上面只是用图片表示了这几个距离的意义,下面我们用文字来描述一下,然后通过案例来验证一下大家就彻底明白这几个距离的意义了。View.getTranslationY()计算的是该View在Y轴的偏移量。细心的同学会发下上面多了个getTranslationX,这个计算的是该View在X轴的偏移量。
  好久没写博客了,最近工作确实挺忙的,刚刚结束了一个TV项目的开发,对于第一次开发TV项目的我表示:还是手机开发好啊。本来以为TV项目开发完了可以休息几天但是我还是想多了,哈哈,马上就要进行新项目的开发,唉,说多了都是眼泪啊,废话不多说咱们进入正题,今天和大家一起讨论的是android中的一些距离,可能在日常的开发中我们会经常遇到,但是有时候这几个概念又特别容易弄混,所以今天我就总结了getX,getRawX,getWidth等的区别。希望对大家有帮助,如有谬误,欢迎批评指正,如有疑问欢迎留言
一、getX、getRawX、getTranslationX等的图形表示

首先我们来看看这几个方法在图形上的表示,然后再用代码的形式进行验证我们来看下这几个方法的几何图形的表示:

Android开发之getX,getRawX,getWidth,getTranslationX等的区别第1张

上面只是用图片表示了这几个距离的意义,下面我们用文字来描述一下,然后通过案例来验证一下大家就彻底明白这几个距离的意义了。
二、getX、getRawX、getTranslationX意义的文字描述
event.getX():表示的是触摸的点距离自身左边界的距离
event.getY():表示的是触摸的点距离自身上边界的距离
event.getRawX:表示的是触摸点距离屏幕左边界的距离
event.getRawY:表示的是触摸点距离屏幕上边界的距离
View.getWidth():表示的是当前控件的宽度,即getRight()-getLeft()
View.getHeight():表示的是当前控件的高度,即getBottom()-getTop()
View.getTop():子View的顶部到父View顶部的距离
View.getRight():子View的右边界到父View的左边界的距离
View.getBottom():子View的底部到父View的顶部的距离
View.getLeft():子View的左边界到父View的左边界的距离
View.getTranslationX()计算的是该View在X轴的偏移量。初始值为0,向左偏移值为负,向右偏移值为正。
View.getTranslationY()计算的是该View在Y轴的偏移量。初始值为0,向上偏移为负,向下偏移为证。
细心的同学会发下上面多了个getTranslationX,这个计算的是该View在X轴的偏移量。初始值为0,向左偏移值为负,向右偏移值为正。由于用用图形不好表示,在后面会有一个案例来说明它的意义。
三、案例理解getX、getRawX、getTranslationX的用法
接下来我们通过两个案例来理解getX、getRawX、getTranslationX的意义,首先来看下运行效果图:

Android开发之getX,getRawX,getWidth,getTranslationX等的区别第2张

然后我来解释下这个布局首先最外面那个是手机屏幕,然后里面的白色矩形是里面黑色矩形的父View,中间的那个小的白点是我们点击的一个点,它处于屏幕的正中央,其中屏幕的分辨率是480*320,我们都知道在这种分辨率下1dp=1px,然后白色矩形的宽和高都是300dp,中间黑色矩形的宽和高都是150dp,中间黑色区域是rlCenter,中间的小白点是ivDot大家可以算一下rlCenter.getWidth,rlCenter.getX,rlCenter.getRawX以及rlCenter.getTop,rlCenter.getBottom等,然后和后面打印的日志对比下,首先来看下代码:

  1. packagecom.example.test;
  2. importandroid.app.Activity;
  3. importandroid.os.Bundle;
  4. importandroid.util.Log;
  5. importandroid.view.MotionEvent;
  6. importandroid.view.View;
  7. importandroid.view.View.OnTouchListener;
  8. importandroid.view.Window;
  9. importandroid.view.WindowManager;
  10. importandroid.widget.RelativeLayout;
  11. publicclassMainActivityextendsActivity{
  12. privatebooleanisFocus=false;
  13. privateRelativeLayoutrlCenter;
  14. privateintscreenWidth;
  15. privateintscreenHeight;
  16. privatefloatx,y;
  17. privatefloatrawX,rawY;
  18. @Override
  19. protectedvoidonCreate(BundlesavedInstanceState){
  20. super.onCreate(savedInstanceState);
  21. requestWindowFeature(Window.FEATURE_NO_TITLE);
  22. getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN
  23. ,WindowManager.LayoutParams.FLAG_FULLSCREEN);
  24. setContentView(R.layout.activity_main);
  25. rlCenter=(RelativeLayout)findViewById(R.id.rl_center);
  26. screenWidth=ScreenUtils.getScreenWidth(MainActivity.this);
  27. screenHeight=ScreenUtils.getScreenHeight(MainActivity.this);
  28. Log.i("MainActivity","screenWidth:"+screenWidth);
  29. Log.i("MainActivity","screenHeight:"+screenHeight);
  30. rlCenter.setOnTouchListener(newOnTouchListener(){
  31. @Override
  32. publicbooleanonTouch(Viewv,MotionEventevent){
  33. intaction=event.getAction();
  34. switch(action){
  35. caseMotionEvent.ACTION_DOWN:
  36. x=event.getX();
  37. y=event.getY();
  38. rawX=event.getRawX();
  39. rawY=event.getRawY();
  40. Log.i("MainActivity","event.getX()="+x+","+"event.getY()="+y+","+"event.getRawX()="+rawX+"event.getRawY()="+rawY);
  41. break;
  42. }
  43. returnfalse;
  44. }
  45. });
  46. }
  47. @Override
  48. publicvoidonWindowFocusChanged(booleanhasFocus){
  49. super.onWindowFocusChanged(hasFocus);
  50. if(hasFocus&&!isFocus){
  51. Log.i("MainActivity","rlCenter.getWidth="+rlCenter.getWidth()+","+"rlCenter.getHeight="+rlCenter.getHeight());
  52. Log.i("MainActivity","rlCenter.getLeft="+rlCenter.getLeft()+","+"rlCenter.getRight="+rlCenter.getRight()+","+"rlCenter.getTop="+rlCenter.getTop()+","+"rlCenter.getBottom="+rlCenter.getBottom());
  53. }
  54. isFocus=true;
  55. }
  56. }
然后看下打印的结果:

Android开发之getX,getRawX,getWidth,getTranslationX等的区别第3张

与你计算的一样吗?其中大家看到的可能会有0.0几的误差因为中间的那个小白点是2dp,可能点击的时候并不是刚好是正中间但是并不影响我们的测试。好了到这里相信大家对这几个概念应该有了比较清楚的认识。接着我们来看下getTranslationX,上面我们提到它计算的是该View在X轴的偏移量。初始值为0,向左偏移值为负,向右偏移值为正。怎么来验证它呢?用属性动画及可以做到,首先我们来看下代码:

  1. packagecom.example.test2;
  2. importandroid.animation.ObjectAnimator;
  3. importandroid.app.Activity;
  4. importandroid.os.Bundle;
  5. importandroid.util.Log;
  6. importandroid.view.View;
  7. importandroid.view.View.OnClickListener;
  8. importandroid.widget.ImageView;
  9. publicclassMainActivityextendsActivity{
  10. privateImageViewivTest;
  11. @Override
  12. protectedvoidonCreate(BundlesavedInstanceState){
  13. super.onCreate(savedInstanceState);
  14. setContentView(R.layout.activity_main);
  15. ivTest=(ImageView)findViewById(R.id.iv_test);
  16. ivTest.setOnClickListener(newOnClickListener(){
  17. @Override
  18. publicvoidonClick(Viewv){
  19. Log.i("MainActivity","ivTest.getTranslationX()="+ivTest.getTranslationX()+","+"ivTest.getTranslationY()="+ivTest.getTranslationY());
  20. ObjectAnimator.ofFloat(ivTest,"translationX",100f).setDuration(1000).start();
  21. }
  22. });
  23. }
  24. }
来看看它的打印结果:

Android开发之getX,getRawX,getWidth,getTranslationX等的区别第4张

看到了吧,刚开始打印的getTranslationX为0,然后我们执行属性动画这个属性动画就是让这个View向右移动100px之后再打印发现它的值变成了100,这也验证了我们的说法。

好了这一篇博客就到这里了相信大家对这几个概念应该很清楚了,

如果在阅读过程中发现错误,谢谢指正。

转载请注明出处:http://blog.csdn.net/dmk877/article/details/51550031

免责声明:文章转载自《Android开发之getX,getRawX,getWidth,getTranslationX等的区别》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇ORACLE 存储过程提高Linux查看进程和终止进程的技巧下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Android笔记之强大的buildConfigField

在进行项目开发或维护时,经常会遇到调试和发布所用到的参数值不一致的情况 例如,服务器会分测试和正式,为了能方便地更改(自动更换)服务器地址,buildConfigField就派上用场了 以前都是手动更改的,极易出错T_T buildConfigField语法如下 buildConfigField "TypeName", "FieldName", "Fiel...

Ubuntu 18.04 下配置 HAXM 加速 Android模拟器

Ubuntu 18.04 下配置 HAXM 加速 Android模拟器 最近在vmware环境下搭建ubuntu18.04开发环境,开始发现总是运行android模拟器在console提示加载如下错误信息:  Emulator: emulator: ERROR: x86 emulation currently requires hardware acc...

Crosswalk 集成到 Android Studio

Crosswalk介绍: Crosswalk是一款开源的Web引擎,其基于 Chromium/Blink 的应用运行环境,对于混合开发的轻量级应用尤为受欢迎。 Crosswalk项目的优势: 最大限度降低Android碎片化的影响,得到一致的,可预测的行为。 使用最新的Web技术及API。在Android 4.0+版本上提供丰富的功能。 使用Chro...

Android app专项测试之耗电量测试

一、前言耗电量指标待机时间成关注目标提升用户体验通过不同的测试场景,找出app高耗电的场景并解决 二、需要的环境准备1、python2.7(必须是2.7,3.X版本是不支持的)2、golang语言的开发环境3、Android SDK此三个的环境搭建这里就不详细说了,自行在网上找资料吧 三、battery-historian服务搭建1、克隆安装包git cl...

Android开发环境搭建详细图解

所谓Android的开发环境,主要是以下两个组件,Android Software Developer Kit(Android软件开发工具包)和Eclipse(编辑器,提供很多方便功能)两大块,下面分别介绍他们的安装方法。 安装Eclipse 要安装Eclipse,首先要安装Java Developer Kit(JDK,Java开发者工具包)...

【Android】缩略图Thumbnails

在Android,多媒体文件(视频和图片)都是有缩略图的,在很多应用中,我们需要获取这些缩略图。比如最近在做一个类似相册的应用,需要扫描相册里面的图片,然后获取其缩略图,使用GridView去展示缩略图,当点击之后,我们需要获取其原始图,所以相关的需求如下: 1)获取缩略图(一个问题是:是否所有的图片以及视频都有缩略图?); 2)将缩略图和原始图关联起来;...