Android设备兼容处理(二):屏幕适配

前言

要做好屏幕适配最重要的是了解当前市场设备分布,目前主流设备可以分为三类,4.7-5.5英寸的中屏手机,5.5-7.0的大屏手机,以及7.0英寸以上的平板。分辨率则是720P,1080P和2K。

看一下实际开发场景:比如现在一台5.0英寸1080P(1080x1920)的手机,屏幕密度就是440dpi,dpi等级都是和160做比较,属于xxhdpi(超超高),也就是常说的3X,屏幕宽度就是1080/(440/160) = 392dp, 如果有个Button的宽度是196dp那么在这部手机显示就是宽度一半。 假设另一部手机是6.0英寸1080P,那么屏幕密度是366dpi屏幕宽度是1080/(366/160)= 471dp,刚才那个Button就占了不到一半,看起来就显得“小了”。可见,dp也不是那么靠谱啊。

有人已经想到了解决方案,直接把Button的宽度设为屏幕宽度一半就OK了。可如果Button不是在线性布局中呢,weight属性是不能用了,现在假设可以设置为屏幕宽度一半。如果app运行在10英寸的平板上,你脑补一下是什么效果,半屏幕长的按钮。。。

我用一个按钮的例子,引出了屏幕适配的问题,下面看下解决办法,分为三个阶段。

屏幕密度适配:手机(4.7寸-5.5英寸)

1.在 XML 布局文件中指定尺寸时使用 wrap_content、match_parent 或 dp 单位 。
2.不要在应用代码中使用硬编码的像素值,用dp转换
3.不要使用 AbsoluteLayout(已弃用)
4.为不同屏幕密度提供多套图片,放到对应的目录,不能只提供最小大批的图片,因为图片拉伸消耗内存而且拉伸后效果不好。
5.对需要拉伸的有内容图片提供.9图片

为何叫屏幕密度适配,就是4.7-5.5的机型我们就当做尺寸一样的来处理,只不过dpi不一样而已,那么Android本身提供的dp单位就可以解决这个问题。

这是适配的第一阶段,如果你能做到这些适配已经完成了一大半,针对市场上流行的4.7-5.5英寸的手机,不管是720P,1080P还是2K的屏幕,Android会帮我们处理优化,在这些设备上不能完全精确但也不至于用户看着难受。

屏幕尺寸适配:手机(5.5寸-7英寸)

image.png

首先要知道dpi是个范围不是特定的数值,比如440dpi和500dpi都会划分到xxhdpi,前言中举的例子一个设备尺寸变大了,但是分辨率却没变大会导致dp失效。这种情况如果你的app在大尺寸手机上有用户量,并且你的界面控件有很多是dp做为宽度,那么建议做一下适配。
解决办法:
1.LinearLayout的weight属性
2.如果是其他布局类型,需要引入百分比布局(在Android提供的supprt库)

 compile 'com.android.support:percent:22.2.0'

用法:

<?xml version="1.0" encoding="utf-8"?>
<android.support.percent.PercentRelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.app2.MainActivity">
    <Button
        android:text="right:30%"
        android:layout_width="0dp"
        app:layout_widthPercent="30%"
        android:layout_height="50dp"
        android:id="@+id/btn3"
        android:layout_alignBaseline="@+id/btn2"
        android:layout_alignBottom="@+id/btn2"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true" />
    <Button
        android:text="left:30%"
        android:layout_width="0dp"
        app:layout_widthPercent="30%"
        android:layout_height="50dp"
        android:id="@+id/btn2"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true" />
</android.support.percent.PercentRelativeLayout>
image.png

这是屏幕适配的第二阶段,基本可以适配所有的手机设备了,还剩下一种就是平板

屏幕尺寸适配:平板(7英寸以上的平板)

上面讲的两种都是同一份布局文件,里面的控件的宽高用dp或者百分比来处理,在手机上看着还行,但是在平板上可能效果很差,控件宽度被拉伸太多不协调


image.png

这时只能针对设备尺寸,需要采用不同的布局文件,重新让UI设计大屏的布局。
1.采用res/layout-sw480dp,res/layout-sw600dp来区分不同的屏幕宽度,放多套布局文件在不同文件夹,app会根据设备款来自行选择的。


image.png

解释下这里res/layout-sw480dp的意思,sw的意思是smallest width最小宽度,用于指定屏幕两边的最小值,而不管设备 当前的方向如何。5.0英寸1080P(1080x1920)的手机屏幕宽度就是1080/(440/160) = 392dp,同样的1080P分辨率随着设备尺寸越来越大,屏幕宽度的dp值也会越来越大,大屏手机和小平板可能到480dp,再大点就是600dp,720dp等等。
2.为横屏平板增加layout-land布局文件
上面说到layout-sw480dp跟屏幕方向无关,那横屏其实也有属性字段,可以和sw结合起来用,比如


image.png

会在屏幕最小宽度大于480dp并且是横屏模式下展示,测试一下,还是上面那个布局,我在layout-sw480dp-land改成两个Button竖向排列,然后手动开启横屏看看看
1.gif

调试方法

布局写好了,可以在AndroidStudio2.2的布局预览中已经支持很多设备的调试了,不多介绍

image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容