首先写上三个工具类(这三个工具类在哪里都可以进行使用,中小型企业通用)
JettApplication.java
/**
* 为了方便框架内部使用Application和得到context上下文.
*/
public class JettApplication extends Application {
private static JettApplication instance;
public static synchronized JettApplication getInstance() {
return instance;
}
@Override
public void onCreate() {
super.onCreate();
instance = this;
}
}
UIUtils.java
/**
* 用来按美工的基准值生成真实设备上需要的宽高值.
*/
public class UIUtils {
private static UIUtils instance;
public static final float STANDARD_WIDTH = 1080F;
//1920 - 48 48像素是做状态栏 电量WIFI等等.
public static final float STANDARD_HEIGHT = 1872F;
/**
* 基准值的默认值是48像素,但是有可能是其他的.
* 那么状态栏的高度怎么拿到呢?
* 我们可以通过安卓系统提供的一个类进行获取.
* com.android.internal下面有一个R文件,下面有一个内部类
* 在内部类里面定义了状态的宽高,可以通过反射拿到
*/
private static final String DIMEN_CLASS = "com.android.internal.R&dimen";
//"com.android.internal.R&dimen"里面的"system_bar_height"属性,状态栏的高度.
private static final String SYSTEM_BAR_HEIGHT = "system_bar_height";
//用来保存实际设备的值(在程序中取) 假设实际设备分辨率是480 800
public float displayMetricsWidth;
public float displayMetricsHeight;
public static synchronized UIUtils getInstance(Context mContext) {
if (instance == null) {
instance = new UIUtils(mContext);
}
return instance;
}
//初始化
private UIUtils(Context context) {
//获取屏幕的真实宽高
WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
//拿到DisplayMetrics对象后,在这里就可以存放宽高
DisplayMetrics displayMetrics = new DisplayMetrics();
if (this.displayMetricsWidth == 0.0F || this.displayMetricsHeight == 0.0F) {
//获取当前显示的宽度,存放到DisplayMetrics里面.
windowManager.getDefaultDisplay().getMetrics(displayMetrics);
//获取状态框的高度
int systemBarHeight = getSystemBarHeight(context);
//处理真实的宽和高
if (displayMetrics.widthPixels > displayMetrics.heightPixels) {
//横屏(因为是横屏,屏幕翻转了,原来的宽,变成了DisplayMetrics属性里面的高)
this.displayMetricsWidth = (float) displayMetrics.heightPixels;
this.displayMetricsHeight = (float) displayMetrics.widthPixels - systemBarHeight;
} else {
//竖屏
this.displayMetricsWidth = (float) displayMetrics.widthPixels;
this.displayMetricsHeight = (float) displayMetrics.heightPixels - systemBarHeight;
}
}
}
/**
* 获取状态框的高度
*/
private int getSystemBarHeight(Context context) {
return getValue(context, DIMEN_CLASS, SYSTEM_BAR_HEIGHT, 48);
}
/**
* @param context .
* @param attrGroupClass 安卓源码中找到的存放维度的类.
* @param attrName 状态框的信息.
* @param defValue 默认值.
* @return .
*/
private int getValue(Context context, String attrGroupClass, String attrName, int defValue) {
try {
//获取类.
Class e = Class.forName(attrGroupClass);
//拿到对应的实例.
Object obj = e.newInstance();
//获取里面的信息
Field field = e.getField(attrName);
//状态栏的高度(获取到的是一个ID,需要转换成真实的高度)
int x = Integer.parseInt(field.get(obj).toString());
//转换成真实的高度(像素的方式).
return context.getResources().getDimensionPixelOffset(x);
} catch (Exception exception) {
exception.printStackTrace();
}
return defValue;
}
/**
* 开始获取缩放以后的结果.
*
* @param width .
* @return .
*/
public float getWidth(float width) {
return width * this.displayMetricsWidth / STANDARD_WIDTH;
}
public float getHeight(float height) {
return height * this.displayMetricsHeight / STANDARD_HEIGHT;
}
}
ViewCalculateUtil.java
/**
* 获取调用层传入的值进行设置.
*/
public class ViewCalculateUtil {
public static void setViewLinearLayoutParam(View view, int width, int height, int topMargin, int bottomMargin, int leftMargin, int rightMargin) {
LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) view.getLayoutParams();
if (width != LinearLayout.LayoutParams.MATCH_PARENT && width != LinearLayout.LayoutParams.WRAP_CONTENT) {
layoutParams.width = (int) UIUtils.getInstance(JettApplication.getInstance()).getWidth(width);
} else {
layoutParams.width = width;
}
if (height != LinearLayout.LayoutParams.MATCH_PARENT && height != LinearLayout.LayoutParams.WRAP_CONTENT) {
layoutParams.height = (int) UIUtils.getInstance(JettApplication.getInstance()).getHeight(height);
} else {
layoutParams.height = height;
}
//height是竖着缩放
//width是横这缩放
layoutParams.topMargin = (int) UIUtils.getInstance(JettApplication.getInstance()).getHeight(topMargin);
layoutParams.bottomMargin = (int) UIUtils.getInstance(JettApplication.getInstance()).getHeight(bottomMargin);
layoutParams.leftMargin = (int) UIUtils.getInstance(JettApplication.getInstance()).getWidth(leftMargin);
layoutParams.rightMargin = (int) UIUtils.getInstance(JettApplication.getInstance()).getWidth(rightMargin);
view.setLayoutParams(layoutParams);
}
}
在Manifest里面进行设置application
<application
android:name=".JettApplication"
</application>
然而用的时候呢,完成
ViewCalculateUtil.setViewLinearLayoutParam(textView1, 1080, 1872, 0, 0, 0, 0);