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 = "\r\n";
private static final String XML_RESOURCE_START = "\r\n" ;
private static final String XML_RESOURCE_END = "\r\n";
private static final String XML_DIMEN_TEMPLETE = "%3$.2fdp \r\n";
private static final String XML_BASE_DPI = "%ddp \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 目录中得到标尺。