屏幕适配全攻略

一、重要概念

屏幕尺寸:指平米的对角线的长度,单位是英寸,1英寸=2.54厘米,它对我们屏幕适配不是很重要。

屏幕分辨率:指在横纵向上的像素点数,单位是px,1px = 1个像素点,一般以纵向像素*横向像素,如1920*1080.
屏幕像素密度:指每英寸上的像素点数,单位是dpi,即“dot per inch”的缩写,像素密度与屏幕尺寸和分辨率有关

像素密度计算:对角线分辨率-->对角线分辨率除以屏幕尺寸-->像素密度

例:Nexus 5 屏幕尺寸是4.95,分辨率是1920*1080,则dpi=(√(1920*1920+1080*1080))/4.94=445

px:构成图像的最小单位 使用android原生api返回的都是这个单位,如获取安卓屏幕的宽和高<br>
dp、dip:Density Independent Pixels的缩写,即密度无关像素,以160dpi(像素密度)为基准,1dip = 1px

sp:Scale-Independent Pixels 可以根据文字大小首选项进行缩放 谷歌开发官方推荐使用12sp或以上大小单位,否则可能用户看不清楚
首选字体大小为12sp,14sp,18sp,22sp。不要使用基数小数,以免造成精度丢失

安卓屏幕密度划分:mdpi、hdpi、xdpi、xxdpi

设计文档:http://www.apkbus.com/design/style/iconography.html

在设计图标时,对于五种主流的像素密度(MDPI、HDPI、XHDPI、XXHDPI 和 XXXHDPI)应按照 2:3:4:6:8 的比例进行缩放。例如,一个启动图标的尺寸为48x48 dp,这表示在 MDPI 的屏幕上其实际尺寸应为 48x48 px,在 HDPI 的屏幕上其实际大小是 MDPI 的 1.5 倍 (72x72 px),在 XDPI 的屏幕上其实际大小是 MDPI 的 2 倍 (96x96 px),依此类推。

二、解决方案,支持各种屏幕尺寸

1、wrap_content(包住内容) match_content匹配父容器的大小,weight:权重,同时用了wrap_content 权重大的先学会拉伸。

layout_weight只能在线程布局里使用
计算的宽度= 原来宽度 + 剩余空间所占百分比的宽度
假设屏幕宽度为L

Button1
2/3L = L + (L - 2L)* 1/3 = 2/3L

用0dp
1/3L = 0 + L *1/3
Button2
1/3L = L + (L- 2L)*2/3 = 1/3L

2、使用large限定符

res/layout/main.xml 单面板

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <fragment android:id="@+id/headlines"
              android:layout_height="fill_parent"
              android:name="com.example.android.newsreader.HeadlinesFragment"
              android:layout_width="match_parent" />
</LinearLayout>

res/layout-large/main.xml 双面板

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="horizontal">
    <fragment android:id="@+id/headlines"
              android:layout_height="fill_parent"
              android:name="com.example.android.newsreader.HeadlinesFragment"
              android:layout_width="400dp"
              android:layout_marginRight="10dp"/>
    <fragment android:id="@+id/article"
              android:layout_height="fill_parent"
              android:name="com.example.android.newsreader.ArticleFragment"
              android:layout_width="fill_parent" />
</LinearLayout>

3、布局别名

使用布局别名

res/layout/main.xml: 			单面板布局
res/layout-large/main.xml: 		多面板布局
res/layout-sw600dp/main.xml: 	多面板布局

res/layout/main.xml  			单面板布局
res/layout/main_twopanes.xml 	双面板布局

setContentView(R.layout.main);

默认布局
res/values/layout.xml:
<resources>
    <item name="main" type="layout">@layout/main</item>
</resources>

Android3.2之前的平板布局
res/values-large/layout.xml:
<resources>
    <item name="main" type="layout">@layout/main_twopanes</item>
</resources>

Android3.2之后的平板布局
res/values-sw600dp/layout.xml:
<resources>
    <item name="main" type="layout">@layout/main_twopanes</item>
