问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

android 屏幕适配

发布网友 发布时间:2022-09-13 14:09

我来回答

1个回答

热心网友 时间:2024-04-10 18:20

@[TOC](文章目录)

<hr style=" border:solid; width:100px; height:1px;" color=#000000 size=1">

# 前言

<font color=#999AAA >使用工具Android studio,利用values文件下dimens.xml界面适配安卓屏幕</font>

<hr style=" border:solid; width:100px; height:1px;" color=#000000 size=1">

<font color=#999AAA >提示:以下是本篇文章正文内容,下面案例可供参考

# 一、概念

1.屏幕分辨率单位是px,例如Android手机常见的分辨率:320x480px、480x800px、720x1280px、1080x1920px。

2.手机屏幕的密度:每英寸的像素点数,单位是dpi。

| 密度类型 |代表的分辨率(px)| 屏幕像素密度(dpi) | 1dp转换为px |

|:--------|:--------|:--------|:--------|

| 低密度(ldpi) |240x320|120|0.75|

| 中密度(mdpi) |320x480|160|1|

| 高密度(hdpi)|480x800|240| 1.5|

| 超高密度(xhdpi)|720x1280|320|2|

| 超超高密度(xxhdpi) |1080x1920|480|3|

3.由于android的机型屏幕大小品类太多了,有一些是不标准的,这时我们就需要单独去获取屏幕的分辨率和密度了。

# 二、获取屏幕的分辨率和密度

```java

DisplayMetrics displayMetrics = getResources().getDisplayMetrics();

    float density = displayMetrics.density;

    int densityDpi = displayMetrics.densityDpi;

    int width = displayMetrics.widthPixels;

    int height = displayMetrics.heightPixels;

    Log.e("123","密度:"+density+"---"+densityDpi);

    Log.e("123","屏幕分辨率:"+width+"x"+height);

    Log.e("123","安卓系统:"+android.os.Build.VERSION.RELEASE);

    Log.e("123","手表型号:"+android.os.Build.PRODUCT);

```

# 三、SmallestWidth适配

**smallestWidth适配,或者叫sw限定符适配。指的是Android会识别屏幕可用高度和宽度的最小尺寸的dp值(其实就是手机的宽度值),然后根据识别到的结果去资源文件中寻找对应限定符的文件夹下的资源文件。**

**sw计算公式:sw = 屏幕宽度 / (dpi/160)  注:160是默认的**

**例如:屏幕宽度为1080px、480dpi 的sw = 1080/(480/160)**

# 四、生成 dimens 文件

1、 首先在 res 目录下新建各种尺寸的 values 文件 。文件名为:values-sw(你要适配屏幕的sw值)dp。

例如:

