面试储备资料最近需要做的Android开发实用技巧

看了一定会有收获的屏幕适配全解析

2018-04-28  本文已影响330人  付凯强

1. 序言

2. 切图

3. 图片适配

① drawable-ldpi :低分辨率(用的少了,一般不再用)
② drawable-mdpi:中分辨率
③ drawable-hdpi:高分辨率
④ drawable-xdpi:较高分辨率
⑤ drawable-xxdpi:超级高分辨率
⑥ drawable-xxxhpi:顶级分辨率

4. 布局适配

① layout-800 * 480
② layout-1280 * 720
......

5. 权重适配

6. 尺寸适配

以400*320为基准,以宽举例:宽分为了320份:每份1.0px,那1280*720的宽的每份就是2.25px。
<resources>
<dimen name="x2">2.0px</dimen>
</resources>
<resources>
<dimen name="x2">3.0px</dimen>
</resources>
R.dimen.x2
@dimen/x2

7. 代码适配

Button button = (Button) findViewById(R.id.bt_main_button);
//获取手机屏幕的宽和高
int widthPixels = getResources().getDisplayMetrics().widthPixels;
int heightPixels = getResources().getDisplayMetrics().heightPixels;
//给button设置宽和高
ViewGroup.LayoutParams layoutParams = button.getLayoutParams();
layoutParams.width = widthPixels / 2;
layoutParams.height = heightPixels / 2;
button.setLayoutParams(layoutParams);

8. 获取屏幕参数

一个小黑点就是像素。
屏幕的对角线的长度。
整个屏幕一共有多少个点,也就是像素。
1. 每英寸中的像素数。
2. 假如设备分辨率为320*240,屏幕长2英寸宽1.5英寸,dpi=320/2 = 240/1.5 =160。
3. 对应于DisplayMetrics类中属性densityDpi的值。
1. 每平方英寸中的像素数。
2. density = dpi / 160 。
3. 对应于DisplayMetrics类中属性density的值 。
4. 可用于px与px与dip的互相转换 :dp = px / density 。
- 不同设备有不同的显示效果,不依赖像素。
- dp = px / density
- dp = px / (dpi / 160) 
- dpi(像素密度)为160 的设备上1dp = 1px。
用于字体显示。

9. dp转px、px转dp

public class Dp2Px {
    public static int dp2px(Context context, int dp) {
        return (int) (dp * context.getResources().getDisplayMetrics().density + 0.5);
    }

    public static int px2dp(Context context, int px) {
        return (int) (px / context.getResources().getDisplayMetrics().density + 0.5);
    }
}

说明:0.5 是为了避免损失精度。

10. 常见设备的dp、px、density的关系

density:0.75
分辨率:240*320 
关系:dp = px / 0.75
density:1
分辨率:320 * 480
关系:dp = px / 1
density:1.5
分辨率:480 * 800
关系:dp = px / 1.5
density:2.0
分辨率:720 * 1280 
关系:dp = px / 2
density:3
分辨率:1080 * 1920 
关系:dp = px / 3

11. 综上:

//以1280*720为基准:
//获取手机屏幕的宽和高
int widthPixels = getResources().getDisplayMetrics().widthPixels;
int heightPixels = getResources().getDisplayMetrics().heightPixels;
//density
float density = getResources().getDisplayMetrics().density;
//dpi
int densityDpi = getResources().getDisplayMetrics().densityDpi;
//1dp = 多少px
int px = Dp2Px.dp2px(this, 1);
//1px  = 多少dp
int dp = Dp2Px.px2dp(this, 1);
04-30 23:29:15.606 2484-2484/com.example.testscreen E/MainActivity: widthPixels: 720
04-30 23:29:15.606 2484-2484/com.example.testscreen E/MainActivity: heightPixels: 1280
04-30 23:29:15.606 2484-2484/com.example.testscreen E/MainActivity: density: 2.0
04-30 23:29:15.606 2484-2484/com.example.testscreen E/MainActivity: densityDpi: 320
04-30 23:29:15.606 2484-2484/com.example.testscreen E/MainActivity: px:2
04-30 23:29:15.606 2484-2484/com.example.testscreen E/MainActivity: dp:1

12. 最好适配(个人观点)

链接:https://pan.baidu.com/s/1jLXpQXs898hzIensZKV7gg 密码:6xgs

13. dimens-px 适配:

原理:根据市面上手机分辨率的占比分析,我们把1280和720设定为一个基准,然后其他分辨率根据这个基准做适配。

<?xml version="1.0" encoding="utf-8"?>
<resources><dimen name="x1">1.5/dimen>
<dimen name="x2">3.0px</dimen>
<dimen name="x3">4.5</dimen>
<dimen name="x4">6.0px</dimen>
<dimen name="x5">7.5px</dimen>

可以看到x1 = 480 / 基准 = 480 / 320 = 1.5 ;它的意思就是同样的1px,在320/480分辨率的手机上是1px,在480/800的分辨率的手机上就是1*1.5px,px会根据我们指定的不同values文件夹自动适配为合适的大小。

14. 后续

如果大家喜欢这篇文章,欢迎点赞;如果想看更多前端移动端后端Java或Python方面的技术,欢迎关注!

上一篇 下一篇

猜你喜欢

热点阅读