屏幕适配

        控件的大小与距离使用 dp做为单位,这样的话,我们发开发出来的页面不会因为用户的个人设置而导致错乱,在设置字体大小的时候使用sp,这样的会也不会影响用户个人的一些设置,当然有些时候还会出现影响的。


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 



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值