Android屏幕适配

原创 2016年05月31日 09:26:51

1.概述

在进行Android开发时,都会面对一个棘手的问题,那就是针对各种屏幕尺寸的适配问题。这是由于Android系统的开放性,任何用户,开发者,OEM厂商,还有运营商都可以对Android进行客制化。随着Android的发展,各路硬件厂商的加入,Android碎片化的程度不断加深。为了让我们开发的程序能够能美观的显示在不同的尺寸,分辨率,密度的设备上,我们需要在开发过程中进行处理,今天我们探讨的便是对我们应用开发影响较大的屏幕碎片化。

2.基本概念

要想熟练掌握android屏幕适配,首先要学习几个重要的概念。

px:Pixel的缩写,表示像素。目前关于设备分辨率都是用像素为基本的单位。而且在许多情况下,比如UI设计,Android系统API中都是以px作为计量单位,像是获取屏幕的宽和高表示屏幕横向排列多少个像素,纵向排列多少个像素。

dpi:dots per inch,表示每一英寸上像素的数量。这个值是由设备厂商自身决定的。单位英寸上的像素越多表明屏幕越清晰,分辨率越大。由于在一英寸上,可出现不同的像素数量,Google于是规定在Android中,每英寸中像素点为160作为标准设备,所以以160dpi为基准。
目前Android项目中,使用ldpi、mdpi、hdpi、xdpi、xxdpi来修改drawable和values文件夹,用来区分不同像素密度下的图片和尺寸值。
Google官方指定按照下列标准进行区分:
这里写图片描述
在设计drawable中的图片资源时,针对上面的6种像素密度,可以按照0.75:1:1.5:2:3:4的比例进行裁剪缩放。(目前像ldpi类型的屏幕现在基本淘汰,不需要太关注)

dip和dp:device independent pixel,即与设备无关的像素,这是Android开发中特有的度量。目前在应用开发中使用该单位来设置控件的大小。它不表示任何具体的长度或者像素点,这个值只在具体的屏幕密度的手机上,才会被转换为具体的像素值。转换公式:
px = dp * (dpi/160) 或 px = dp * density;

sp:scale independent pixel,即与缩放比例无关的像素,与dp类似,是设置字体大小的专用单位。

3.单位间的转化

为了方便dp,sp单位值等转化为具体的px值,Android的API提供了工具类TypedValue,来方便操作。
TypedValue.applyDimension(int unit, float value,DisplayMetrics metrics)。
参数unit:传入参数的单位,比如COMPLEX_UNIT_SP,COMPLEX_UNIT_DIP等。
参数value:传入具体的值。
参数metris:引用类型用来显示区域的属性的值。

TypedValue.applyDimension中具体源码如下:

public static float applyDimension(int unit, float value,
                                       DisplayMetrics metrics)
    {
        switch (unit) {
        case COMPLEX_UNIT_PX:
            return value;
        case COMPLEX_UNIT_DIP:
            return value * metrics.density;
        case COMPLEX_UNIT_SP:
            return value * metrics.scaledDensity;
        case COMPLEX_UNIT_PT:
            return value * metrics.xdpi * (1.0f/72);
        case COMPLEX_UNIT_IN:
            return value * metrics.xdpi;
        case COMPLEX_UNIT_MM:
            return value * metrics.xdpi * (1.0f/25.4f);
        }
        return 0;
    }

根据上述的代码,我们可以总结出自己的转换工具类如下:

public class ConvertUtil {

    private ConvertUtil() {
        //not allowed initialize
        throw new UnsupportedOperationException("not allowed initialize");
    }

    //dp转换为px
    public static int convertDp2Px(Context context, float dip) {
        float scale = context.getResources().getDisplayMetrics().density;
        return (int) (dip * scale + 0.5f * (dip >= 0 ? 1 : -1));
    }

    //px转换为dp
    public static int convertPx2Dp(Context context, float px) {
        float scale = context.getResources().getDisplayMetrics().density;
        return (int) (px / scale + 0.5f * (px >= 0 ? 1 : -1));
    }

    //sp转换为px
    public static int convertSp2px(Context context, float spValue) {
        float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
        return (int) (spValue * fontScale + 0.5f);
    }

    //px转换为sp
    public static int convertPx2sp(Context context, float pxValue) {
        float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
        return (int) (pxValue / fontScale + 0.5f);
    }

}

4.屏幕适配具体选择方案

1.在布局中,多使用wrap_content,match_parent,layout_weight,来设置控件的大小。它们会自适应各种屏幕尺寸。其中android:layout_weight是线性布局LinearLayout的特有属性,表示该控件在剩余空间中的比例。
2.使用尺寸限定符,比如在res下,新建layout-large或layout-sw600dp之类的目录,系统就会在较大屏幕(例如 7 英寸或更大的平板电脑)和屏幕最小宽度大于600dp的设备上选择此布局。或者使用布局别名,定义不同尺寸的values资源,来分别对应不同的layout,要避免平板电脑和电视的文件出现重复(以及由此带来的维护问题),您可以使用别名文件。例如,您可以定义以下布局:
res/layout/main.xml,单面板布局
res/layout/main_twopanes.xml,双面板布局
然后添加这两个文件:
res/values-large/layout.xml:
这里写图片描述
res/values-sw600dp/layout.xml:
这里写图片描述
3.使用.9的资源图片。左边和上边是拉伸区域,右边和下边是内容显示区域。
4.在给控件设置具体大小时,使用dp,文字大小使用sp单位。

相关文章推荐

Android屏幕适配工具

  • 2017年09月15日 09:55
  • 171KB
  • 下载

Android屏幕适配相关工具

  • 2017年07月25日 16:08
  • 9KB
  • 下载

Android 6.0新特性之WebView不能适配屏幕解决方案

Android 6.0新特性 Doze当设备进行充电时 设备静止且灭屏一段时间 周期 平台尝试 让系统处于休眠 周期性的进入一个维持窗口正常操作 然后进入休眠状态 AppLink 应用程序连接 ...

android手机屏幕适配

  • 2015年08月14日 09:00
  • 2.35MB
  • 下载

android:环信demo(已屏幕适配)

  • 2015年12月24日 16:03
  • 22.35MB
  • 下载

Android屏幕适配方案(上)

Android开发中,屏幕适配始终是第一个要解决的问题,这一点在实际写的时候其实我们都会注意,然而现在我觉得整理一下屏幕适配方面的知识以便记录,博客写的太少,始终得多记录一下 首先关于屏幕,主流的...

Android屏幕旋转适配

  • 2016年04月24日 15:13
  • 22.97MB
  • 下载

最易懂的Android屏幕适配解决方案--总结版

本文参考自: Google的官方权威适配文档 郭霖: Android官方提供的支持不同屏幕大小的全部方法 Stormzhang:Android 屏幕适配 鸿洋:Androi...

Android屏幕适配

  • 2015年05月04日 22:53
  • 476KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android屏幕适配
举报原因:
原因补充:

(最多只允许输入30个字)