修改Android手机的分辨率和屏幕密度
不要总想着万全之策,写了就是给自己看的,写错了改就行了。
原文:https://blog.csdn.net/CrazyApes/article/details/116994631
前言
之前一直不知道手机的DPI还可以修改,以前测试我都是用好几个测试机,或者通过修改开发者模式下的最小宽度去看适配的问题。呐,前段时间朋友说可以直接用adb改,赶紧记下来,省的以后忘了。
方式一
工具
adb 命令
准备
adb shell
命令
$ wm size
$ wm density
分辨率
wm size [reset|WxH|WdpxHdp]
return or override display size. width and height in pixels unless suffixed with 'dp'.
查看分辨率:wm size
修改分辨率:wm size 1440x2560
还原初设置:wm size reset
测试机:华为 FRD-DL00
Microsoft Windows [版本 10.0.18363.1500]
(c) 2019 Microsoft Corporation。保留所有权利。
C:\Users\BigMoom>adb shell
HWFRD:/ $ wm size // 查看
Physical size: 1080x1920 // 返回默认值
HWFRD:/ $ wm size 1440x2560 // 设置为 1440x2560
HWFRD:/ $ wm size // 重新查看
Physical size: 1080x1920 // 硬件默认值
Override size: 1440x2560 // 重写输入的值
HWFRD:/ $ wm size reset // 还原默认值
HWFRD:/ $ wm size // 重新查看
Physical size: 1080x1920 // 已被还原的硬件默认值
屏幕密度
wm density [reset|DENSITY]
查看密度:wm density
修改密度:wm density 480
还原设置:wm density reset
测试机:华为 FRD-DL00
Microsoft Windows [版本 10.0.18363.1500]
(c) 2019 Microsoft Corporation。保留所有权利。
C:\Users\BigMoom>adb shell
HWFRD:/ $ wm density // 查看
Physical density: 480 // 返回默认值
HWFRD:/ $ wm density 320 // 设置为 320
HWFRD:/ $ wm density // 重新查看
Physical density: 480 // 硬件默认值
Override density: 320 // 重写输入的值
HWFRD:/ $ wm density reset // 还原默认值
HWFRD:/ $ wm density // 重新查看
Physical density: 480 // 已被还原的硬件默认值
可能遇到的问题
1. 换了个小米手机测试,发现报了权限错误。
Security exception: Must hold permission android.permission.WRITE_SECURE_SETTINGS
dandelion:/ $ wm density 480
Security exception: Must hold permission android.permission.WRITE_SECURE_SETTINGS
java.lang.SecurityException: Must hold permission android.permission.WRITE_SECURE_SETTINGS
at com.android.server.wm.WindowManagerService.clearForcedDisplaySize(WindowManagerService.java:5687)
at com.android.server.wm.WindowManagerShellCommand.runDisplaySize(WindowManagerShellCommand.java:156)
at com.android.server.wm.WindowManagerShellCommand.onCommand(WindowManagerShellCommand.java:62)
at android.os.ShellCommand.exec(ShellCommand.java:111)
at com.android.server.wm.WindowManagerService.onShellCommand(WindowManagerService.java:1191)
at android.os.Binder.shellCommand(Binder.java:881)
at android.os.Binder.onTransact(Binder.java:765)
at android.view.IWindowManager$Stub.onTransact(IWindowManager.java:2574)
at com.android.server.wm.WindowManagerService.onTransact(WindowManagerService.java:1432)
at android.os.Binder.execTransactInternal(Binder.java:1021)
at android.os.Binder.execTransact(Binder.java:994)
咋搞嘞
莫慌,打开下开发者选项中的USB调试(安全设置)就行了。
其它命令
有时间可以都看一下,试一试,蛮好玩的。
HWFRD:/ $ wm
usage: wm [subcommand] [options]
wm size [reset|WxH|WdpxHdp]
wm density [reset|DENSITY]
wm overscan [reset|LEFT,TOP,RIGHT,BOTTOM]
wm scaling [off|auto]
wm screen-capture [userId] [true|false]
wm size: return or override display size.
width and height in pixels unless suffixed with 'dp'.
wm density: override display density.
wm overscan: set overscan area for display.
wm scaling: set display scaling mode.
wm screen-capture: enable/disable screen capture.
wm dismiss-keyguard: dismiss the keyguard, prompting the user for auth if necessary.
wm surface-trace: log surface commands to stdout in a binary format.
方式二
说起来巧了,就像前言说的我不知道手机可以改DPI,之前一直是用的开发者模式下的最小宽度修改来测试。后来发现,这个其实也是修改了DPI,仔细想想density和px还有dp的关系,就突然能明白为啥了。
工具
手机开发者模式
准备
首先得打开手机的开发者模式,咋打开应该不用说了把。
不知道的小伙伴可以试着去找到你手机的系统版本那里一顿狂点。
然后就有惊喜了。
比如:Redmi 9A
操作
咱就直接进入开发者选项里把。
找到绘图模块下的最小宽度 栏目。
点开之后直接输入想要的最小宽度就行了。
注意:这里是以dp为单位的。
如果你的UI设计图的宽度跟你的手机不符,开发的时候,可以尝试修改这个达到演示的目的。
如下:Redmi 9A
Redmi9A(1).png效果
由于输入的是宽度值,无法直观的看到density的变化,但是咱们可以用方式一去验证下,就可以看到它的变化是改了density的值的。
机型:Redmi 9A
Microsoft Windows [版本 10.0.18363.1500]
(c) 2019 Microsoft Corporation。保留所有权利。
C:\Users\Luffy>adb shell
# 修改最小宽度之前,最小宽度360dp
dandelion:/ $ wm size
Physical size: 720x1600
dandelion:/ $ wm density
Physical density: 320
# 修改最小宽度之后,最小宽度420dp
dandelion:/ $ wm size
Physical size: 720x1600
dandelion:/ $ wm density
Physical density: 320
Override density: 274
结语
可见,在分辨率不变的前提下,修改了最小宽度之后,设备的density发生了变化。
Android中的dp在渲染前会将dp转为px,计算公式:
px = density * dp;
density = dpi / 160;
px = dp * (dpi / 160);
参考文献
原文:https://blog.csdn.net/CrazyApes/article/details/116994631
参考:https://developer.android.google.cn/guide/practices/screens_support