Android 屏幕适配攻略(四)获取手机屏幕的相关信息 与动态设置控件的大小


1 动态获取手机屏幕的 屏幕密度与对应像素比例


例如在 320 * 480 尺寸为 3.2 英寸的手机 ,对应的像素密度应该为 160dpi 对应的像素比例应该是 1.0也就是 1dp = 1sp = 1px

DisplayMetrics display = new DisplayMetrics();
//将当前窗口的一些信息放在DisplayMetrics类中,
this.getWindowManager().getDefaultDisplay().getMetrics(display);


float density = display.density;
//输出结果是 dens: density is 1.0
Log.e("dens","density is "+density);

//获取屏幕像素密度
int densityDpi = display.densityDpi;
//输出结果是 160
Log.e("dens","densityDpi is "+densityDpi);


//获取屏幕的高度 结果单位 px
int heightPixels = display.heightPixels;
//输出结果是 heightPixels is 480
Log.e("dens","heightPixels is "+heightPixels);


//获取屏幕的宽度 结果单位 px
int widthPixels = display.widthPixels;
//输出结果是 widthPixels is 320
Log.e("dens","widthPixels is "+widthPixels);


//获取缩放比例
float scaledDensity = display.scaledDensity;
//输出结果是 scaledDensity is 1.0
Log.e("dens","scaledDensity is "+scaledDensity);

float xdpi = display.xdpi;
float ydpi = display.ydpi;

//输出结果是 xdpi is 160.0 ydpi 160.0
Log.e("dens","xdpi is "+xdpi+" ydpi "+ydpi);

2 动态设置控件的大小


例如在 720 * 1280 尺寸为 4.7 英寸的手机 ,对应的像素密度应该为 320dpi 对应的像素比例应该是 2.0也就是 1dp = 1sp = 2px

2.1 默认状态下的适配显示


在屏幕上设置显示一个TextView ,在布局文件中设置它的宽度为 100dp ,按照比例缩放规则,其显示在上述屏幕上的宽度应当为 200px

<TextView android:layout_width = "100dp"
android:layout_height = "44dp"
android:background = "#294881" />

2.2 动态设置为指定的宽度(单位为像素)


其实要实现这种效果,例如设置为指定的宽度 360 px就可,这里是书写java代码设置的方式

设置宽度为指定的像素单位,我们直接在java代码中写数字就可以,例如这里写的360,就代表在屏幕上显示的实际大小是360px

//获取TextView
TextView mTvMainShow = (TextView) findViewById(R.id.tv_main_show);

//获取TextView对应的LayoutParams
LayoutParams layoutParams = mTvMainShow.getLayoutParams();

if (layoutParams != null) {
//设置宽度为360px
layoutParams.width = 360;
}

2.3 动态设置为指定的宽度(单位为 dp)


在java代码中 动态设置TextView的宽度为 120dp的长度,设置为dp,意味着要随着屏幕的宽度的变化而变化,如果直接写成下面的方式,那么无论在何种手机何种屏幕上显示的大小 都是120px,并非我们期待的效果

//获取TextView
TextView mTvMainShow = (TextView) findViewById(R.id.tv_main_show);

//获取TextView对应的LayoutParams
LayoutParams layoutParams = mTvMainShow.getLayoutParams();

if (layoutParams != null) {
layoutParams.width = 120;
}


正确的做法应当是

在java代码中 获取像素密度缩放比例,也就是获取当前的屏幕像素密度计算与 160的比例(安卓中以160dip为标准基数),然后再120与缩放比例的计算结果赋值结TextView

DisplayMetrics display = new DisplayMetrics();
//将当前窗口的一些信息放在DisplayMetrics类中,
this.getWindowManager().getDefaultDisplay().getMetrics(display);

//获取缩放比例
float scaledDensity = display.scaledDensity;

//获取TextView
TextView mTvMainShow = (TextView) findViewById(R.id.tv_main_show);

//获取TextView对应的LayoutParams
LayoutParams layoutParams = mTvMainShow.getLayoutParams();

if (layoutParams != null) {

layoutParams.width = (int) (120 * scaledDensity);
}


在 720 * 1280 尺寸为 4.7 英寸的手机 ,对应的像素密度应该为 320dpi 对应的像素比例应该是 2.0也就是 1dp = 1sp = 2px

这里设置的为 120dp, 那么在这款手机屏幕上的显示的宽度应当是 240px