Android 屏幕适配

基本概念

相关术语

  • px:像素;
  • dpi:即densityDpi,每英寸中的像素数;
  • density:屏幕密度,density = dpi / 160;
  • scaledDensity:字体的缩放因子,正常情况下和density相等,可以通过调节系统字体大小改变该值。

android中的dp在渲染前会将dp转为px,公式如下:
p x = d e n s i t y ∗ d p px = density * dp px=densitydp

限定符匹配

匹配规则:当前dpi > 更高的dpi > 更低的dpi

以图片为例,图片资源的文件夹分为mdpi、hdpi、xhdpi xxhdpi xxxhdpi等。

假设当前设备密度为xhdpi,文件夹为上述5种,则查找顺序为:xhdpi > xxhdpi > xxxhdpi > hdpi > mdpi 。

XML布局适配

动态加载布局

给res目录中的子目录加上“-限定符”,可以给不同设备提供不同的资源以及布局。

指定屏幕大小:-sw+指定大小

例如限定480到1080屏幕,1080以上屏幕:layout-sw480dp,layout-sw1080dp

sw,Smallest-width,最小宽度限定符。

指定屏幕方向:-land、-port

创建自适应布局

思路:尽量不要把view宽高边距等写死,而是设置权重或百分比让其自适应。

缺点:绘图时为实现自适应需要反复测量计算布局的属性,增加开销。

方法

  1. 使用LinearLayout时,通过设置layout_weight让各个视图自适应大小。

  2. 推荐使用 ConstraintLayout 构建自适应界面

ConstraintLayout

百分比布局

设置水平和竖直方向百分比偏移,左上角为(0,0),右下角为(1,1)。

<TextView
    ...
	app:layout_constraintHorizontal_bias="0.2"
	app:layout_constraintVertical_bias="0.3"  />

在这里插入图片描述

设置宽高比

高固定,将宽设为高的两倍:将layout_width设为0,设置layout_constraintDimensionRatiov属性。

“2:1” → \rightarrow w:h = 2:1

“w,2:1” → \rightarrow w:h = 2:1

“h,2:1” → \rightarrow h:w = 2:1

<TextView
	android:layout_width="0dp"
    ...
	layout_constraintDimensionRatiov="2:1"  />

在这里插入图片描述

添加引导线

请点击工具栏中的 Guidelinesimg,添加一条用户看不见的引导线。
在这里插入图片描述

网格布局

使用链控制线性组,实现网格布局

样式功能
spread默认值
均匀分布
spread inside首尾固定在两端,中间均匀分布
weighted权重
packed紧挨在一起

官方示图如下:

img

对其不同尺寸的文字

TextView 自带边距,当同一段文字中,文字尺寸不同时,边距也不同。

如下图,若直接让两个View的底部对齐,会发现文字不在同一水平线上。

在这里插入图片描述
事实上,TextView中存在文本基线,右键点击要添加约束的文本视图,选择 Show Baseline,随后直接将该文本基线并拖到另一TextView的基线上。

在这里插入图片描述

图片适配

ScaleType属性

  1. FIT_开头的,都会对图片进行缩放;
  2. CENTER_开头的,图片的中心点会与ImageView的中心点重叠;
scaleType缩放展示位置缺点
FIT_CENTER(默认)
FIT_START
FIT_END
等比缩放居中
居左上
居右下
控件留白
FIT_XY非等比拉伸填满控件拉伸变形
CENTER不缩放居中控件留白/图片显示不全
CENTER_INSIDE等比缩小,不可放大居中控件留白
CENTER_CROP等比缩放居中填满控件图片显示不全

.9图

文件的后缀名是.9.png

左侧、上侧黑色横线:可拉伸区域

右侧、下侧黑色横线:内容区域

在这里插入图片描述

刘海屏适配

刘海区域位于状态栏中,若要全屏显示,则需适配。

参考

Android官网:支持刘海屏

小米:刘海屏、水滴屏、挖孔屏 Android P/Q 适配

vivo:全面屏应用适配指南

整体放缩

思路

重设屏幕属性:density、densityDpi、scaledDensity

核心代码

假设以宽为基准进行适配,设计图尺寸1920x1080,代码如下:

//获取设备原始值
val appDm = application.resources.displayMetrics
val appSD = appDm.scaledDensity
//增加对系统配置的监听,用于监听系统字体的改变
application.registerComponentCallbacks(object : ComponentCallbacks {
    override fun onConfigurationChanged(newConfig: Configuration) {
        if (newConfig!=null && newConfig.fontScale>0){
            appSD = application.resources.displayMetrics.scaledDensity
        }
    }

    override fun onLowMemory() {
    }
})

//计算目标值
val targetDensity = appDm.widthPixels / 1080;	//此以宽为基准,高同理。
val targetDensityDpi = (int) (targetDensity * 160);
val targetScaledDensity = appSD * (targetDensity / appDm.density);

//改变设备值
val dm = activity.resources.displayMetrics
dm.density = targetDensity;
dm.densityDpi = targetDensityDpi;
dm.scaledDensity = targetScaledDensity;

参考

Android官网:屏幕兼容性概览

今日头条:一种极低成本的Android屏幕适配方式
dDensity;


## 参考

[Android官网:屏幕兼容性概览](https://developer.android.google.cn/guide/practices/screens_support?hl=zh-cn)

[今日头条:一种极低成本的Android屏幕适配方式](https://mp.weixin.qq.com/s/d9QCoBP6kV9VSWvVldVVwA)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Uuln

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值