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

     好久没写博客了,最近工作确实挺忙的,刚刚结束了一个TV项目的开发,对于第一次开发TV项目的我表示:还是手机开发好啊。本来以为TV项目开发完了可以休息几天但是我还是想多了,哈哈,马上就要进行新项目的开发,唉,说多了都是眼泪啊,废话不多说咱们进入正题,今天和大家一起讨论的是android中的一些距离,可能在日常的开发中我们会经常遇到,但是有时候这几个概念又特别容易弄混,所以今天我就总结了getX,getRawX,getWidth等的区别。希望对大家有帮助,如有谬误,欢迎批评指正,如有疑问欢迎留言 
一、getX、getRawX、getTranslationX等的图形表示

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

上面只是用图片表示了这几个距离的意义,下面我们用文字来描述一下,然后通过案例来验证一下大家就彻底明白这几个距离的意义了。
二、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的意义,首先来看下运行效果图:

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

  1. package com.example.test;
  2. import android.app.Activity;
  3. import android.os.Bundle;
  4. import android.util.Log;
  5. import android.view.MotionEvent;
  6. import android.view.View;
  7. import android.view.View.OnTouchListener;
  8. import android.view.Window;
  9. import android.view.WindowManager;
  10. import android.widget.RelativeLayout;
  11. public class MainActivity extends Activity {
  12. private boolean isFocus=false;
  13. private RelativeLayout rlCenter;
  14. private  int screenWidth;
  15. private int screenHeight;
  16. private float x,y;
  17. private float rawX,rawY;
  18. @Override
  19. protected void onCreate(Bundle savedInstanceState) {
  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(new OnTouchListener() {
  31. @Override
  32. public boolean onTouch(View v, MotionEvent event) {
  33. int action = event.getAction();
  34. switch (action) {
  35. case MotionEvent.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. return false;
  44. }
  45. });
  46. }
  47. @Override
  48. public void onWindowFocusChanged(boolean hasFocus) {
  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. }

然后看下打印的结果:

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

  1. package com.example.test2;
  2. import android.animation.ObjectAnimator;
  3. import android.app.Activity;
  4. import android.os.Bundle;
  5. import android.util.Log;
  6. import android.view.View;
  7. import android.view.View.OnClickListener;
  8. import android.widget.ImageView;
  9. public class MainActivity extends Activity{
  10. private ImageView ivTest;
  11. @Override
  12. protected void onCreate(Bundle savedInstanceState) {
  13. super.onCreate(savedInstanceState);
  14. setContentView(R.layout.activity_main);
  15. ivTest=(ImageView) findViewById(R.id.iv_test);
  16. ivTest.setOnClickListener(new OnClickListener() {
  17. @Override
  18. public void onClick(View v) {
  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. }

来看看它的打印结果:

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

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

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

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

Android开发之getX,getRawX,getWidth,getTranslationX等的区别的更多相关文章

  1. Android 开发之旅:深入分析布局文件&又是“Hello World!”

    http://www.cnblogs.com/skynet/archive/2010/05/20/1740277.html 引言 上篇可以说是一个分水岭,它标志着我们从Android应用程序理论进入实 ...

  2. Android开发之Java集合类性能分析

    对于Android开发者来说深入了解Java的集合类很有必要主要是从Collection和Map接口衍生出来的,目前主要提供了List.Set和 Map这三大类的集合,今天Android吧(ard8. ...

  3. Android开发之InstanceState详解

    Android开发之InstanceState详解   本文介绍Android中关于Activity的两个神秘方法:onSaveInstanceState() 和 onRestoreInstanceS ...

  4. Android开发之Git配置

    Android开发之Git配置 1.首先git配置: 输入命令: git config --global user.name "xxx.xx" git config --globa ...

  5. 【Android UI】Android开发之View的几种布局方式及实践

    引言 通过前面两篇: Android 开发之旅:又见Hello World! Android 开发之旅:深入分析布局文件&又是“Hello World!” 我们对Android应用程序运行原理 ...

  6. Android开发之旅: Intents和Intent Filters(理论部分)

    引言 大部分移动设备平台上的应用程序都运行在他们自己的沙盒中.他们彼此之间互相隔离,并且严格限制应用程序与硬件和原始组件之间的交互. 我们知道交流是多么的重要,作为一个孤岛没有交流的东西,一定毫无意义 ...

  7. Android开发之ViewPager+ActionBar+Fragment实现响应式可滑动Tab

     今天我们要实现的这个效果呢,在Android的应用中十分地常见,我们可以看到下面两张图,无论是系统内置的联系人应用,还是AnyView的阅读器应用,我们总能找到这样的影子,当我们滑动屏幕时,Tab可 ...

  8. Android开发之Java必备基础

    Android开发之Java必备基础 Java类型系统 Java语言基础数据类型有两种:对象和基本类型(Primitives).Java通过强制使用静态类型来确保类型安全,要求每个变量在使用之前必须先 ...

  9. Android开发之PopupWindow

      /* *  Android开发之PopupWindow * *  Created on: 2011-8-8 *  Author: blueeagle *  Email: liujiaxiang@g ...

随机推荐

  1. linux write/wall 1

    linux:/opt/software/lktest/c # wallhellllllllllllllllllllooooooooooooooooo^[[AasZZZZZZ^Clinux:/opt/s ...

  2. C#用log4net记录日志

    1.首先安装 log4net. 2.新建 log4net.config 文件,右键-属性 “复制到输出目录”设置为“始终复制” 3.设置 log4net.config 配置文件 <?xml ve ...

  3. JVM jmap dump 分析dump文件 / 如何使用Eclipse MemoryAnalyzer MAT 排查线上问题

    jhat简介 jhat用来分析java堆的命令,可以将堆中的对象以html的形式显示出来,包括对象的数量,大小等等,并支持对象查询语言 这个工具并不是想用于应用系统中而是用于"离线" ...

  4. php单图片上传。

    1.input:file form 提交 /** * 用户头像上传 * @param [type] $file 图像信息 */ function domeadd($file){ if (is_arra ...

  5. springboot 前后端分离项目跨域配置

    @Configuration @EnableWebMvc public class CorsConfig implements WebMvcConfigurer { @Override public ...

  6. redis开启外网访问

    redis默认只允许本地访问,要使redis可以远程访问可以修改redis.conf   打开redis.conf文件在NETWORK部分有说明   ######################### ...

  7. Emac

    https://emacs-china.org/ 启动 console模式的emacs,$emacs -nw 学习参考: 1)<21天精通emacs> 2)Emacs常用命令简集. 3)& ...

  8. suse 奇怪的crash 问题

    最近遇到一个suse的crash 问题: 我没有使用 mkswap /dev/磁盘路径 来制作swap分区,我有很多剩余内存,我设置nr_swapfiles为0,可是我还是遇到了关于swap的cras ...

  9. 一个简单的dropdown(CSS+jquery)

    by 司徒正美 .dropdown{ position: relative; } .dropdown div{ position: relative; width:200px; height:30px ...

  10. linux下给PHP安装拓展

    要先完成了上一篇文章的phpize的操作,并激活它才能下一步. 下载拓展,在http://pecl.php.net/这个网站下载,其他的有可能不成功,我之前还很纳闷phpize已经调试通过了,但是切换 ...