手机屏幕适配
让应用在不同分辨率下的手机有较好的显示效果。
1. 图片适配: 根据手机的像素密度,选择不同drawable文件夹下的图片
2. dimens 尺寸 适配:根据手机的像素密度,选择不同values文件夹下的dimens
3. 布局适配:根据手机的像素密度,选择不同layout文件夹下的布局
4. 代码适配:通过代码动态指定控件大小,达到适配效果
5. 权重适配:layout_weight:巧妙利用权重进行适配(将屏幕宽高 等分)
像素密度: 单位尺寸内的像素大小 dpi (dip,dp)
红米 note 1280x720 5.5寸
像素密度:对角线的像素的多少/尺寸
1638400 + 518400 = 1468 (对角线的像素的多少)
1468/5.5 = 267 dpi
xxdpi 与 像素密度dpi 关系
ldpi ~120dpi
mdpi ~16odpi
drawable/values(默认资源)
hdpi ~240dpi
xhdpi ~320dpi
xxhdpi ~480dpi
xxxhdpi ~640dpi
1. 图片适配: 根据手机的像素密度,选择不同drawable文件夹下的图片
默认情况下,会根据手机像素密度,加载对应drawable文件夹下的图片 (手机mdpi--drawable-mdpi)
在布局中使用同名文件图片,在不同的drawable下放入不同大小的a.jpg (a:不同大小的相同的图片)
如果对应drawable文件夹下没有当前图片,会向上查找:mdpi没有,hdpi——xhdpi——————
如果向上找,找不到对应的图片,才会向下查找。
drawable 是 大于mdpi 小于hdpi
在工作中,美工会给多套图片,放入对应的drawable文件夹下即可
2. dimens 尺寸 适配:根据手机的像素密度,选择不同values文件夹下的dimens
ldpi 1dp = 0.75px
mdpi 1dp = 1px
hdpi 1dp = 1.5px
xhdpi 1dp = 2.0px
hdpi 宽度 480px , 一半 240px
160dp * 1.5 = 240 px
xhdpi 宽度 800px 一半 400 px = 200dp
160dp *2 = 320px
使用dimens规则:
将布局中的dp抽取出来,放到dimens里即可。布局中通过@dimen/xxx调用
dp有一定的适配能力
在工作中,还是使用dp,如果测试时发现不视频的机型,针对某种机型,做dimens适配。
3. 布局适配:根据手机的像素密度,选择不同layout文件夹下的布局
谷歌推荐做法,当时公司不采用。layout布局编写非常麻烦,工作量大
layout-xhdpi 241-320dpi
layout-1280x720 : 某一个精确分辨率的手机适配
values-sw600dp : 手机最小边框长度,如果大于等于600dp ,就会选择此文件夹下的资源
4. 代码适配:通过代码动态指定控件大小,达到适配效果 (不要出现具体的px值)
1. 根据手机屏幕来设置控件大小
TextView textView = (TextView) findViewById(R.id.textview);
//获取屏幕宽度
int screenWidth = getResources().getDisplayMetrics().widthPixels;//屏幕宽度:px
int textViewWidth = (int) (screenWidth*0.8);
LayoutParams params = new LayoutParams(textViewWidth , LayoutParams.WRAP_CONTENT);
textView.setLayoutParams(params);
2. dp-px (工具)
/**
* 若代码中出现了具体的数字,其单位是px 需要根据手机的分辨率从 dip * 的单位 转成为 px(像素)
*/
public static int dip2px(Context context, float dpValue) {
final float scale = context.getResources().getDisplayMetrics().density; //屏幕的密度dpi
return (int) (dpValue * scale + 0.5f);
}
5. 权重适配:layout_weight:巧妙利用权重进行适配(将屏幕宽高 等分)
1. 屏幕平分
2. 将剩余控件分配给其中一个控件