如何适应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))

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

  1. // 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去获取系统的公共长度,速度和时间,例如

<span class="kwd" style="color:#0088;">private</span><span class="pln" style="color:#000000;"> </span><span class="kwd" style="color:#0088;">static</span><span class="pln" style="color:#000000;"> </span><span class="kwd" style="color:#0088;">final</span><span class="pln" style="color:#000000;"> </span><span class="kwd" style="color:#0088;">int</span><span class="pln" style="color:#000000;"> GESTURE_THRESHOLD_DP </span><span class="pun" style="color:#66660;">=</span><span class="pln" style="color:#000000;"> </span><span class="typ" style="color:#66066;">ViewConfiguration</span><span class="pun" style="color:#66660;">.</span><span class="kwd" style="color:#0088;">get</span><span class="pun" style="color:#66660;">(</span><span class="pln" style="color:#000000;">myContext</span><span class="pun" style="color:#66660;">).</span><span class="pln" style="color:#000000;">getScaledTouchSlop</span><span class="pun" style="color:#66660;">();</span>

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

Android中dp、sp、px的转换和区别。

apk的资源包中

当屏幕density=240时,使用hdpi 标签的资源 当屏幕density=160时,使用mdpi标签的资源 当屏幕density=120时,使用ldpi标签的资源。 不加任何标签的资源是各种分辨率情况下共用的。 布局时尽量使用单位dip,少使用px

 

dp与px换算公式:

pixs =dips * (densityDpi/160). 

dips=(pixs*160)/densityDpi

 
/**  * 根据手机的分辨率从 dp 的单位 转成为 px(像素)  */ public static int dip2px(Context context, float dpValue) {  final float scale = context.getResources().getDisplayMetrics().density;  return (int) (dpValue * scale + 0.5f); }

dp与px转换的方法:

public static int dip2px(Context context, float dipValue){   final float scale = context.getResources().getDisplayMetrics().density;   return (int)(dipValue * scale +0.5f); }public static int px2dip(Context context, float pxValue){   final float scale = context.getResource().getDisplayMetrics().density;   return (int)(pxValue / scale +0.5f); }

名词


解释


Px

(Pixel像素)


不同设备显示效果相同。这里的“相同”是指像素数不会变,比如指定UI长度是100px,那不管分辨率是多少UI长度都是100px。也正是因为如此才造成了UI在小分辨率设备上被放大而失真,在大分辨率上被缩小。


Screen Size

(屏幕尺寸)


一般所说的手机屏幕大小如1.6英寸、1.9英寸、2.2英寸,都是指的对角线的长度,而不是手机面积。我们可以根据勾股定理获取手机的宽和长,当然还有面积。


Resolution

(分辨率)


指手机屏幕垂直和水平方向上的像素个数。比如分辨率是480*320,则指设备垂直方向有480个像素点,水平方向有320个像素点。


Dpi

(dots per inch

像素密度)


指每英寸中的像素数。如160dpi指手机水平或垂直方向上每英寸距离有160个像素点。假定设备分辨率为320*240,屏幕长2英寸宽1.5英寸,dpi=320/2=240/1.5=160

注意:该值对应于DisplayMetrics类中属性densityDpi的值


Density

(密度)


指每平方英寸中的像素数。

Density=Resolution/Screen size

注意:在DisplayMetrics类中属性density的值为dpi/160,可用于px与dip的互相转换


Dip

(Device-independent pixel,设备独立像素)


同dp,可作长度单位,不同设备有不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGA、HVGA和QVGA 推荐使用这个,不依赖像素。dip和具体像素值的对应公式是dip值 =设备密度/160* pixel值,可以看出在dpi(像素密度)为160dpi的设备上1px=1dip


Sp

(ScaledPixels

放大像素)


主要用于字体显示(best for textsize)。根据 google 的建议,TextView 的字号最好使用 sp 做单位,而且查看TextView的源码可知 Android 默认使用 sp 作为字号单位。

时间: 2024-11-05 18:27:28

如何适应android碎片化的屏幕的相关文章

Android碎片化的处理

产生碎片化的原因: 1.屏幕尺寸   small   normal   large   xlarge  xxlarge 2.屏幕分辨率 3.横纵屏幕 4.系统版本 碎片的解决: 1.dp/sp 系统未我们提供了可以规避部分碎片化的单位 2.针对不同的版本 系统提供android-support-v4包,可以让低版本的系统实现高版本的功能 引用外部的开源项目 3.解决横纵屏 步骤: 创建一个xml布局文件,文件名要相同,对应的控件的id也要相同 Resource type--->Layout---

Android应用如何支持屏幕多尺寸多分辨率问题

