如何适应android碎片化的屏幕

在碎片化的Android设备中,设备的屏幕大小和密度也有很多类型,所以android帮我们定义了

四种大小类型:small,normal,large,xlarge

四种屏幕密度:ldpi(120dpi),mdpi(160dpi),hdpi(240dpi),xhdpi(320dpi)

(屏幕密度可以理解成单位面积的区域上有多少像素点,像素点越多,屏幕密度越大,显示得越清晰)


我们一般会用dp来定义长度,用sp来定义文字大小。

为什么要用dp来定义长度呢?原因很简单,当不使用dp定义长度的时候,ui元素会在低密度的屏幕上显示得很大或者在高密度的屏幕上显示的很小,如下图


但使用dp定义长度后效果就好多了,如下图




在实际工作中,ui的小伙伴们是以px来标识出长度的,这样我们就需要将px转换成dp,使用以下公式转换:

px = dp * (dpi / 160);

(ldpi(120dpi),mdpi(160dpi),hdpi(240dpi),xhdpi(320dpi))

我在网上看见类似以下的代码:


// The gesture threshold expressed in dp
private static final float GESTURE_THRESHOLD_DP = 16.0f;

// Get the screen's density scale
final float scale = getResources().getDisplayMetrics().density;
// Convert the dps to pixels, based on density scale
mGestureThreshold = (int) (GESTURE_THRESHOLD_DP * scale + 0.5f);

// Use mGestureThreshold as a distance in pixels...


使用以上的代码来把dp转换成px是因为针对特定的场景的,例如当用户的手指移动了16px以上就认为是一个scroll或者fill的手势,但是这样就出现一个问题,屏幕密度越高,移动的距离就会越短,这样在xhdpi的屏幕上,这个scroll或者fill的动作对于用户来说是太敏感了!

当我们使用图片的时候也要注意类似的问题

这里我首先介绍两个定义

1.pre-scaling of resources:这个很简单,我们的项目中有drawable-ldpi,drawable-mdpi,drawable-hdpi,drawable-xhdpi这几个文件夹中就放着pre-scaling的图片


2.auto-scaling of pixel dimensions and coordinates:当在manifest文件中设置android:anyDensity=“false”,或者用编码的方式设置bitmap的inScaled为false的时候,系统会自动在显示的时候转换绝对的px坐标和长度,使ui元素还是能正确地以在mdpi中应该显示的大小显示出来。

接下来介绍一个bitmap对象在runtime期间是如何转换的。


当我们创建一个 bitmap 对象的时候,系统首先会假设该bitmap对象是在mdpi上设计的,默认地,系统会在显示的时候auto-scaling bitmap。如果bitmap没有设置density属性,系统就会使用auto-scaling去处理它,auto-scaling处理的结果就像你没有为该资源在不同的dpi上设置相应的资源造成的效果一样。


如果你设置pre-scaling设置为false,那么系统就会在显示的时候使用auto-scaling,换句话,这样做就是用auto-scaling去代替了pre-scaling,这样会浪费更多的cpu资源但是占用了更少的存储空间。


另外我们还可以使用ViewConfiguration去获取系统的公共长度,速度和时间,例如

private static final int GESTURE_THRESHOLD_DP = ViewConfiguration.get(myContext).getScaledTouchSlop();

ViewConfiguration中以getScaled开头的方法保证了返回的px值都是适应当前的屏幕的。

                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值