Android開發之getX,getRawX,getWidth,getTranslationX等的區別
轉載請註明出處: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- package com.example.test;
- import android.app.Activity;
- import android.os.Bundle;
- import android.util.Log;
- import android.view.MotionEvent;
- import android.view.View;
- import android.view.View.OnTouchListener;
- import android.view.Window;
- import android.view.WindowManager;
- import android.widget.RelativeLayout;
- public class MainActivity extends Activity {
- private boolean isFocus=false;
- private RelativeLayout rlCenter;
- private int screenWidth;
- private int screenHeight;
- private float x,y;
- private float rawX,rawY;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- requestWindowFeature(Window.FEATURE_NO_TITLE);
- getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN
- ,WindowManager.LayoutParams.FLAG_FULLSCREEN);
- setContentView(R.layout.activity_main);
- rlCenter=(RelativeLayout) findViewById(R.id.rl_center);
- screenWidth = ScreenUtils.getScreenWidth(MainActivity.this);
- screenHeight = ScreenUtils.getScreenHeight(MainActivity.this);
- Log.i("MainActivity","screenWidth:"+screenWidth);
- Log.i("MainActivity","screenHeight:"+screenHeight);
- rlCenter.setOnTouchListener(new OnTouchListener() {
- @Override
- public boolean onTouch(View v, MotionEvent event) {
- int action = event.getAction();
- switch (action) {
- case MotionEvent.ACTION_DOWN:
- x=event.getX();
- y=event.getY();
- rawX=event.getRawX();
- rawY=event.getRawY();
- Log.i("MainActivity", "event.getX()="+x+","+"event.getY()="+y+","+"event.getRawX()="+rawX+"event.getRawY()="+rawY);
- break;
- }
- return false;
- }
- });
- }
- @Override
- public void onWindowFocusChanged(boolean hasFocus) {
- super.onWindowFocusChanged(hasFocus);
- if(hasFocus&&!isFocus){
- Log.i("MainActivity", "rlCenter.getWidth="+rlCenter.getWidth()+","+"rlCenter.getHeight="+rlCenter.getHeight());
- Log.i("MainActivity", "rlCenter.getLeft="+rlCenter.getLeft()+","+"rlCenter.getRight="+rlCenter.getRight()+","+"rlCenter.getTop="+rlCenter.getTop()+","+"rlCenter.getBottom="+rlCenter.getBottom());
- }
- isFocus=true;
- }
- }
然後看下打印的結果:
與你計算的一樣嗎?其中大家看到的可能會有0.0幾的誤差因為中間的那個小白點是2dp,可能點擊的時候並不是剛好是正中間但是並不影響我們的測試。好了到這裏相信大家對這幾個概念應該有了比較清楚的認識。接著我們來看下getTranslationX,上面我們提到它計算的是該View在X軸的偏移量。初始值為0,向左偏移值為負,向右偏移值為正。怎麽來驗證它呢?用屬性動畫及可以做到,首先我們來看下代碼:
- package com.example.test2;
- import android.animation.ObjectAnimator;
- import android.app.Activity;
- import android.os.Bundle;
- import android.util.Log;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.ImageView;
- public class MainActivity extends Activity{
- private ImageView ivTest;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- ivTest=(ImageView) findViewById(R.id.iv_test);
- ivTest.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- Log.i("MainActivity","ivTest.getTranslationX()="+ivTest.getTranslationX()+","+"ivTest.getTranslationY()="+ivTest.getTranslationY());
- ObjectAnimator.ofFloat(ivTest,"translationX",100f).setDuration(1000).start();
- }
- });
- }
- }
來看看它的打印結果:
看到了吧,剛開始打印的getTranslationX為0,然後我們執行屬性動畫這個屬性動畫就是讓這個View向右移動100px之後再打印發現它的值變成了100,這也驗證了我們的說法。
好了這一篇博客就到這裏了相信大家對這幾個概念應該很清楚了,
如果在閱讀過程中發現錯誤,謝謝指正。
轉載請註明出處:http://blog.csdn.net/dmk877/article/details/51550031
Android開發之getX,getRawX,getWidth,getTranslationX等的區別