作为Android应用程序开发者都知道android是一个"碎片化"的世界.多种系统版本.多种尺寸.多种分辨率.多种机型,还有不同的厂商定制的不同ROM,你开发的应用会在不可预期的手机上报错.这给开发适配带来不小的难度.这篇文章会告诉我们怎么解决这个问题. 1.Android碎片化 1.1.android系统版本 Android更新较大的版本如下: 上面只有当前可用版本,Android L作为开发者版本没有出现其中,未来会有更多的版本.下图给出Android各个版本的占有率,这个是go

Android知识梳理之屏幕适配全攻略

 引言: 我相信Android碎片化问题是让所有的Android开发者都比较头疼的问题.尤其是屏幕适配这一块儿.想要自己的app在不同的设备上面都有一个比较好的显示效果.就必须做好相应的屏幕适配.本文是结合网上的相关知识总结.官方文档结合自己的一些理解来进行阐述的.如有不恰当的地方,欢迎斧正.共同学习. 转载请标明出处:http://blog.csdn.net/unreliable_narrator/article/details/51315776 我们先来了解两个概念:屏幕尺寸和屏幕的分辨率:

Android笔记:多分辨率适配及碎片化问题解决方案总结

一.适配多分辨率 1.官网介绍: http://developer.android.com/guide/practices/screens_support.html#qualifiers Screen characteristic Qualifier Description Size small Resources for small size screens. normal Resources for normal size screens. (This is the baseline siz

Android从开源到碎片化 开发者叛离的真相

Android从诞生开始就受到热捧,并日益普及.它有别于以往的手机及移动终端操作系统,其独具的开源性.系统廉价性和提供给第三方大自由度的创新空间,以及不受硬件约束的优势,获得了广大开放社群的支持.但是系统碎片化和收益不高等问题日益严重,正在逐渐被开发者所抛弃. Google推出的新一代网上平台Android Market,让开发者轻松地进入这个“市场”,手机用户可在该平台寻找.购买.下载使用Android操作系统的手机应用程序和其他内容,也可在Android Market上销售自己的软件,并通过

程序员MM的自白:磨人小妖精之安卓碎片化

文/腾讯优测 章婉霞 除了crash问题,Android平台的碎片化越来越受到移动开发的关注,且不谈支持Android系统的移动设备早已过万款,屏幕.品牌以及传感器等方面的碎片化问题也困扰着开发者. 初级Android的开发人员经常关心的问题就是开发的应用能不能在需求的设备上正常运行.为什么我没有说所有设备呢?长期盘踞各Android设备市场份额或市场关注度榜单前十位,被大家熟知的品牌,它们ROM的个性化都足以让人眼花缭乱了,更何况在如今"乱世"里那些七零八落的机型了.想要做更全面的自

关于Android WebView内容不同屏幕兼容处理

最近团队里项目开发APP时,其中有个界面要用到WebView来显示,而不用原生的控件. 开发这个界面的时候遇到一个问题,就是Android的碎片化导致有众多屏幕分辨率,不同分辨率的屏幕对这个界面WebView内的控件大小兼容的问题. 由于Android原生控件大小是由dp控制,而不是像素px,所以在不同尺寸的设备上的显示效果差异不会十分大. 而web的主要是由像素px控制,导致显示出来的效果在不同分辨率的屏幕上差异很大. 由于本人比较少接触web前端开发,一直没怎么了解web开发中是怎么处理屏幕

详解安卓Fragment(碎片化)

Fragment从字面意思理解就是碎片的意思,当然是为了解决安卓各类设备碎片化严重的问题,比如同样一个App在手机上显示效果还不错,但是一旦上了16:9的平板立刻就变了味,使用安卓平板的同学可能体(bei)会(keng)更深,为此Google官方从android 3.0(对应API 11)引入Fragment,简单理解就是把界面分割成很多碎片,然后根据实际要求最后选择性的进行拼接,比如在手机竖屏模式下只能显示一本书的目录列表,但是如果是横屏模式(也可以立即为平板模式)下就可以在屏幕的左半边显示目

Android插件化开发,初入殿堂

好久没有写博客了,这次准备写写我这几天的研究成果--Android插件化开发框架CJFrameForAndroid. 好久没有写博客了,这次准备写写我这几天的研究成果--Android插件化开发框架CJFrameForAndroid. 背景交代 首先,你需要知道什么是插件化开发.就拿最常见的QQ来说,在第三个界面动态那里有个管理,点开后可以选择很多的增植功能,这里腾讯只放了一些网页应用,那么如果未来想加入一个打飞机游戏,要怎么做?让用户重新安装吗,这就是插件化开发所解决的问题. 用一句话来概括插