android 屏幕适配(亲测最兼容方便)

2023-11-18

Android屏幕适配有很多方式:
·1、设置屏幕固定尺寸适配,例如适配1280x720,只适合少量固定屏幕的设备。
2、百分比布局,开发中多了很多代码。
3、通过密度值px转dp来适配,方便兼容,基本准确。
4、通过修改系统密度值适配,例如抖音适配方案,侵入太强,影响面太大。

下面就是生成密度标尺的工具类:

package example.lib.constants;


public enum DimenTypes {

    //适配Android 3.2以上   大部分手机的sw值集中在  300-460之间
    DP_sw__300(300),  // values-sw300
    DP_sw__310(310),
    DP_sw__320(320),
    DP_sw__330(330),
    DP_sw__340(340),
    DP_sw__350(350),
    DP_sw__360(360),
    DP_sw__370(370),
    DP_sw__380(380),
    DP_sw__390(390),
    DP_sw__410(410),
    DP_sw__420(420),
    DP_sw__430(430),
    DP_sw__440(440),
    DP_sw__450(450),
    DP_sw__460(460),
    DP_sw__470(470),
    DP_sw__480(480),
    DP_sw__490(490),

    DP_sw__400(400);
    // 想生成多少自己以此类推


    /**
     * 屏幕最小宽度
     */
    private int swWidthDp;




    DimenTypes(int swWidthDp) {

        this.swWidthDp = swWidthDp;
    }

    public int getSwWidthDp() {
        return swWidthDp;
    }

    public void setSwWidthDp(int swWidthDp) {
        this.swWidthDp = swWidthDp;
    }

}

二、

package example.lib.utils;


import android.util.Log;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Locale;

import example.lib.constants.DimenTypes;


public class MakeUtils {

    private static final String XML_HEADER = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n";
    private static final String XML_RESOURCE_START = "<resources>\r\n";
    private static final String XML_RESOURCE_END = "</resources>\r\n";
    private static final String XML_DIMEN_TEMPLETE = "<dimen name=\"qb_%1$spx_%2$d\">%3$.2fdp</dimen>\r\n";


    private static final String XML_BASE_DPI = "<dimen name=\"base_dpi\">%ddp</dimen>\r\n";
    private static final int MAX_SIZE = 1920;// 生成的最大尺寸

    /**
     * 生成的文件名
     */
    private static final String XML_NAME = "dimens.xml";
    private static final String TAG = "create_dimen";


    public static float px2dip(float pxValue, int sw, int designWidth) {
        float dpValue = (pxValue / (float) designWidth) * sw;
        BigDecimal bigDecimal = new BigDecimal(dpValue);
        return bigDecimal.setScale(2, RoundingMode.HALF_UP).floatValue();
    }


    /**
     * 生成所有的尺寸数据
     */
    private static String makeAllDimens(DimenTypes type, int designWidth) {
        float dpValue;
        String temp;
        StringBuilder sb = new StringBuilder();
        try {
            sb.append(XML_HEADER);
            sb.append(XML_RESOURCE_START);
            //备份生成的相关信息
            temp = String.format(Locale.getDefault(), XML_BASE_DPI, type.getSwWidthDp());
            sb.append(temp);

            for (int i = 0; i <= MAX_SIZE; i++) {
                dpValue = px2dip((float) i, type.getSwWidthDp(), designWidth);
                temp = String.format(Locale.getDefault(), XML_DIMEN_TEMPLETE, "", i, dpValue);
                sb.append(temp);
            }


            sb.append(XML_RESOURCE_END);
        } catch (Exception e) {
            e.printStackTrace();
            Log.i(TAG, "makeAllDimens: error:" + e.getMessage());
        }
        return sb.toString();
    }


