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屏幕适配方案(上)

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

Android最便捷的屏幕适配,堪称屏幕适配终结者

效果图 最大幅度解决适配问题,并且最大化方便开发者。 so,看下用法: 你没有看错,拿到设计稿,在布局文件里面直接填写对应的px即可,px:这里的px并非是Google不建议使用的px,...
  • qq_23477421
  • qq_23477421
  • 2016年07月04日 10:34
  • 2962

Android 屏幕适配方案(七)

一、 手机适配的应用和使用场景 使android应用程序适用于不同的国家语言、型号、尺寸和SDK版本等手机环境中,其主要功能和界面风格保持不变。 手机适配主要包括三个方面:语言适配、屏幕适配、SD...
  • weixin_37730482
  • weixin_37730482
  • 2017年09月22日 13:57
  • 287

安卓采用AutoLayout开源框架屏幕适配方案

一、概述 相信Android的开发者对于设配问题都比较苦恼,Google官方虽然给出了一系列的建议,但是想要单纯使用这些建议将设备很轻松的做好,还是相当困难的。个人也比较关注适配的问题,之前也发...
  • Me_Dong
  • Me_Dong
  • 2016年12月13日 13:12
  • 1548

Android 屏幕适配:各种解决方案

Android屏幕适配个种解决方案
  • lhzjllh
  • lhzjllh
  • 2017年12月28日 09:50
  • 407

Android 屏幕适配解决方案

大家好,简单说说android 屏幕的几个名词 1、dpi : 一英寸的屏幕中有多少点儿 2、密度 Density 一个点儿多少像素 px 3、分辨率 长宽多少像素 px 参考资料: ...
  • JackLittlePig
  • JackLittlePig
  • 2018年01月05日 11:45
  • 168

Android开发之--屏幕适配问题

前言 Android的屏幕适配一直以来都在折磨着我们Android开发者,本文将结合: Google的官方权威适配文档郭霖: Android官方提供的支持不同屏幕大小的全部方法Stormzha...
  • Angel_jn
  • Angel_jn
  • 2017年09月29日 22:39
  • 735

Android 屏幕适配方案

转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/45460089; 本文出自:【张鸿洋的博客】 1、概述大家在Andr...
  • lmj623565791
  • lmj623565791
  • 2015年05月04日 13:08
  • 318987

android开发之屏幕适配工具类

android开发之屏幕适配工具类 import android.content.Context; import android.util.DisplayMetrics; /** * 屏幕适...
  • kujing823
  • kujing823
  • 2016年11月09日 16:42
  • 234

Android屏幕适配方案(下)

我在上一篇屏幕适配方案中,介绍了一下关于屏幕适配所需要知道的一些基础知识,以及一些网上的屏幕适配方面的解决方案,那么这一片的目的,就是寻找一个适合的屏幕适配方案,来保持在我们的应用再各种机型中都能有良...
  • YANGDAHUAN
  • YANGDAHUAN
  • 2017年03月09日 16:01
  • 1301
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android屏幕适配
举报原因:
原因补充:

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