DPI与layout

1.  LCDDPI计算

不同的LCD根据其分辨率计算其自身DPI 方式如下:

DPI=x2 + y20.5/ L,其中xyLCD的宽高,L为其对角线长度,单位为inch

如7.84 英寸的iPadmini 屏的DPI为:DPI768x1024= (7682+ 10242)0.5/ 7.84 = 1280/7.84 = 163

4.3.2.Android标准案中的DPI选择

原则上Android的应用布局及UI 样式可以根据DPI 的设置达到各种不同的选择及缩放

效果,但由于Google Play 的过滤机制以及部分APP 的兼容性问题,在Android 方案实现上

最好能够从160、213、240、320 四种DPI中选择配置方案。

4.3.3.方案的DPI设置

不同的DPI设置会决定运行时APP 选择什么样的系统资源配置,在Android 代码资源

文件中,我们会发现存在大量的类如layout、layout-sw600dp、layout-sw720dp 以及value、

value-sw600dp和value-sw720dp 的文件夹,这些文件夹就存放了不同的dp 实现下所对应的

资源文件。方案实际DPI 的设置需要修改android/device/softwinner/fiber-xxx/fiber-xxx.mk 文

件,添加ro.sf.lcd_density属性,如下行:

PRODUCT_PROPERTY_OVERRIDES += \

ro.sf.lcd_density=213 \

qemu.hw.mainkeys=0 \

persist.sys.hdmistate=100 \

persist.sys.usb.config=mass_storage,adb\

方案的DP实现计算方法如下:

DP = shortsize x 160 / dpi,其中shortsize 为短边像素数,dpi 为方案设置的设置的dpi 值,即lcd_density

选择资源文件的依据为:

1:当DP<600,将选择普通的layout、value 中的资源文件,即480dp 资源,表现为
Phone UI 界面

2:当600 < DP < 720,将选择600dp 的资源文件,表现为大屏手机UI,即PhoneTablet
UI(Nexus7 UI)

3:当DP > 720,将选择720dp 的资源文件,表现为Tablet UI 界面

方案配置DPI 的原则有两个:
1. LCD 实际DPI 就近原则
2. 所需要选择的资源类型
如1024x600 的7 寸LCD 的实际DPI 计算出来为170,设置为160 时其DP 为600 x 160
/ 160 = 600,这样就可以在运行时选择使用600dp 的资源文件;
又如1280x800 的7 寸LCD 的实际DPI 计算出来为216,设置为213 时其DP 为800 x 160
/ 213 = 601,因此在运行时同样选择使用600dp 的资源文件;如果选择160,其DP 计算出
为800,那么将选择720dp 的资源文件从而转换为Table UI,其效果可自行修改查看。

4.3.4. Layout冲突问题
选择合适的DPI 可以在方案实现上呈现出较为理想的屏幕表现效果,但是有时候在个
体方案实现时想要使用特定的UI 布局,就可能产生layout 设置冲突问题,如在768x1024
的7.84 屏上实现PhoneTablet UI 样式。
通常情况下此屏选择设置lcd_density 为160 可以达到较为理想的显示效果,即采用
Tablet 布局资源,因为其DP = 768 x 160 / 160 = 768dp,应用运行时将会采用720dp 的资源
文件。
如果我们想要在产品上表现出600dp 的布局,那么我们有2 种方法可以采用,如下:
1. 设置DPI,使其DP 大于600 并小于720,此时DPI 选择范围为171 ~ 204;
2. 选择更大的标准DPI,如213,此时其DP 计算出为576,小于600dp;
那么在此LCD 上如果想要实现大屏手机UI 便产生了layout 冲突。
在这两种方法中,第一种方法因为其dpi 值不是从标准dpi 中选择而来,从而会造成很
多APP 的布局适配问题(因为部分APP 仅对标准的几种布局进行适配),或者引起兼容性
导致的Google Play 过滤问题;第二种方法因Android 本身缺乏576dp 的资源文件,那么在
方案实现的时候就需要将系统相关的600dp 的资源文件复制一份并修改其名称为576dp,在
213dpi 设置下强制使用600dp 一样的参数值会在应用布局上产生巨大的变化,这样就会涉及
到各个系统应用资源文件的layout 和value 的调整问题,方案实现难度较大。
在目前A31s 的SDK2.0 中的fiber-a31st 方案中即采用了第二种方法, 请参考
fiber-xxx/overlay、framework/base/core/res/res 及packages/apps/Launcher2/res/目录下的576dp
的相关资源。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这段代码的作用是对"data"数据框的每个列进行数据可视化。 首先,通过"data.columns.tolist()"将"data"数据框的列名转换为列表,并将其存储在名为"column"的变量中。 然后,创建一个大小为(12, 4)且分辨率为128的图形对象,使用"plt.figure(figsize=(12,4), dpi=128)"。 接下来,使用循环遍历范围为8的整数,从1开始。在每次迭代中,使用"plt.subplot(2,4, i + 1)"创建一个2x4的子图网格,并选择当前迭代的子图。 然后,使用"sns.boxplot(data=data[column[i]], orient='v',width=0.5)"绘制第i个列的箱线图,其中"data=data[column[i]]"表示要绘制的数据,"orient='v'"表示箱线图的方向为垂直,"width=0.5"表示箱线图的宽度为0.5。 或者,使用"sns.kdeplot(data=data[column[i]],color='blue',shade=True)"绘制第i个列的核密度估计图,其中"data=data[column[i]]"表示要绘制的数据,"color='blue'"表示曲线的颜色为蓝色,"shade=True"表示在曲线下方填充阴影。 在每个子图中,使用"plt.ylabel(column[i], fontsize=12)"添加y轴标签,标签内容为当前迭代的列名。 通过"plt.tight_layout()"可以调整子图之间的间距和布局。 最后使用"plt.show()"显示图形。 另外,代码中还包含了一个额外的部分,使用"sns.pairplot(data[column],diag_kind='kde')"绘制了一个散点图矩阵,并选择了核密度估计作为对角线上的图形。然后使用"plt.savefig('Scatter plot.jpg',dpi=256)"将图形保存为名为"Scatter plot.jpg"的文件,分辨率为256 dpi
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值