</resources>

4、屏幕宽度限定符

res/layout/main.xml,单面板(默认)布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <fragment android:id="@+id/headlines"
              android:layout_height="fill_parent"
              android:name="com.example.android.newsreader.HeadlinesFragment"
              android:layout_width="match_parent" />
</LinearLayout>

res/layout-sw600dp/main.xml,双面板布局:  Small Width 最小宽度

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="horizontal">
    <fragment android:id="@+id/headlines"
              android:layout_height="fill_parent"
              android:name="com.example.android.newsreader.HeadlinesFragment"
              android:layout_width="400dp"
              android:layout_marginRight="10dp"/>
    <fragment android:id="@+id/article"
              android:layout_height="fill_parent"
              android:name="com.example.android.newsreader.ArticleFragment"
              android:layout_width="fill_parent" />
</LinearLayout>

5、屏幕方向限定符

使用屏幕方向限定符

res/values-sw600dp-land/layouts.xml:
<resources>
    <item name="main" type="layout">@layout/main_twopanes</item>
</resources>

res/values-sw600dp-port/layouts.xml:
<resources>
    <item name="main" type="layout">@layout/main</item>
</resources>

小屏幕,纵向:				1.单面板
小屏幕,横向:				单面板
7 英寸平板电脑,纵向: 		2.单面板,带操作栏
7 英寸平板电脑,横向: 		3.双面板,宽,带操作栏
10 英寸平板电脑,纵向: 	4.双面板,窄,带操作栏
10 英寸平板电脑,横向: 	双面板,宽,带操作栏
电视,横向: 				双面板,宽,带操作栏

1.res/layout/onepane.xml:(单面板)
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <fragment android:id="@+id/headlines"
              android:layout_height="fill_parent"
              android:name="com.example.android.newsreader.HeadlinesFragment"
              android:layout_width="match_parent" />
</LinearLayout>

2.res/layout/onepane_with_bar.xml:(单面板带操作栏)
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <LinearLayout android:layout_width="match_parent"
                  android:id="@+id/linearLayout1"
                  android:gravity="center"
                  android:layout_height="50dp">
        <ImageView android:id="@+id/imageView1"
                   android:layout_height="wrap_content"
                   android:layout_width="wrap_content"
                   android:src="@drawable/logo"
                   android:paddingRight="30dp"
                   android:layout_gravity="left"
                   android:layout_weight="0" />
        <View android:layout_height="wrap_content"
              android:id="@+id/view1"
              android:layout_width="wrap_content"
              android:layout_weight="1" />
        <Button android:id="@+id/categorybutton"
                android:background="@drawable/button_bg"
                android:layout_height="match_parent"
                android:layout_weight="0"
                android:layout_width="120dp"
                style="@style/CategoryButtonStyle"/>
    </LinearLayout>

    <fragment android:id="@+id/headlines"
              android:layout_height="fill_parent"
              android:name="com.example.android.newsreader.HeadlinesFragment"
              android:layout_width="match_parent" />
</LinearLayout>

3.res/layout/twopanes.xml:(双面板,宽布局)
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="horizontal">
    <fragment android:id="@+id/headlines"
              android:layout_height="fill_parent"
              android:name="com.example.android.newsreader.HeadlinesFragment"
              android:layout_width="400dp"
              android:layout_marginRight="10dp"/>
    <fragment android:id="@+id/article"
              android:layout_height="fill_parent"
              android:name="com.example.android.newsreader.ArticleFragment"
              android:layout_width="fill_parent" />
</LinearLayout>

4.res/layout/twopanes_narrow.xml:(双面板,窄布局)
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="horizontal">
    <fragment android:id="@+id/headlines"
              android:layout_height="fill_parent"
              android:name="com.example.android.newsreader.HeadlinesFragment"
              android:layout_width="200dp"
              android:layout_marginRight="10dp"/>
    <fragment android:id="@+id/article"
              android:layout_height="fill_parent"
              android:name="com.example.android.newsreader.ArticleFragment"
              android:layout_width="fill_parent" />
