學(xué)渣系列 - getX女蜈、getRawX、getTranslationX 等的 好多概念有多少是正確的

下面的很多東西 都是網(wǎng)上找的 也一直那么用。
終于有一天自己較真。 想要看看 下面就是我的發(fā)現(xiàn)硝烂。

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嗎? 如果你只看網(wǎng)上的那些 這句話 是沒有問題的铜幽。當(dāng)時當(dāng)你打印的話嗎滞谢, 那么就會知道 永遠不會成功串稀。 他們查了75 對 永遠查了這么多。 相信有的看出來了狮杨。 就是差的狀態(tài)欄高度厨诸。 這就是很大坑。 v.getTop() 的意思 是當(dāng)前view 相對于父 view的高度禾酱。 但是這個是跑出狀態(tài)欄的。 大家懂了吧绘趋。

int ty = y - temp[1];
int by = y - temp[1] + v.getHeight();
//temp[1] 觸摸點到控件定點的距離 唄Y減去 得到的值 就是 控件頂端距離屏幕上面的 距離颤陶。 也就是Y坐標(biāo)( 他為什么虎沒有誤差。 狀態(tài)欄的高度被減去了陷遮。) 加上v.getHeight() 就是底端的距離
// 所以 ty by dedao 就是控件 頂部和底部 距離最上面的距離 也就是Y 坐標(biāo)
if (ty<0){
ty=0;
// 沒有這種情況 ty時間上就是v.getTop()(只有一層父view的時候) 這樣方便理解滓走。 其他的要是要這么算。 就是為了莊明 不會小于0 最多等于0
}else if (ty>windowHeight-v.getHeight()){
ty = windowHeight-v.getHeight();
}

下面都是網(wǎng)上的帽馋。 我會慢慢去驗算

一搅方、getX、getRawX绽族、getTranslationX等的圖形表示**</pre>

首先我們來看看這幾個方法在圖形上的表示姨涡,然后再用代碼的形式進行驗證我們來看下這幾個方法的幾何圖形的表示:

image

上面只是用圖片表示了這幾個距離的意義,下面我們用文字來描述一下吧慢,然后通過案例來驗證一下大家就徹底明白這幾個距離的意義了涛漂。

二、getX检诗、getRawX匈仗、getTranslationX意義的文字描述**</pre>

event.getX():表示的是觸摸的點距離自身左邊界的距離
event.getY():表示的是觸摸的點距離自身上邊界的距離
event.getRawX:表示的是觸摸點距離屏幕左邊界的距離
event.getRawY:表示的是觸摸點距離屏幕上邊界的距離
View.getWidth():表示的是當(dāng)前控件的寬度,即getRight()-getLeft()</pre>

View.getHeight():表示的是當(dāng)前控件的高度逢慌,即getBottom()-getTop()
View.getTop():子View的頂部到父View頂部的距離
View.getRight():子View的右邊界到父View的左邊界的距離
View.getBottom():子View的底部到父View的頂部的距離
View.getLeft():子View的左邊界到父View的左邊界的距離
View.getTranslationX()計算的是該View在X軸的偏移量悠轩。初始值為0,向左偏移值為負(fù)攻泼,向右偏移值為正火架。
View.getTranslationY()計算的是該View在Y軸的偏移量。初始值為0忙菠,向上偏移為負(fù)距潘,向下偏移為證。 </pre>

細心的同學(xué)會發(fā)下上面多了個getTranslationX只搁,這個計算的是該View在X軸的偏移量音比。初始值為0,向左偏移值為負(fù)氢惋,向右偏移值為正洞翩。由于用用圖形不好表示稽犁,在后面會有一個案例來說明它的意義。
</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磕仅,中間黑色區(qū)域是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. }

然后看下打印的結(jié)果:

image

與你計算的一樣嗎榕订?其中大家看到的可能會有0.0幾的誤差因為中間的那個小白點是2dp店茶,可能點擊的時候并不是剛好是正中間但是并不影響我們的測試。好了到這里相信大家對這幾個概念應(yīng)該有了比較清楚的認(rèn)識劫恒。接著我們來看下getTranslationX忽妒,上面我們提到它計算的是該View在X軸的偏移量。初始值為0兼贸,向左偏移值為負(fù)段直,向右偏移值為正。怎么來驗證它呢溶诞?用屬性動畫及可以做到鸯檬,首先我們來看下代碼:

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

來看看它的打印結(jié)果:

image