    /**
     * 生成的目标文件夹
     * 只需传宽进来就行
     *
     * @param type     枚举类型
     * @param buildDir 生成的目标文件夹
     */
    public static void makeAll(int designWidth, DimenTypes type, String buildDir) {
        try {
            //生成规则
            final String folderName;
            if (type.getSwWidthDp() > 0) {
                //适配Android 3.2+
                folderName = "values-sw" + type.getSwWidthDp() + "dp";
            } else {
                return;
            }

            //生成目标目录
            File file = new File(buildDir + File.separator + folderName);
            if (!file.exists()) {
                boolean mkdirs = file.mkdirs();
                Log.i(TAG, "makeAll: mkdir:" + mkdirs);
            }

            //生成values文件
            FileOutputStream fos = new FileOutputStream(file.getAbsolutePath() + File.separator + XML_NAME);
            fos.write(makeAllDimens(type, designWidth).getBytes());
            fos.flush();
            fos.close();


        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

三、

package example.lib.generator;

import android.content.Context;

import java.io.File;

import example.lib.constants.DimenTypes;
import example.lib.utils.MakeUtils;

/**
 * 尺寸生成器 根据当前界面屏幕适配
 */
public class DimenGenerator {

    /**
     * 设计稿尺寸(将自己设计师的设计稿的宽度填入)
     */
    private static final int DESIGN_WIDTH = 1680;

    /**
     * 设计稿的高度  (将自己设计师的设计稿的高度填入)
     */
    private static final int DESIGN_HEIGHT = 2240;

    public static void makeSize(Context context) {
        int smallest = Math.min(DESIGN_WIDTH, DESIGN_HEIGHT);  //     求得最小宽度
        DimenTypes[] values = DimenTypes.values();
        for (DimenTypes value : values) {
            File file = context.getFilesDir();
            MakeUtils.makeAll(smallest, value, file.getAbsolutePath());
        }

    }

}

在程序中调用makesize 就可以在app file 目录中得到标尺。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

android 屏幕适配(亲测最兼容方便) 的相关文章

随机推荐

  • git仓库创建及上传

    如何创建一个git仓库并上传代码 1 在此之前我们需要安装git和注册gitee账号 1 打开git官网下载安装程序 然后按照指令进行安装即可 2 搜索gitee进行注册和绑定邮箱即可 上传代码时需要登录gitee账号 安装成功之后告诉本地
  • Android apk 反编译解析

    学习android开发 有必要对android的反编译有所了解 当然学习android反编译并不是为了破解别人的软件 完全是一种学习的方法 了解别人写程序的思想是一件很有趣的事情 工具下载地址 http code google com p
  • androidstudio开发!花三分钟看完这篇文章你就懂了!技术详细介绍

    阿里面试 自我介绍 首先要介绍自己的项目经验和个人的擅长点 因为面试官主要考察你的表达能力和语言精简能力 简历的编写其实这里可能需要注意几点 1 标题的直接按照姓名 几年工作经验 应聘岗位格式来填写 例如 黄铭 四年工作经验 Android
  • STP与RSTP区别

    STP 不能快速迁移 即使是在点对点链路或边缘端口 边缘端口指的是该端口直接与用户终端相连 而没有连接到其它设备或共享网段上 也必须等待2 倍的ForwardDelay 的时间延迟 端口才能迁移到转发状态 RSTP Rapid Spanni
  • Python 异步: 异步上下文管理器(17)

    动动发财的小手 点个赞吧 上下文管理器是一种 Python 构造 它提供了一个类似 try finally 的环境 具有一致的接口和方便的语法 例如通过 with 表达 它通常与资源一起使用 确保在我们完成资源后始终关闭或释放资源 无论资源
  • VC++ OpenCV+ZBar二维码识别

    利用OpenCV处理图像的优势 结合ZBar提高二维码识别结果 接口定义 include
  • SpringSecurity配置类--常用配置

    SpringSecurity配置类 在学习这门课的时候 实现各种功能时进行了各种配置 我想将各种配置综合讲述一下 首先自定义配置类 需要继承WebSecurityConfigurerAdapter这个类 在这个类里面做了一些默认配置 Con
  • linux grpc,grpc linux下的编译使用-Go语言中文社区

    1 一些工具安装 apt get install build essential autoconf libtool pkg config apt get install libgflags dev libgtest dev apt get
  • [转]IDEA 撤销 merge 操作(详解)

    目录 一 前言 二 解决方案 通过 Git Bash 命令行解决 1 合并过程中未发生冲突 2 合并过程中发生冲突 三 解决方案 通过 IDEA 解决 附带详细的操作图 1 合并过程中未发生冲突 2 合并过程中发生冲突 四 最后 作为一个开
  • 自己制作的 macOS Mojave 10.15.3 iso 文件,亲测可用(附 VMware15 安装 macOS Catalina 图文教程与 macO Catalina.iso 镜像下载地址)

    注 如果需要分享此资源 请注明原作者 不要把别人的东西当做自己的成果 也不要把别人免费分享出来的东西以有偿的方式去分享 自己制作的 macOS Mojave 10 15 3 iso 文件 亲测可用 已在 VMware 15 5 Player
  • AOSP 预置APP安装 以MicroG GmsCore.apk安装为例

    AOSP 预置APP 以MicroG为例 MicroG 无root安装教程 通过源码修改打开签名欺骗 预置不带源码的APP 其他 AOSP 安装谷歌三件套失败 开始寻找代替方案 尝试使用MicroG项目代替谷歌服务 目前情况 已成功安装 所
  • 第十八节 多核异构核间通信–ipcc

    由于MP157 是一款多核异构的芯片 其中既包含的高性能的A7 核及实时性强的M4 内核 那么这两种处理器在工作时 怎么互相协调配合呢 这就涉及到了核间通信的概念了 IPCC inter processor communication co
  • 【医学影像数据处理】2D/3D patch的crop和merge操作汇总

    在做3D分割任务中 多数的方法多采用整体缩放 或裁剪成一个个小的patch操作 这样做的一个主要原因是内存问题 相较于整体缩放 采用裁剪成patch的方法 对于小目标会更加的鲁棒 这也是大多数3D分割任务中常选取的方式 尤其是针对医学影像的
  • spring boot项目同时传递参数和文件的多种方式

    在开发接口中 遇到了需要同时接收参数和文件的情况 可以有多种方式实现文件 参数的接收 这里基于spring boot 3 vue 3 axios 做一个简单的代码演示 1 简单参数 文件参数 参数较少时 比较方便 直接参数接受即可 1 1
  • Mac上亲测好用的BlueStacks蓝叠安卓模拟器

    bluestacks mac是一款基于macOS系统打造的安卓模拟器 其优秀的稳定性 良好的兼容性一直是玩家的模拟器的首选哦 BlueStacks 4 for mac使Mac用户能够在他们的Mac上下载并享受他们喜欢的Android应用程序
  • vs2019运行asp.net framework(c# 基础) 排课系统的完整步骤

    前言 没想过有朝一日还会学net 毕竟java太强了 但因为特殊需要 还是学了一下net 发现她两真的好像呀 源码仓库 https gitee com web paul scheduling system 前期准备 vs2019 需要asp
  • Handler和Controller的区别

    以前一直以为这两个概念貌似是没有太大的区别 调研发现还是有一些区别的 Handler HandlerMapping接口实现从URL映射到请求处理程序bean 支持映射到bean实例和bean names Controller Base Co
  • 2021-08-10基于人脸识别的学生签到系统

    这是这学期web前端开发的大作业 因为要考研时间有限 很多功能只是先把页面做好了 没事实现和数据库的连接 用的数据大多数是在json中存储的 需求分析 一 教师端 功能需求 1登录 数据需求 用户名 密码 邮箱号 2能够管理课程 增加 删除
  • string16类型转string

    std string WChar2Ansi LPCWSTR pwszSrc int nLen WideCharToMultiByte CP ACP 0 pwszSrc 1 NULL 0 NULL NULL if nLen lt 0 retu
  • android 屏幕适配(亲测最兼容方便)

    Android屏幕适配有很多方式 1 设置屏幕固定尺寸适配 例如适配1280x720 只适合少量固定屏幕的设备 2 百分比布局 开发中多了很多代码 3 通过密度值px转dp来适配 方便兼容 基本准确 4 通过修改系统密度值适配 例如抖音适配