code

package yan.testdemo;import android.app.Activity;import android.content.Context;import android.graphics.Point;import android.os.Bundle;import android.util.DisplayMetrics;import android.view.Display;import android.view.View;import android.view.ViewTreeObserver;import android.view.ViewTreeObserver.OnGlobalLayoutListener;import android.view.WindowManager;import android.widget.ImageView;import android.widget.TextView;public class MainActivity extends Activity {private ImageView imageView;private TextView textView;boolean hasMeasured = false;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);imageView = (ImageView) findViewById(R.id.main_img);textView = (TextView) findViewById(R.id.main_tv);// 获取屏幕宽高getScreenWH(this);// 获取控件宽高getControlWH();}// 获取屏幕宽高private void getScreenWH(Context context) {WindowManager manager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);// 方法1,获取屏幕的默认分辨率Display display = manager.getDefaultDisplay(); // getWindowManager().getDefaultDisplay();int screenWidth1 = display.getWidth(); // 屏幕宽(像素,如:480px)int screenHeight1 = display.getHeight(); // 屏幕高(像素,如:800px)System.out.println("1、宽=" + screenWidth1 + "px,高=" + screenHeight1+ "px");// 方法2,通过WindowManager获取DisplayMetrics dm = new DisplayMetrics();manager.getDefaultDisplay().getMetrics(dm);int screenWidth2 = dm.widthPixels; // 屏幕宽(px,如:480px)int screenHeight2 = dm.heightPixels; // 屏幕高(px,如:800px)System.out.println("2、宽=" + screenWidth2 + "px,高=" + screenHeight2+ "px");// 方法3,通过Resources获取DisplayMetrics dm2 = new DisplayMetrics();dm2 = getResources().getDisplayMetrics();int screenWidth3 = dm2.widthPixels; // 屏幕宽(像素,如:480px)int screenHeight3 = dm2.heightPixels; // 屏幕高(像素,如:800px)System.out.println("3、宽=" + screenWidth3 + "px,高=" + screenHeight3+ "px");/** * 可以看到,第一、第二种方法都用到了getWindowManager()这个方法,而第二种方法没有用getWindowManager()。 * getWindowManager()这个方法是在类Activity中的,如果编写的类不是继承于类Activity, * 那么必然在这个类中书写代码就不能用到getWindowManager()这个方法,只能应用第二种方法获取手机屏幕的大小。 */// 方法4,//Display display2 = getWindowManager().getDefaultDisplay();//Point point = new Point();//display.getRealSize(point);//int mScreenH = point.y;//int mScreenW = point.x;//System.out.println("4、宽=" + mScreenW + "px,高=" + mScreenH + "px");//float density = dm.density; // 屏幕密度(像素比例:0.75/1.0/1.5/2.0)//int densityDPI = dm.densityDpi; // 屏幕密度(每寸像素:120/160/240/320)//float xdpi = dm.xdpi;//float ydpi = dm.ydpi;//int screenWidthDip = (int) (dm2.widthPixels * density + 0.5f); // 屏幕宽(dip,如:320dip)//int screenHeightDip = (int) (dm2.heightPixels * density + 0.5f); // 屏幕宽(dip,如:533dip)//System.out.println("xdpi=" + xdpi + "; ydpi=" + ydpi);//System.out.println("density=" + density + "; densityDPI=" + densityDPI);//System.out.println("screenWidthDip=" + screenWidthDip + "; screenHeightDip=" + screenHeightDip);/** * 获取控件的宽高 根据view绘制流程,在onCreate中控件其实还并没有画好, * 换句话说,等onCreate方法执行完了,我们定义的控件才会被度量(measure), * 所以一般来说在onCreate方法里面通过view.getHeight()获取控件的高度或者宽度全是0, * 采用下面的方法,可以得到真实的宽高。 */}private void getControlWH() {// 方法一,此方法会加载onMeasure三次int w = View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED);int h = View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED);imageView.measure(w, h);int height = imageView.getMeasuredHeight();int width = imageView.getMeasuredWidth();textView.append("\n1:" + height + "," + width);// 方法二,需要注册一个ViewTreeObserver的监听回调,这个监听回调,就是专门监听绘图的,// 此方法会加载onMeasure二次,但是回调函数会回调很多次,所以在每次监听前判断hasMeasured,避免重复监听。// (如果是设置item的控件,则不需要hasMeasured)ViewTreeObserver vto = imageView.getViewTreeObserver();vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {public boolean onPreDraw() {if (hasMeasured == false) {int height = imageView.getMeasuredHeight();int width = imageView.getMeasuredWidth();textView.append("\n2:" + height + "," + width);hasMeasured = true;}return true;}});// 方法三,此方法会加载onMeasure二次,但是回调函数只回调一次// 与方法二基本相同,但他是全局的布局改变监听器,所以是最推荐使用。ViewTreeObserver vto2 = imageView.getViewTreeObserver();vto2.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {@Overridepublic void onGlobalLayout() {imageView.getViewTreeObserver().removeGlobalOnLayoutListener(this);textView.append("\n3:" + imageView.getHeight() + "," + imageView.getWidth());}});}}

