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