android 用java写一个自动适配各种屏幕大小的工具

Android 屏幕适配全攻略(下)-百变屏幕无压力,这才是Android屏幕适配的终极解决方案 但随着智能手机屏幕形态的不断创新,光靠这些基础做法已经不够,开发者们必须进一步掌握更多专业的适配技巧,才能应对屏幕百变的挑战。需要注意的是,不同的可折叠设备可能会有不同的窗口模式支持,开发者需要根据具体的设备和场景进行适配和调整。同时,可以利用 Android Studio 的设备模拟器来进行测试和调试。: 这个 API 可以让开发者获取到屏幕上的"凹槽"区域的信息,包括位置、尺寸等,从而可以更好地适配应用界面。通过这种方式,我们可以确保应用的界面能够完美适配异形全面屏,不会出现内容被"凹槽"遮挡的问题。 阅读详情

思路:假设我当前机器屏幕宽高为1920*1116,我页面某个组件的宽度为100px,那么在1280*800的机器上,按道理将应该是100/1920*1280=66.66px,那么讲道理思路就来了,如果我在1920*1116适配了,那么宽按照1280/1920,高按照800/1116换算不就可以了吗?

难点:写配置文件

1.在应用资源文件下形成文件,比如我当前机器为1920*1116,我想1280*800也能用,就是两个文件夹:values-1920x1116,values-1280x800


  private final static String VALUE_TEMPLATE = "values-{0}x{1}";

  System.out.print("TEST::"+w+"?"+h);
        File fileDir = new File(dirStr + File.separator
                + VALUE_TEMPLATE.replace("{0}", w + "")//
                .replace("{1}", h + ""));
        fileDir.mkdir();

