Android 屏幕适配

来源:互联网 发布:梦幻西游mac下载补丁 编辑:程序博客网 时间:2024/06/08 18:23

1. 重要概念
屏幕尺寸:屏幕对角线长度,单位英寸(inch),1 inch = 2.54 cm。
分辨率:屏幕宽高的像素数。
屏幕密度:每英寸的像素数。
px :像素。
ppi :就是屏幕密度,pixel per inch 的缩写。
dpi :也是屏幕密度,dot per inch 的缩写
dip :即 dp,像素无关密度,density independent pixel 的缩写。
sp :缩放无关像素,设计字体大小

2. drawable与屏幕密度的对应关系
这里写图片描述
总结:
①drawable 和 mdpi 是同级的关系

②屏幕类型 > 所在目录dpi时,图片会被放大,放大比例 = 屏幕密度 / 所在目录dpi

为了适配其他手机,让UI基于720*1280切一版图,提供一套主流屏幕密度的套图,为 hdpi 或 xxhdpi,其他屏幕密度的由系统自动的缩放得到,但是只有一套图的话,在对应的屏幕密度的手机下图片占用的内存最小,在其他屏幕密度下占用高内存
不同 dpi 下图片内存占用实践视频
④这个表的最后一行应该是 px/dp
px = dp * ppi/160;

DisplayMetrics displayMetrics = new DisplayMetrics();
displayMetrics = context.getResources().getDisplayMetrics();
float density = displayMetrics.density;
px = dp * density;

3. Android图片选择策略
①根据手机具体的屏幕密度向上选择最接近 drawable 文件夹,比如一个手机 252dpi 那么向上选择是 drawable-xhdpi 里的图。

②向上找不到那么向下一级找,找不到继续mdpi 或 drawable,最后才是 drawable-ldpi。
4. 视图布局的匹配
①布局宽高使用 wrap_content,match_parent,weight。

另外还可以引入谷歌百分比布局库 在AndroidStudio build.gradle 中添加 compile ‘com.android.support:percent:22.2.0’

<android.support.percent.PercentFrameLayout        android:layout_width="match_parent"        android:layout_height="match_parent">        <ImageView            android:layout_width="0dp"            android:layout_height="0dp"            app:layout_heightPercent="50%"            app:layout_widthPercent="50%"            android:src="@mipmap/ic_launcher"            />    </android.support.percent.PercentFrameLayout>

②使用尺寸限定符 res/layout 和 layout-large:当屏幕尺寸大于7英寸或者是平板时,系统选择 large 里的布局。适用于 3.2 之前

③使用最小宽限定符:layout-sw600dp,适用于安卓 3.2 之后的版本

④使用布局别名,解决上述 3.2 前后版本问题。

⑤使用自动拉伸位图(位于android sdk下的 tools 文件下的 draw9patch.bat):左上就是拉伸,右下是内容区域。可在布局中可使用属性android:padding = “0dp”置0。

5. 自适应用户界面
①现在的主流版本都是高于 3.2 版本的,使用最小宽限定符即可,因此有两套布局,低于 7 英寸使用 res/layout,高于则使用 res/layout-sw600dp
②定义个是否双面板的标记位 isTwopanes,在加载布局的时候通过判断双面板中不同的那个布局是否被加载来给 isTwopanes 赋值。
③根据 isTwopanes 的值来编写不同的逻辑代码

6. 动态设置
根据具体屏幕分辨率等一些属性设置值

7.常用方法

     /**     * 根据手机的分辨率从 dp 的单位 转成为 px(像素)     */    public static int dip2px(Context context, float dpValue) {        final float scale =         context.getResources().getDisplayMetrics().density;        return (int) (dpValue * scale + 0.5f);    }    /**     * 根据手机的分辨率从 px(像素) 的单位 转成为 dp     */    public static int px2dip(Context context, float pxValue) {        final float scale = context.getResources().getDisplayMetrics().density;        return (int) (pxValue / scale + 0.5f);    }    /**     * 获得手机屏幕的width,单位(px)     */    public static int getScreenWidth(Activity activity){        DisplayMetrics dm = new DisplayMetrics();        activity.getWindowManager().getDefaultDisplay().getMetrics(dm);        int screenWidth = dm.widthPixels;        return screenWidth;    }    /**     * 获得手机屏幕的height,单位(px)     */    public static int getScreenHeigth(Activity activity){        DisplayMetrics dm = new DisplayMetrics();        activity.getWindowManager().getDefaultDisplay().getMetrics(dm);        int screenHeigh = dm.heightPixels;        return screenHeigh;    }    /**     * 获得传入 View 的 height,单位(px)     */    public static int measureHeight(View view){        int w = View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED);        int h = View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED);        view.measure(w, h);        int height =view.getMeasuredHeight();        return height;    }    /**     * 获得传入 View 的 width,单位(px)     */    public static int measureWidth(View view){        int w = View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED);        int h = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);        view.measure(w, h);        int width =view.getMeasuredWidth();        return width;    }

参考 1,2,3
参考 4,5,6
Material Design 中文版
最新屏幕适配方案,推荐一看
百分比布局库使用示例
Android屏幕适配工具包(像素最大值是599px,sp最大值是49sp)

0 0