学渣系列 - getX、getRawX、getTranslationX 等的 好多概念有多少是正确的

下面的很多东西 都是网上找的 也一直那么用。
终于有一天自己较真。 想要看看 下面就是我的发现。

int x = (int) event.getRawX();
int y = (int) event.getRawY();

            switch (eventaction) {

                case MotionEvent.ACTION_DOWN: // touch down so check if the
                    temp[0] = (int) event.getX();  //   触摸点距离控件左边部的距离
                    temp[1] = y - v.getTop(); // 触摸点距离控件顶部的距离
                    int   i = (int) event.getY();
                    if(y - v.getTop() ==event.getY()){
                        int  b= 00;
                    }

先看上面这段 不完全的代码
event.getRawY() - v.getTop() ==event.getY() 这句话 等于true吗? 如果你只看网上的那些 这句话 是没有问题的。当时当你打印的话吗, 那么就会知道 永远不会成功。 他们查了75 对 永远查了这么多。 相信有的看出来了。 就是差的状态栏高度。 这就是很大坑。 v.getTop() 的意思 是当前view 相对于父 view的高度。 但是这个是跑出状态栏的。 大家懂了吧。

int ty = y - temp[1];
int by = y - temp[1] + v.getHeight();
//temp[1] 触摸点到控件定点的距离 呗Y减去 得到的值 就是 控件顶端距离屏幕上面的 距离。 也就是Y坐标( 他为什么虎没有误差。 状态栏的高度被减去了。) 加上v.getHeight() 就是底端的距离
// 所以 ty by dedao 就是控件 顶部和底部 距离最上面的距离 也就是Y 坐标
if (ty<0){
ty=0;
// 没有这种情况 ty时间上就是v.getTop()(只有一层父view的时候) 这样方便理解。 其他的要是要这么算。 就是为了庄明 不会小于0 最多等于0
}else if (ty>windowHeight-v.getHeight()){
ty = windowHeight-v.getHeight();
}

下面都是网上的。 我会慢慢去验算

一、getX、getRawX、getTranslationX等的图形表示**</pre>

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

image

上面只是用图片表示了这几个距离的意义,下面我们用文字来描述一下,然后通过案例来验证一下大家就彻底明白这几个距离的意义了。

二、getX、getRawX、getTranslationX意义的文字描述**</pre>

event.getX():表示的是触摸的点距离自身左边界的距离
event.getY():表示的是触摸的点距离自身上边界的距离
event.getRawX:表示的是触摸点距离屏幕左边界的距离
event.getRawY:表示的是触摸点距离屏幕上边界的距离
View.getWidth():表示的是当前控件的宽度,即getRight()-getLeft()</pre>

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,向上偏移为负,向下偏移为证。 </pre>

细心的同学会发下上面多了个getTranslationX,这个计算的是该View在X轴的偏移量。初始值为0,向左偏移值为负,向右偏移值为正。由于用用图形不好表示,在后面会有一个案例来说明它的意义。
</pre>

<pre style="white-space: pre-wrap; word-wrap: break-word; box-sizing: border-box; margin: 0px 0px 24px; background-color: rgb(240, 240, 240); overflow-x: auto; font-family: Consolas, Inconsolata, Courier, monospace; font-size: 14px; line-height: 22px; color: rgb(0, 0, 0); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px;">三、案例理解getX、getRawX、getTranslationX的用法</pre>

接下来我们通过两个案例来理解getX、getRawX、getTranslationX的意义,首先来看下运行效果图:

image

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

[java] view plaincopy

  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. }

然后看下打印的结果:

image

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

[java] view plaincopy

<embed id="ZeroClipboardMovie_2" src="https://csdnimg.cn/public/highlighter/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="16" height="16" name="ZeroClipboardMovie_2" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=2&width=16&height=16" wmode="transparent" style="box-sizing: border-box;">

  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. }

来看看它的打印结果:

image

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

1、getRawX、getRawY与getX、getY的区别

这四个方法都返回一个float类型的参数,单位为像素(Pixel)。
getRawX()、getRawY()返回的是触摸点相对于屏幕的位置,
而getX()、getY()返回的则是触摸点相对于View的位置。


这里写图片描述
这里写图片描述

2、View中的getScrollX、getScrollY

getScrollX()与getScrollY()的值由调用View的scrollTo(int x, int y)或者scrollBy(int x, int y)产生

其中scrollTo是将View中的内容移动到指定的坐标x、y处,此x、y是相对于View的左上角,而不是屏幕的左上角。

scrollBy(int x, int y)则是改变View中的相对位置,参数x、y为距离上一次的相对位置。

图:
屏幕中心放置了一个button,而button的内容被放置在了它的左上角


这里写图片描述

调用button的scrollTo(-100, -100)方法,button内的内容被移至相对button左上角(-100,-100)的位置


这里写图片描述

对上图调用scrollBy(-100,-100)方法,button内的内容被移至相对于上图的(-100,-100)位置


这里写图片描述

值得注意的是,当View中的内容向右移动时,getScrollX()的值为负数,同理,向scrollTo与scrollBy的x中传入负数,view中的内容向右移动,反之向左。

View中的内容向下移动时,getScrollY()的值为负数,同理,向scrollTo与scrollBy的y中传入负数,view中的内容向下移动,反之向上。

3、View 提供的获取坐标的方法:都是以父布局的顶边和左边为对比

  • getTop()
    获取到的是View本身的顶边到其父布局顶边的距离

  • getLeft()
    获取到的是View本身的左边到其父布局左边的距离

  • getRight()
    获取到的是View本身的右边到其父布局左边的距离

  • getBottom()
    获取到的是View本身的下边到其父布局顶边的距离

这里写图片描述
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,080评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,422评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,630评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,554评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,662评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,856评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,014评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,752评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,212评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,541评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,687评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,347评论 4 331
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,973评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,777评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,006评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,406评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,576评论 2 349

推荐阅读更多精彩内容