看到了吧,剛開始打印的getTranslationX為0螺垢,然后我們執(zhí)行屬性動畫這個屬性動畫就是讓這個View向右移動100px之后再打印發(fā)現(xiàn)它的值變成了100喧务,這也驗證了我們的說法。

1枉圃、getRawX功茴、getRawY與getX、getY的區(qū)別

這四個方法都返回一個float類型的參數(shù)孽亲,單位為像素(Pixel)坎穿。
getRawX()、getRawY()返回的是觸摸點相對于屏幕的位置,
而getX()玲昧、getY()返回的則是觸摸點相對于View的位置栖茉。


這里寫圖片描述
這里寫圖片描述

2、View中的getScrollX孵延、getScrollY

getScrollX()與getScrollY()的值由調(diào)用View的scrollTo(int x, int y)或者scrollBy(int x, int y)產(chǎn)生

其中scrollTo是將View中的內(nèi)容移動到指定的坐標(biāo)x吕漂、y處,此x尘应、y是相對于View的左上角惶凝,而不是屏幕的左上角。

scrollBy(int x, int y)則是改變View中的相對位置犬钢,參數(shù)x苍鲜、y為距離上一次的相對位置。

圖:
屏幕中心放置了一個button娜饵,而button的內(nèi)容被放置在了它的左上角


這里寫圖片描述

調(diào)用button的scrollTo(-100, -100)方法,button內(nèi)的內(nèi)容被移至相對button左上角(-100官辈,-100)的位置


這里寫圖片描述

對上圖調(diào)用scrollBy(-100,-100)方法箱舞,button內(nèi)的內(nèi)容被移至相對于上圖的(-100,-100)位置


這里寫圖片描述

值得注意的是,當(dāng)View中的內(nèi)容向右移動時拳亿,getScrollX()的值為負(fù)數(shù)晴股,同理,向scrollTo與scrollBy的x中傳入負(fù)數(shù)肺魁,view中的內(nèi)容向右移動电湘,反之向左。

當(dāng)View中的內(nèi)容向下移動時鹅经,getScrollY()的值為負(fù)數(shù)寂呛,同理,向scrollTo與scrollBy的y中傳入負(fù)數(shù)瘾晃,view中的內(nèi)容向下移動贷痪,反之向上。

3蹦误、View 提供的獲取坐標(biāo)的方法:都是以父布局的頂邊和左邊為對比

  • getTop()
    獲取到的是View本身的頂邊到其父布局頂邊的距離

  • getLeft()
    獲取到的是View本身的左邊到其父布局左邊的距離

  • getRight()
    獲取到的是View本身的右邊到其父布局左邊的距離

  • getBottom()
    獲取到的是View本身的下邊到其父布局頂邊的距離

這里寫圖片描述
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末劫拢,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子强胰,更是在濱河造成了極大的恐慌舱沧,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件偶洋,死亡現(xiàn)場離奇詭異熟吏,居然都是意外死亡,警方通過查閱死者的電腦和手機玄窝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進店門分俯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來肾筐,“玉大人,你說我怎么就攤上這事缸剪÷痤恚” “怎么了?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵杏节,是天一觀的道長唬渗。 經(jīng)常有香客問我,道長奋渔,這世上最難降的妖魔是什么镊逝? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮嫉鲸,結(jié)果婚禮上撑蒜,老公的妹妹穿的比我還像新娘。我一直安慰自己玄渗,他們只是感情好座菠,可當(dāng)我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著藤树,像睡著了一般浴滴。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上岁钓,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天升略,我揣著相機與錄音,去河邊找鬼屡限。 笑死品嚣,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的钧大。 我是一名探鬼主播腰根,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼拓型!你這毒婦竟也來了额嘿?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤劣挫,失蹤者是張志新(化名)和其女友劉穎册养,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體压固,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡球拦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片坎炼。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡愧膀,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出谣光,到底是詐尸還是另有隱情檩淋,我是刑警寧澤,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布萄金,位于F島的核電站蟀悦,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏氧敢。R本人自食惡果不足惜日戈,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望孙乖。 院中可真熱鬧浙炼,春花似錦、人聲如沸唯袄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽越妈。三九已至季俩,卻和暖如春钮糖,著一層夾襖步出監(jiān)牢的瞬間梅掠,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工店归, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留阎抒,地道東北人。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓消痛,卻偏偏與公主長得像且叁,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子秩伞,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,927評論 2 355

推薦閱讀更多精彩內(nèi)容