</LinearLayout>

1.res/values/layouts.xml:
<resources>
    <item name="main_layout" type="layout">@layout/onepane_with_bar</item>
    <bool name="has_two_panes">false</bool>
</resources>

2.res/values-sw600dp-land/layouts.xml:
<resources>
    <item name="main_layout" type="layout">@layout/twopanes</item>
    <bool name="has_two_panes">true</bool>
</resources>

3.res/values-sw600dp-port/layouts.xml:
<resources>
    <item name="main_layout" type="layout">@layout/onepane</item>
    <bool name="has_two_panes">false</bool>
</resources>

4.res/values-large-land/layouts.xml:
<resources>
    <item name="main_layout" type="layout">@layout/twopanes</item>
    <bool name="has_two_panes">true</bool>
</resources>

5.res/values-large-port/layouts.xml:
<resources>
    <item name="main_layout" type="layout">@layout/twopanes_narrow</item>
    <bool name="has_two_panes">true</bool>
</resources>

6、.9图的使用

目录为:sdk->tools->draw9patch.bat

主要是通过在这四条边画一个像素长度的点或线,来控制想要进行拉伸或者添加间隔的操作。
左边和上边的线控制的是拉伸区域(Stretchable area),这两条线的中心交集区域就是要
进行的拉伸区域;而右边和下边的两条线控制的是间隔区域(Padding box),这两条边是可选的,这个区域用来写内容

三、解决方案,支持各种屏幕密度

1.使用非密度制约像素

android:layout_alignParentRight="true"

2.提供备用位图

多提供几张图片。使用和目标文件夹相符的文件夹,占用内存小,因为图标放大的时候内存也会增加。

3、代码适配

dp和px的关系: dp = px/设备密度

public static int dp2px(Context ctx, float dp) {  
        float density = ctx.getResources().getDisplayMetrics().density;  
        int px = (int) (dp * density + 0.5f);// 四舍五入  
  
        return px;  
    }  
  
    public static float px2dp(Context ctx, int px) {  
        float density = ctx.getResources().getDisplayMetrics().density;  
        float dp = px / density;  
  
        return dp;  
    }

四、实施自适应用户界面流自适应

平板和手机设备:重复使用活动中的片段,用一个标志位,处理屏幕方向变化。

时间: 2024-09-19 03:24:46

屏幕适配全攻略的相关文章

Android屏幕适配全攻略(最权威的官方适配指导)

转载请注明出处:http://blog.csdn.net/zhaokaiqiang1992 Android的屏幕适配一直以来都在折磨着我们这些开发者,本篇文章以Google的官方文档为基础,全面而深入的讲解了Android屏幕适配的原因.重要概念.解决方案及最佳实践,我相信如果你能认真的学习本文,对于Android的屏幕适配,你将有所收获! Android屏幕适配出现的原因 重要概念 屏幕尺寸 屏幕分辨率 屏幕像素密度 dpdipdpisppx mdpihdpixdpixxdpi 解决方案 支持

用C#制作PDF文件全攻略

攻略 前 言丽水市汽车运输集团有限公司信息中心 苟安廷PDF文件是目前比较流行的电子文档格式,在办公自动化(OA)等软件的开发中,经常要用到该格式,但介绍如何制作PDF格式文件的资料非常少,在网上搜来搜去,都转贴的是同一段"暴力"破解的方法,代码片断如下: StreamWriter pPDF=new StreamWriter(filePath); ArrayList xRefs=new ArrayList(); float yPos =0f; long streamStart=0; l

上网用傲游之--傲游浏览器强悍截图全攻略

  众所周知,傲游浏览器拥有众多实用功能.在新版(V2.5.1)的"傲游"里面,就有这样一款非常实用的功能--屏幕截图. 立即下载:http://www.duote.com/soft/8181.html 图1:傲游浏览器屏幕截图工具栏 相信朋友们都用过QQ的截图功能吧,但是他仅适用于桌面的截图,而对一些特殊需要,例如网页全屏截图等方面根本不能满足用户的需求!但是傲游的这款截图功能则可以轻松办到,相当方便且智能化! 傲游浏览器截图功能不仅能满足所有的基于桌面的截图,对浏览网页.视频播放时

