红橙Darren视频笔记 界面优化与屏幕适配(下)

1.几个概念

1.1 屏幕尺寸

屏幕对角线的长度,单位是英寸,计算结果为根号下(屏幕宽度的平方+屏幕高度的平方)
注意屏幕宽度的平方和屏幕高度的平方的单位是英寸

1.2 px

像素,屏幕上最小绘制的点为一个像素

1.3 屏幕分辨率

也叫屏幕的物理尺寸
单位是px 比如一般的屏幕物理尺寸有768x1920,768x1280等等,这里的单位都是px,以768x1920为例,他的意思是该屏幕最多可以绘制768x1920个不重叠的点
我们可以使用以下命令获取手机的物理尺寸
adb shell wm size
Physical size: 768x1280

1.4 屏幕像素密度

单位是dpi(dot per inch),从字面理解,就是每平方英寸可以绘制多少个像素点。
例如768X1280的手机 屏幕尺寸是4.7英寸 那么他的像素密度 = (根号下(7682X12802))/4.7=317.6 约等于320
正经的算法应该是768x1280/(屏幕宽度英寸数x屏幕高度英寸数),但由于我们习惯使用屏幕对角线的长度作为屏幕尺寸,所以有了上面那种算法,计算结果其实相同
我们可以使用以下命令获取屏幕像素密度
adb shell wm density
Physical density: 320

1.5 dp

即dip 是Density Independent Pixels的缩写,意为密度无关的像素。之所以有这个单位,是为了在不同分辨率的屏幕上,显示出相同的效果。(物理尺寸相同)
在Android中规定 在mdpi的屏幕上(屏幕像素密度为160dpi) 1dp=1px

1.6 dp与px的转换

每个dp显示的px数目 = dp * (dpi / 160)
例如在屏幕像素密度为320的屏幕上 1dp = 2px

1.7 为什么需要dp

在屏幕像素密度160的设备 1平方英寸 显示160个像素点
在屏幕像素密度320的设备 0.5平方英寸 显示160个像素点
类似下图
在这里插入图片描述
因此,如果使用px作为单位 设置相同的px值 160的设备上显示的控件大小会比320的设备大

已知每个dp显示的px数目 = dp * (dpi / 160)

当前屏幕像素密度=160 假设此屏幕每平方英寸可以显示160个像素点
在当前屏幕 1dp = 1px 因此转化成dp就是160个dp点
屏幕像素密度=320 的屏幕上 每平方英寸可以显示320个像素点,
在当前屏幕 1dp = 2px 因此转换为dp就是160个dp点
也就是说,无论当前屏幕的像素密度是多少,每平方英寸显示的dp点个数相同。dp点的出现,目的是为了在所有类型的设备上设置相同的dp大小,在物理尺寸上显示相同的大小。

1.8 sp

sp的概念类似于dp 只不过sp只用于textSize

2 设备兼容性

参考:https://developer.android.com/training/multiscreen/screensizes

2.1 支持不同的屏幕分辨率或者支持不同尺寸的屏幕的建议

2.1.1 使用 ConstraintLayout

ConstraintLayout的功能类似ReletiveLayout但是GPU渲染性能更高,适合屏幕适配使用

2.1.2 避免使用硬编码的布局尺寸

避免使用dp 而是使用wrap_content以及match_parent,这样可以使此视图适应不同的屏幕尺寸

2.1.3 创建备用布局

关于各种布局的详细解释参考
https://developer.android.com/guide/topics/resources/providing-resources#ScreenSizeQualifier
创建的步骤如下
在这里插入图片描述

列举几个常用的备用布局
根据屏幕方向创建布局
在这里插入图片描述
最小宽度 layout-sw600dp 代表 当宽度>= 600dp 会使用该文件夹下面的布局

在这里插入图片描述
根据屏幕的宽高指定布局
在这里插入图片描述
根据屏幕尺寸创建布局
在这里插入图片描述
根据横竖屏创建布局
在这里插入图片描述
根据屏幕像素密度创建布局
查看DisplayMetrics源码可以知道常见屏幕分辨率

    /**
     * Standard quantized DPI for low-density screens.
     */
    public static final int DENSITY_LOW = 120;

    /**
     * Standard quantized DPI for medium-density screens.
     */
    public static final int DENSITY_MEDIUM = 160;

    /**
     * Standard quantized DPI for high-density screens.
     */
    public static final int DENSITY_HIGH = 240;

    /**
     * Standard quantized DPI for extra-high-density screens.
     */
    public static final int DENSITY_XHIGH = 320;

    /**
     * Standard quantized DPI for extra-extra-high-density screens.
     */
    public static final int DENSITY_XXHIGH = 480;

    /**
     * Standard quantized DPI for extra-extra-extra-high-density screens.  Applications
     * should not generally worry about this density; relying on XHIGH graphics
     * being scaled up to it should be sufficient for almost all cases.  A typical
     * use of this density would be 4K television screens -- 3840x2160, which
     * is 2x a traditional HD 1920x1080 screen which runs at DENSITY_XHIGH.
     */
    public static final int DENSITY_XXXHIGH = 640;

在这里插入图片描述
根据APIlevel创建布局
在这里插入图片描述
需要注意 虽然Android提供了方便的备用布局方案,比如横屏和竖屏,我们可以使用不同的布局来维护,但是这意味着我们的工作量double了,我们需要维护横屏和竖屏的两种界面,个人建议的方案是 对于复杂的界面(例如横屏和竖屏的界面差别太大,无法使用一个布局兼容横屏竖屏,其他例如分辨率 尺寸不同的情况类似),在这种情况下,我们才应该维护两套布局,否则,还是使用一个布局兼容横屏竖屏更优。
Tips:Android图片文件夹分两种 mipmap 中放图标 drawable中放普通图片

2.2 图片适配

可以使用.9图片和矢量图来进行适配,这两种图片在拉伸上都能很好的适配多种屏幕
如果使用位图Bitmap 则应该准备不同尺寸的Bitmap放到对应屏幕密度的文件夹,否则,如果Android使用图片时没有找到指定的密度下的文件,则会选取一个最接近当前屏幕密度下的图片进行缩放,因此可能存在失真模糊等情况。因此,我们需要在apk支持的主流屏幕密度下创建不同的位图资源
另外,如果我们希望某张图片在任何屏幕密度下面都不进行缩放,那么我们可以将他放到nodpi 的文件夹下

2.3 使用 Fragment 将界面组件模块化

在针对多种屏幕尺寸设计应用时,您希望确保不会在 Activity 之间不必要地重复界面行为。因此,您应该使用 Fragment 将界面逻辑提取到单独的组件中。然后,您可以组合 Fragment 以便在大屏幕设备上运行时创建多窗格布局,或者在手机上运行时将 Fragment 放置在单独的 Activity 中。
例如,平板电脑上的一款新闻应用可能在左侧显示报道列表,而在右侧显示一篇完整的报道。在左侧选择一篇报道时,会更新右侧的报道视图。但是,在手机上,这两个组件应显示在单独的屏幕上。从列表中选择一篇报道时,会改变整个屏幕以显示这篇报道。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值