Android開發之getX,getRawX,getWidth,getTranslationX等的區別

來源:互聯網
上載者:User

標籤:com   img   開發   turn   extends   state   man   同學會   ati   

 

轉載請註明出處: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等,然後和後面列印的日誌對比下,首先來看下代碼:

[java] view plain copy 
  1. package com.example.test;  
  2.   
  3. import android.app.Activity;  
  4. import android.os.Bundle;  
  5. import android.util.Log;  
  6. import android.view.MotionEvent;  
  7. import android.view.View;  
  8. import android.view.View.OnTouchListener;  
  9. import android.view.Window;  
  10. import android.view.WindowManager;  
  11. import android.widget.RelativeLayout;  
  12.   
  13. public class MainActivity extends Activity {  
  14.       
  15.     private boolean isFocus=false;    
  16.       
  17.     private RelativeLayout rlCenter;  
  18.       
  19.     private  int screenWidth;  
  20.     private int screenHeight;  
  21.     private float x,y;  
  22.     private float rawX,rawY;  
  23.   
  24.     @Override  
  25.     protected void onCreate(Bundle savedInstanceState) {  
  26.         super.onCreate(savedInstanceState);  
  27.         requestWindowFeature(Window.FEATURE_NO_TITLE);  
  28.         getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN  
  29.                 ,WindowManager.LayoutParams.FLAG_FULLSCREEN);  
  30.         setContentView(R.layout.activity_main);  
  31.           
  32.         rlCenter=(RelativeLayout) findViewById(R.id.rl_center);  
  33.         screenWidth = ScreenUtils.getScreenWidth(MainActivity.this);  
  34.         screenHeight = ScreenUtils.getScreenHeight(MainActivity.this);  
  35.           
  36.         Log.i("MainActivity","screenWidth:"+screenWidth);  
  37.         Log.i("MainActivity","screenHeight:"+screenHeight);  
  38.           
  39.         rlCenter.setOnTouchListener(new OnTouchListener() {  
  40.               
  41.             @Override  
  42.             public boolean onTouch(View v, MotionEvent event) {  
  43.                   
  44.                 int action = event.getAction();  
  45.                 switch (action) {  
  46.                 case MotionEvent.ACTION_DOWN:  
  47.                       
  48.                     x=event.getX();  
  49.                     y=event.getY();  
  50.                     rawX=event.getRawX();  
  51.                     rawY=event.getRawY();  
  52.                       
  53.                     Log.i("MainActivity", "event.getX()="+x+","+"event.getY()="+y+","+"event.getRawX()="+rawX+"event.getRawY()="+rawY);  
  54.                     break;  
  55.                 }  
  56.                 return false;  
  57.             }  
  58.         });  
  59.           
  60.     }  
  61.       
  62.     @Override  
  63.     public void onWindowFocusChanged(boolean hasFocus) {  
  64.         super.onWindowFocusChanged(hasFocus);  
  65.         if(hasFocus&&!isFocus){  
  66.             Log.i("MainActivity", "rlCenter.getWidth="+rlCenter.getWidth()+","+"rlCenter.getHeight="+rlCenter.getHeight());  
  67.             Log.i("MainActivity", "rlCenter.getLeft="+rlCenter.getLeft()+","+"rlCenter.getRight="+rlCenter.getRight()+","+"rlCenter.getTop="+rlCenter.getTop()+","+"rlCenter.getBottom="+rlCenter.getBottom());  
  68.         }  
  69.         isFocus=true;  
  70.     }  
  71. }  
然後看下列印的結果:


與你計算的一樣嗎?其中大家看到的可能會有0.0幾的誤差因為中間的那個小白點是2dp,可能點擊的時候並不是剛好是正中間但是並不影響我們的測試。好了到這裡相信大家對這幾個概念應該有了比較清楚的認識。接著我們來看下getTranslationX,上面我們提到它計算的是該View在X軸的位移量。初始值為0,向左位移值為負,向右位移值為正。怎麼來驗證它呢?用屬性動畫及可以做到,首先我們來看下代碼:

[java] view plain copy 
  1. package com.example.test2;  
  2.   
  3. import android.animation.ObjectAnimator;  
  4. import android.app.Activity;  
  5. import android.os.Bundle;  
  6. import android.util.Log;  
  7. import android.view.View;  
  8. import android.view.View.OnClickListener;  
  9. import android.widget.ImageView;  
  10.   
  11. public class MainActivity extends Activity{  
  12.       
  13.     private ImageView ivTest;  
  14.   
  15.     @Override  
  16.     protected void onCreate(Bundle savedInstanceState) {  
  17.         super.onCreate(savedInstanceState);  
  18.         setContentView(R.layout.activity_main);  
  19.           
  20.         ivTest=(ImageView) findViewById(R.id.iv_test);  
  21.           
  22.         ivTest.setOnClickListener(new OnClickListener() {  
  23.               
  24.             @Override  
  25.             public void onClick(View v) {  
  26.                 Log.i("MainActivity","ivTest.getTranslationX()="+ivTest.getTranslationX()+","+"ivTest.getTranslationY()="+ivTest.getTranslationY());  
  27.                 ObjectAnimator.ofFloat(ivTest,"translationX",100f).setDuration(1000).start();  
  28.             }  
  29.         });  
  30.     }  
  31. }  
來看看它的列印結果:


看到了吧,剛開始列印的getTranslationX為0,然後我們執行屬性動畫這個屬性動畫就是讓這個View向右移動100px之後再列印發現它的值變成了100,這也驗證了我們的說法。

好了這一篇部落格就到這裡了相信大家對這幾個概念應該很清楚了,

如果在閱讀過程中發現錯誤,謝謝指正。

轉載請註明出處:http://blog.csdn.net/dmk877/article/details/51550031

Android開發之getX,getRawX,getWidth,getTranslationX等的區別

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.