Win98注册表应用50例—注册表使用全攻略之十_注册表

Win98注册表应用300例-注册表使用全攻略之十 1.自动刷新 每次在窗口添加一个文件夹或删除一个对象后,须要按键对窗口 进行重新刷新,很麻烦.通过修改注册表可以达到自动刷新的目的. 点击HKEY_LOCAL_MACHINE\SYSTEM\CURRENTCONTRO LSET\CONTROL\UPDATE,修改 "UPDATEMODE"值,由"1"改为"0". 2.修改系统版权信息 点击HKEY_LOCAL_MACHINE\SOFTWARE\M

我的青春我做主 校园“潮人”购机全攻略

我的青春我做主 校园"潮人"购机全攻略 类型:厂商稿 作者:酷派 时间:2014-09-16 10:06:48 随着开学季的到来,同学们的电子设备迎来了新一轮"大换血",作为日常生活的必备品手机,势必要紧跟时尚,尤其是对于校园"潮人"来说.市面上的手机种类纷繁多样,到底哪一款手机独具青春潮流感? 对于尚且生活在校园象牙塔,大多没有足够经济实力的学生来说,他们内心更倾向买一款高性价比的手机,不在乎有多高的商务功能,更在意http://www.ali

注册表Win2000安全设置—注册表使用全攻略之十六_注册表

利用注册表Win2000安全设置-注册表使用全攻略之十六 注:更改的注册表项目位于HKEY_CURRENT_USER中. 如果针对某一用户,更改位于HKEY_USERS\(S-1-5-21-746137067-507921405-1060284298-500)(用户代码)下的相应键值. 1. 防止他人获取对Web页面的访问信息 HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\TypedURLs用于保存IE历史记录的,保存最近浏览的25

保存和配置系统硬件注册信息—注册表使用全攻略之十二_注册表

保存和配置系统硬件注册信息-注册表使用全攻略之十二 电脑用的时间长了,经常要更换一些硬件设备,重复安装驱动程序也就成了家常便饭,这样就致使电脑中残留下很多硬件注册信息,系统启动时就会试图与不存在的设备通讯,从而导致系统速度的下降.如何删除这些注册信息呢?格式化么?太麻烦了吧! 其实Windows有个"硬件配置文件"功能,它是用来告诉电脑在启动时启动哪些硬件设备,第一次安装Windows时,系统就默认创建了一个配置文件"Original Configuration"(

韩榜第一 《口袋侦探》第一章图文全攻略

<口袋侦探>第一章图文全攻略(1)[<口袋侦探>第二章图文攻略][<口袋侦探>第三章图文攻略][<口袋侦探>第四章图文攻略]第一章:侦探的技术进入游戏后,先挨个儿跟不同的黑影说话,在正前方的大屏幕上 就会有一个警官和你的 对话,对话结束后会让你选择一个女助手,不同的女助手在观察能力.情报能力以及心理能力上的属性都有所不同.首先进入浴室这里,当然受害人就在浴室中,然后在浴缸的外面也就是角落里有一个隐形眼镜,之后去查看洗漱台,发现洗漱台里面的水是溢出来的,查看完

修改注册表提高系统安全—注册表使用全攻略之十七_注册表

修改注册表提高系统安全-注册表使用全攻略之十七 一.隐藏一个服务器为保证局域网中服务器上的资源不受其他人的非法访问和攻击,有时需要把局域网中指定的服务器计算机名称隐藏起来,让其他局域网用户无法访问到    1.打开注册表编辑器,HKEY_LOCAL_ MACHINE \ SYSTEM \ CurrentControlSet \Services \ LanmanServer \ Parameters键值.2.用鼠标单击该键值下面的Hidden数值名称,如果未发现此名称,那么添加一个,其数据类型为R