2,如果当前我的机器为1920*1116,那么我的values-1920x1116里就应该有横向的适配文件和纵向的适配文件,

    private final static String WTemplate = "<dimen name=\"x{0}\">{1}px</dimen>\n";
    private final static String HTemplate = "<dimen name=\"y{0}\">{1}px</dimen>\n";
 private void generateXmlFile(int w, int h) {

        StringBuffer sbForWidth = new StringBuffer();
        sbForWidth.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n");
        sbForWidth.append("<resources>");
        float cellw = w * 1.0f / baseW;

        System.out.println("width : " + w + "," + baseW + "," + cellw);
        for (int i = 1; i < baseW; i++) {
            sbForWidth.append(WTemplate.replace("{0}", i + "").replace("{1}",
                    change(cellw * i) + ""));
        }
        sbForWidth.append(WTemplate.replace("{0}", baseW + "").replace("{1}",
                w + ""));
        sbForWidth.append("</resources>");

        StringBuffer sbForHeight = new StringBuffer();
        sbForHeight.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n");
        sbForHeight.append("<resources>");
        float cellh = h * 1.0f / baseH;
        System.out.println("height : " + h + "," + baseH + "," + cellh);
        for (int i = 1; i < baseH; i++) {
            sbForHeight.append(HTemplate.replace("{0}", i + "").replace("{1}",
                    change(cellh * i) + ""));
        }
        sbForHeight.append(HTemplate.replace("{0}", baseH + "").replace("{1}",
                h + ""));
        sbForHeight.append("</resources>");



        System.out.print("TEST::"+w+"?"+h);
        File fileDir = new File(dirStr + File.separator
                + VALUE_TEMPLATE.replace("{0}", w + "")//
                .replace("{1}", h + ""));
        fileDir.mkdir();

        File layxFile = new File(fileDir.getAbsolutePath(), "lay_x.xml");
        File layyFile = new File(fileDir.getAbsolutePath(), "lay_y.xml");
        try {
            PrintWriter pw = new PrintWriter(new FileOutputStream(layxFile));
            pw.print(sbForWidth.toString());
            pw.close();
            pw = new PrintWriter(new FileOutputStream(layyFile));
            pw.print(sbForHeight.toString());
            pw.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }

附件:
package com.wyt.hcy.customviewtestdemo;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintWriter;

/**
 * created by hcy 
 */
public class WytCreateValueFiles {

    private int baseW;
    private int baseH;

    private String dirStr = "./app/src/main/res";

    private final static String WTemplate = "<dimen name=\"x{0}\">{1}px</dimen>\n";
    private final static String HTemplate = "<dimen name=\"y{0}\">{1}px</dimen>\n";

    /**
     * {0}-HEIGHT
     */
    private final static String VALUE_TEMPLATE = "values-{0}x{1}";

    private static final String SUPPORT_DIMESION = "1920,1116;";

    private String supportStr = SUPPORT_DIMESION;

    public WytCreateValueFiles(int baseX, int baseY, String supportStr) {
        this.baseW = baseX;
        this.baseH = baseY;

        if (!this.supportStr.contains(baseX + "," + baseY)) {
            this.supportStr += baseX + "," + baseY + ";";
        }

        this.supportStr += validateInput(supportStr);

        System.out.println(supportStr);

        File dir = new File(dirStr);
        if (!dir.exists()) {
            dir.mkdir();

        }
        System.out.println(dir.getAbsoluteFile());

    }

    /**
     * @param supportStr w,h_...w,h;
     * @return
     */
    private String validateInput(String supportStr) {
        StringBuffer sb = new StringBuffer();
        String[] vals = supportStr.split("_");
        int w = -1;
        int h = -1;
        String[] wh;
        for (String val : vals) {
            try {
                if (val == null || val.trim().length() == 0)
                    continue;

                wh = val.split(",");
                w = Integer.parseInt(wh[0]);
                h = Integer.parseInt(wh[1]);
            } catch (Exception e) {
                System.out.println("skip invalidate params : w,h = " + val);
                continue;
            }
            sb.append(w + "," + h + ";");
        }

        return sb.toString();
    }

    public void generate() {
        String[] vals = supportStr.split(";");
        for (String val : vals) {
            String[] wh = val.split(",");
            generateXmlFile(Integer.parseInt(wh[0]), Integer.parseInt(wh[1]));
        }

    }

    private void generateXmlFile(int w, int h) {

        StringBuffer sbForWidth = new StringBuffer();
        sbForWidth.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n");
        sbForWidth.append("<resources>");
        float cellw = w * 1.0f / baseW;

        System.out.println("width : " + w + "," + baseW + "," + cellw);
        for (int i = 1; i < baseW; i++) {
            sbForWidth.append(WTemplate.replace("{0}", i + "").replace("{1}",
                    change(cellw * i) + ""));
        }
        sbForWidth.append(WTemplate.replace("{0}", baseW + "").replace("{1}",
                w + ""));
        sbForWidth.append("</resources>");

        StringBuffer sbForHeight = new StringBuffer();
        sbForHeight.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n");
        sbForHeight.append("<resources>");
        float cellh = h * 1.0f / baseH;
        System.out.println("height : " + h + "," + baseH + "," + cellh);
        for (int i = 1; i < baseH; i++) {
            sbForHeight.append(HTemplate.replace("{0}", i + "").replace("{1}",
                    change(cellh * i) + ""));
        }
        sbForHeight.append(HTemplate.replace("{0}", baseH + "").replace("{1}",
                h + ""));
        sbForHeight.append("</resources>");



        System.out.print("TEST::"+w+"?"+h);
        File fileDir = new File(dirStr + File.separator
                + VALUE_TEMPLATE.replace("{0}", w + "")//
                .replace("{1}", h + ""));
        fileDir.mkdir();

        File layxFile = new File(fileDir.getAbsolutePath(), "lay_x.xml");
        File layyFile = new File(fileDir.getAbsolutePath(), "lay_y.xml");
        try {
            PrintWriter pw = new PrintWriter(new FileOutputStream(layxFile));
            pw.print(sbForWidth.toString());
            pw.close();
            pw = new PrintWriter(new FileOutputStream(layyFile));
            pw.print(sbForHeight.toString());
            pw.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }

    public static float change(float a) {
        int temp = (int) (a * 100);
        return temp / 100f;
    }

    /**
     *
     * @param args
     */

    public static void main(String[] args) {
        //当前屏幕宽高
        int baseW = 1280;
        int baseH = 800;
        String addition = "";
        try {
            if (args.length >= 3) {
                baseW = Integer.parseInt(args[0]);
                baseH = Integer.parseInt(args[1]);
                addition = args[2];
            } else if (args.length >= 2) {
                baseW = Integer.parseInt(args[0]);
                baseH = Integer.parseInt(args[1]);
            } else if (args.length >= 1) {
                addition = args[0];
            }
        } catch (NumberFormatException e) {

            System.err
                    .println("right input params : java -jar xxx.jar width height w,h_w,h_..._w,h;");
            e.printStackTrace();
            System.exit(-1);
        }

        new WytCreateValueFiles(baseW, baseH, addition).generate();
    }

}

使用:如果当前机器为1280x800,那么就在

 public static void main(String[] args) {
        //当前屏幕宽高
        int baseW = 1280;
        int baseH = 800;
        String addition = "";
        try {
            if (args.length >= 3) {
                baseW = Integer.parseInt(args[0]);
                baseH = Integer.parseInt(args[1]);
                addition = args[2];
            } else if (args.length >= 2) {
                baseW = Integer.parseInt(args[0]);
                baseH = Integer.parseInt(args[1]);
            } else if (args.length >= 1) {
                addition = args[0];
            }
        } catch (NumberFormatException e) {

            System.err
                    .println("right input params : java -jar xxx.jar width height w,h_w,h_..._w,h;");
            e.printStackTrace();
            System.exit(-1);
        }

        new WytCreateValueFiles(baseW, baseH, addition).generate();
    }

我想适配1920*1116

private static final String SUPPORT_DIMESION = "1920,1116;1024,600;";

运行就会在app/src/main/res 下生成文件

    private String dirStr = "./app/src/main/res";

然后替换布局文件将

        <com.wyt.hcy.customviewtestdemo.MyTextView
            android:layout_width="200px"
            android:layout_height="200px"
            android:layout_centerInParent="true"
            android:background="#0f0"/>

  <com.wyt.hcy.customviewtestdemo.MyTextView
            android:layout_width="@dimen/x200"
            android:layout_height="@dimen/y200"
            android:layout_centerInParent="true"
            android:background="#0f0"/>
横向x纵向y










【Android】App 屏幕适配方案 自 Android 智能手机于2008年10月发布至今,已有十几年的历史,在这十几年里,Android 版本不断发生变化,搭载 Android 系统的设备也在不断的发生变化,屏幕的分辨率也从一开始的 320x480 分辨率到 1440x2560 分辨率。 阅读详情

相关推荐

讲一下Android屏幕适配的smallwidth方案

最小宽度是指屏幕的短边尺寸(以 dp 为单位),无论设备的方向如何,这个值都是固定的。例如,一个设备的分辨率为 1080x1920,那么它的最小宽度就是 1080dp(假设屏幕密度为 1)。方案是一种有效的 Android 屏幕适配方法,可以帮助开发人员实现更加灵活和精细的界面适配。通过合理地划分最小宽度范围、创建资源目录和定义资源,可以为不同屏幕尺寸的设备提供最佳的用户体验。方案是一种屏幕适配方案,主要用于解决不同屏幕尺寸和分辨率下应用界面的适配问题。在 Android 中,

challenge51all的专栏 1822

java软件屏幕大小转换,android 用java写一个自动适配各种屏幕大小的工具

android 用java写一个自动适配各种屏幕大小的工具,假设我当前机器屏幕宽高为1920*1116,我页面某个组件的宽度为100px,那么在1280*800的机器上,按道理将应该是100/1920*1280=66.66px,那么讲道理思路就来了,如果我在1920*1116适配了,那么宽按照1280/1920,高按照800/1116换算不就可以了吗?难点:写配置文件1.在应用资源文件下形成文件,...

weixin_36054032的博客 291

Android 屏幕适配

一、适配方式之dp名词解释分辨率:480*800,1280*720。表示物理屏幕区域内像素点的总和。(切记:跟屏幕适配没有任何关系)因为我们既可以把1280*720 的分辨率做到4.0 的手机上面。我也可以把1280*720 的分辨率做到5.0 英寸的手机上面,如果分辨率相同,手机屏幕越小清晰。px:pixels 的意思,像素,就是屏幕中最小的一个显示单元,是屏幕的物理像素点,与密度相关,密度大了,

JackChan 1434

Android 屏幕适配(修改系统字体大小、显示大小、修改分辨率相关适配)

qiAndroid实际开发中会遇到各种各样的机型,所以就需要对多种机型进行适配。常见的适配在这类就不详细介绍了,大家可以参考这里的系列文章Android通用屏幕适配讲解的已经很详细了。下面说的是:当修改系统的字体大小、显示大小、默认分辨率的情况下,如何明智的进行适配。 一、修改系统字体大小与显示大小: 设置--->显示--->字体与显示大小: 会看到有如下两项: ...

红日 3万+

屏幕分辨率修改

屏幕分辨率修改2.01汉化专业版by八神屏幕分辨率修改2.01汉化专业版by八神.apk )

android 屏幕适配 diens文件自动生成源码

将源码复制到eclipse java项目下 在main方法中 修改相应的尺寸 即可生成相应的values-480*320 values-800*480 等尺寸文件

android字体大小多屏幕适配

在android中,我们有两种情况可以设置字体大小。一种是在xml页面中,另一种是在javada

LUOMUSHA的专栏 1万+

一款非常实用的屏幕缩放软件

在教学中,实用投影仪时,电脑屏幕上的字比较小,很不利于教学,有了这款软件你就可以随意缩放屏幕,让教学变得越来越简单。

android自动生成dimens适配文件,无需Java工具类

** android自动生成dimens适配文件 ** 在编写ui界面时因为手机分辨率大小不同,所以展现出来的效果也是不同的,这个时候就需要考虑适配器,让根据手机分辨率自动适配相应尺寸来展示界面,可以提高用户的体验感。 1.首先安装插件ScreenMatch,安装成功之后android studio会提示重启 作者:성간 조각

屏幕随便放到缩小

很好用的小软件,屏幕随便放大缩小,很好用的

屏幕尺寸工具类

屏幕尺寸工具类

Android 屏幕适配基础

不同屏幕密度下,1p显示的物理长度不同 1dp在不同屏幕上显示相同的物理长度 sp只用在字体上,和dp一样为了让在不同设备上有一致的显示效果搞清楚屏幕的各种单位含义,是屏幕适配的基础含义:手机对角线的物理尺寸单位:英寸(inch),1英寸=2.54cm含义:每英寸的像素点数单位:dpi(dots per ich) 该屏幕的dpi=density*160dpi 在Android中,规定以160dpi(即屏幕分辨率为320x480 5.7英寸)为基准:1dp=1px含义:density-independent

嘴巴吃糖了 1356

java实现屏幕录制和播放(包含录音)

用java写了个录视频的小程序, 录制后文件默认保存在系统临时目录, 录制视频和麦克风声音, 播放时回车键进入全屏, esc退出全屏, 希望能对有兴趣的朋友提供参考 已重写新版原生java生成FLV格式视频文件 请看https://download.youkuaiyun.com/download/dgqjava/85092817

Android屏幕自动适配开源项目推荐

Android屏幕自动适配开源项目推荐 一、项目基础介绍 本项目是由开源社区贡献的Android屏幕自动适配框架,主要使用Java语言开发。项目旨在帮助开发者解决Android应用在不同屏幕尺寸和分辨率设备上的适配问题,使得UI布局能够在不同设备上保持一致性和美观性。 二、项目核心功能 自动计算屏幕尺寸比例:根据设备屏幕的实际尺寸与设计图尺寸,计算出比例。 自动调整控件尺寸:根据比例自动调整控件...

gitblog_00167的博客 330

android屏幕适配dimens文件及dimens文件生成器

包含: 1.大多数android手机屏幕分辨率的dimens文件 2.dimens文件生成工具(可以按自己设定的分辨率生成dimens文件) 3.dimens文件生成工具使用说明的相关文章

android安卓制作自适应各种手机屏幕大小的app_极品.zip

android安卓制作自适应各种手机屏幕大小的app_极品.zip

客户端交互设计适配之——屏幕大小

随着各个手机操作系统的应用平台的上线,几乎所有的互联网应用都在往手机上迁移。然而手机与PC 不一样,PC经过了多年的发展,在设计上形成了很多不成文的规则,如网页的宽度都在960px左右【当然,由于整体的电脑屏幕往大尺寸及高分辨发展,除了背景宽屏自适应外,不少网页也正朝着更宽的方向上发展】。当前的手机种类繁多,手机屏幕的大小、比例各异,并且手机的屏幕本身就小,因此既要考虑应用在不同屏幕大小上的适配,

nzf_001的专栏nzf_001的专栏nzf_001的专栏nzf_001的专栏nzf_001的专栏 895

FreeRTOS:卡在configASSERT( ( pxQueue ) )问题的解决

FreeRTOS卡在configASSERT( ( pxQueue ) )问题的解决

qq_42007164的博客 9564
上一篇: Android 链接Wifi
下一篇: Python3 积累一些简单文件传输协议(TFTP)的知识点
泡温泉的咸鱼
博客等级 码龄11年 39粉丝 48原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值