![code23](https://img-blog.csdnimg.cn/2020111311092374.PNG#pic_center)

注意:values文件下也生成 dimens文件

**生成dimens值工具类**

1、先生成标准的值。//value = (i + 1) * 1;

2、再用生成其他的值。 //value = (i + 1) * 需要生成的sw值/标准的sw值;

例如:value = (i + 1) * 160 / 320;

```java

public static void genDimen() {

        StringBuilder stringBuilder = new StringBuilder();

        try {

            double value;

            for (int i = 0; i < 500; i++) {

                //value = (i + 1) * 1; //这里控制对应转换的值,如果是标准尺寸就一对一转换

                //value = (i + 1) * 需要生成的sw值/标准的sw值; //这里控制对应转换的值

value = (i + 1) * 1

                //value = (i + 1) * 160 / 320;

                value = Math.round(value * 100) / 100;

//dp可改成sp

                stringBuilder.append("<dimen name=\"size_" + (i + 1) + "\">" + value + "dp</dimen>\r\n");

            }

            if (stringBuilder.length() > 4000) {

                for (int i = 0; i < stringBuilder.length(); i += 4000) {

                    if (i + 4000 < stringBuilder.length())

                        Log.e("123", stringBuilder.substring(i, i + 4000));

                    else

                        Log.e("123", stringBuilder.substring(i, stringBuilder.length()));

                }

            } else {

                Log.e("123", stringBuilder.toString());

            }

        } catch (Exception e) {

            e.printStackTrace();

        } finally {

        }

    }

```

示例:(我这是以sw320为适配的标准的,你们可改自己的标准)

1、sw320的样例

```java

<resources>

    <dimen name="dimen_1">1.0dp</dimen>

    <dimen name="dimen_2">2.0dp</dimen>

    <dimen name="dimen_3">3.0dp</dimen>

    <dimen name="dimen_4">4.0dp</dimen>

    <dimen name="dimen_5">5.0dp</dimen>

    <dimen name="dimen_6">6.0dp</dimen>

    <dimen name="dimen_7">7.0dp</dimen>

    <dimen name="dimen_8">8.0dp</dimen>

    <dimen name="dimen_9">9.0dp</dimen>

    <dimen name="dimen_10">10.0dp</dimen>

    <dimen name="size_1">1.0sp</dimen>

    <dimen name="size_2">2.0sp</dimen>

    <dimen name="size_3">3.0sp</dimen>

    <dimen name="size_4">4.0sp</dimen>

    <dimen name="size_5">5.0sp</dimen>

    <dimen name="size_6">6.0sp</dimen>

    <dimen name="size_7">7.0sp</dimen>

    <dimen name="size_8">8.0sp</dimen>

    <dimen name="size_9">9.0sp</dimen>

    <dimen name="size_10">10.0sp</dimen>

</resources>

```

2、sw160的样例

```java

<resources>

    <dimen name="dimen_1">0.0dp</dimen>

    <dimen name="dimen_2">1.0dp</dimen>

    <dimen name="dimen_3">1.0dp</dimen>

    <dimen name="dimen_4">2.0dp</dimen>

    <dimen name="dimen_5">2.0dp</dimen>

    <dimen name="dimen_6">3.0dp</dimen>

    <dimen name="dimen_7">3.0dp</dimen>

    <dimen name="dimen_8">4.0dp</dimen>

    <dimen name="dimen_9">4.0dp</dimen>

    <dimen name="dimen_10">5.0dp</dimen>

<dimen name="size_1">0.0sp</dimen>

    <dimen name="size_2">1.0sp</dimen>

    <dimen name="size_3">1.0sp</dimen>

    <dimen name="size_4">2.0sp</dimen>

    <dimen name="size_5">2.0sp</dimen>

    <dimen name="size_6">3.0sp</dimen>

    <dimen name="size_7">3.0sp</dimen>

    <dimen name="size_8">4.0sp</dimen>

    <dimen name="size_9">4.0sp</dimen>

    <dimen name="size_10">5.0sp</dimen>

</resources>

```

3、xml界面控件使用样例

```java

<TextView

        android:layout_width="@dimen/dimen_30"

        android:layout_height="@dimen/dimen_30"

        android:textSize="@dimen/size_20"

        android:layout_margin="@dimen/dimen_10"

        android:padding="@dimen/dimen_10">

```

<hr style=" border:solid; width:100px; height:1px;" color=#000000 size=1">

# 总结

<font color=#999999 >提示:这里对文章进行总结:

如果你的app需要适配dpi较低的屏幕,最好以最小dpi的sw为适配的标准。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
我的世界手游 我的世界手机上的基岩版登录后为什么不能联机? 我的世界为什么联机进不去 联机我的世界方法 聚四氟乙烯生料带价格是多少 如何选购聚四氟乙烯带 聚四氟乙烯多少钱 路由器的用户名和密码天翼宽带zxhnf420 我想用无线上网,电信送的猫是zxhn f420,我买了个路由器是WNR500的型号... 我买的保险十年的交完了退保能退多少钱 平安你险买一年三千五买了一年想退出退回多少钱? 我买的是人寿保险交了一年想退保能退多少钱? 魔兽冰封王座的暗夜怎样灭一个简单的? Android 兼容8.0及以上 App全局字体调节、禁止App字体随系统字体大小... Android创建桌面快捷方式(兼容Android 8.0) Android 8.0 解决不能自动安装APK问题(完美适配) Android8.0适配——targetSdkVersion 23升级26遇到的坑 苏州2013入秋时间 2022年秋老虎什么时候结束 22年宁波什么时候入秋 金鱼鱼鳍烂了是什么原因,怎么处理 烂鱼鳍怎么治? 锦鲤鱼鳍烂了怎么治疗,为什么会烂鳍 鱼鳍烂怎么办 魅族noto2在微信里怎么群发信息 32支化妆刷最大的那一支的作用及名称 QQ空间怎么能设置隐藏投票??? qq空间自己的投票答案怎么隐藏 除了星河湾之外,还有哪些只做豪宅的房地产商? 强蜡烛什么意思 ipad快剪辑怎么登陆 西华大学是一本还是二本?什么档次?西华大学2021录取分数线是多少?_百 ... 独生子女爱心保险是每年都有吗? Android 12启动页适配 ...最好电池禁用点 给点意见 什么品牌 以及手机 1394的用途 为什么不能用catch ill 能分泌胆汁的器官是( ) A、胃 B、胆囊 C、胰腺 D、肝脏 百度帐号的密码忘了怎么重新设置 四七汤的介绍 四七汤的同名异方 西游记第41回概括 微信收款账号是不是? 如何让别人看不到你的? 不是添加是想让好友点开我的头像后看不到 国际象棋中黑色的象代表什么 玛洛姿洗面奶去黑头吗 卡洛姿纸巾价格多少 厦门购房政策是什么 微信收款账号是不是? 现货术语解释。开仓,平仓,手数。今开仓,今平仓~~~只要是图片上的术语... 委曲求全成语 护肤品润肤霜和润肤露有什么区别