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

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 目录中得到标尺。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值