Android开发之getX,getRawX,getWidth,getTranslationX等的区别

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/dmk877/article/details/51550031

转载请注明出处: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等,然后和后面打印的日志对比下,首先来看下代码:

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

猜你喜欢

转载自blog.csdn.net/dmk877/article/details/51550031