比较Android中dip, dp, px, sp之间的区别:

dip: device independent pixels(设备独立像素). 不同设备有不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGA、HVGA和QVGA 推荐使用这个,不依赖像素。 
px: pixels(像素). 不同设备显示效果相同,一般我们HVGA代表320x480像素,这个用的比较多。 
pt: point,是一个标准的长度单位,1pt=1/72英寸,用于印刷业,非常简单易用; 
sp: scaled pixels(放大像素). 主要用于字体显示best for textsize,根据 google 的建议,TextView 的字号最好使用 sp 做单位。

过去,程序员通常以像素为单位设计计算机用户界面。例如,定义一个宽度为300像素的表单字段,列之间的间距为5个像素,图标大小为16×16像素 等。这样处理的问题在于,如果在一个每英寸点数(dpi)更高的新显示器上运行该程序,则用户界面会显得很小。在有些情况下,用户界面可能会小到难以看清 内容。 
与分辨率无关的度量单位可以解决这一问题,Android支持下列所有单位:
px(像素):屏幕上的点。 
in(英寸):长度单位。 
mm(毫米):长度单位。 
pt(磅):1/72英寸。 
dp(与密度无关的像素):一种基于屏幕密度的抽象单位。在每英寸160点的显示器上,1dp = 1px。 
dip:与dp相同,多用于android/ophone示例中。 
sp(与刻度无关的像素):与dp类似,但是可以根据用户的字体大小首选项进行缩放。


more:http://blog.csdn.net/zhangqijie001/article/details/5894872
欢迎交流:http://blog.csdn.net/ycwol/article/details/46915671


更多相关文章

  1. 导入第三方项目因gradle引起的不能运行问题
  2. Android(安卓)view中invalidate方法学习小节
  3. Android与HTML5交互模版
  4. Android(安卓)studio button 按钮 四种绑定事件的方法
  5. Android中的Parcelable接口和Serializable使用方法和差别
  6. Android线程安全问题分析与解决
  7. Android(安卓)软键盘弹出与关闭监听
  8. java 获取当前所有线程的两种方法 group和map
  9. Android(安卓)开发入门-常用控件的使用方法

随机推荐

  1. android电池充电以及电量检测驱动分析
  2. Eclipse For Android 代码自动提示功能
  3. Android的开发环境的搭建
  4. 用LinearLayout和RelativeLayout分别实现
  5. android5中数据存储方式详解
  6. 利用半透明对话框实现新浪微博android客
  7. android am命令用法
  8. 可视化操作Android的SQLite数据库
  9. android通过网络下载文字和Mp3的例子
  10. Cocos2d-x学习之创建Android工程和编译