1:资源文件适配方案
drawable(追我博):可曳的,可拉的
在drawable和layout文件后添加屏幕的尺寸,如下:
drawable-320x320 ,layout-320x320
drawable-336x367 , layout-336x367
该方案适合屏幕大小固定为几种的设备
2:固定屏幕适配方案
1:固定像素大小适配方案
Metrics(麦揣科斯):度量;指标;量度;度量指标;衡量标准
给出参考屏幕(1920*1080),通过windowManager.getDefaultDisplay().getMetrics(displayMetrics);获取到当前设备的真实长宽(注意长度需要去掉状态栏高度如:2340*1080),然后计算出在当前屏幕下的需要拉伸或者缩小的长宽缩放比,然后,通过视图给出的像素,进行缩放计算,得出真实屏幕的像素大小,再把该像素大小放入到视图的布局参数中。
基于该方法,可以衍生出UIRelativeLayout&UILinearLayout适配性布局
1:获取状态栏的两种方法
//1:状态栏高度获取方法
public int getStatusBarHeight(Context context){
int resID = context.getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resID > 0){
return context.getResources().getDimensionPixelSize(resID);
}
return 0;
}
//2:通过反射获取到状态栏高度
private int getSystemBarHeight(Context context){
return getValue(context,"com.android.internal.R$dimen","system_bar_height",48);
}
private int getValue(Context context, String dimeClass, String system_bar_height, int defaultValue) {
// com.android.internal.R$dimen system_bar_height 状态栏的高度
try {
Class<?> clz= Class.forName(dimeClass);
Object object = clz.newInstance();
Field field=clz.getField(system_bar_height);
int id= Integer.parseInt(field.get(object).toString());
return context.getResources().getDimensionPixelSize(id);
} catch (Exception e) {
e.printStackTrace();
}
return defaultValue;
}
2:设备端的真实长宽获取方式
private UIUtils(Context context) {
// 计算缩放系数
WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
DisplayMetrics displayMetrics=new DisplayMetrics();
if(displayMetricsWidth==0.0f || displayMetricsHeight==0.0f){
//在这里得到设备的真实值
windowManager.getDefaultDisplay().getMetrics(displayMetrics);
systemBarHeight=getStatusBarHeight(context);
//横屏
if(displayMetrics.widthPixels>displayMetrics.heightPixels){
this.displayMetricsWidth=(float)(displayMetrics.heightPixels);
this.displayMetricsHeight=(float)(displayMetrics.widthPixels-systemBarHeight);
}else {
// 竖屏
this.displayMetricsWidth=(float)(displayMetrics.widthPixels);
this.displayMetricsHeight=(float)(displayMetrics.heightPixels-systemBarHeight);
}
// 状态栏
}
}
3:衍生工具类:UIRelativeLayout实现原理,重新改viewGroup的onMeasure方法,遍历子View,更新子View的布局参数
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
if (flag) {
flag = false;
float scaleX = UIUtils.getInstance(getContext()).getHorizontalScaleValue();
float scaleY = UIUtils.getInstance(getContext()).getVerticalScaleValue();
int childCount = this.getChildCount();
for (int i = 0; i < childCount; i++) {
View child = this.getChildAt(i);
LayoutParams layoutParams = (LayoutParams) child.getLayoutParams();
layoutParams.width=(int) (layoutParams.width * scaleX);
layoutParams.height = (int) (layoutParams.height * scaleY);
layoutParams.leftMargin = (int) (layoutParams.leftMargin * scaleX);
layoutParams.rightMargin = (int) (layoutParams.rightMargin * scaleX);
layoutParams.topMargin = (int) (layoutParams.topMargin * scaleY);
layoutParams.bottomMargin = (int) (layoutParams.bottomMargin * scaleY);
}
}
}
3:通用图片处理方案
1:.9png图片处理
在android studio中,把需要拉伸的png图片(注意一定要是png图片),修改名称,后缀添加.9(如aaa.9.png),然后双击该图片,打开后,或看到左下角有9patch选项,选择该功能,就可以打开如下的视图,在该视图中进行编辑,以完成可拉伸的效果的图片,需要注意的是,左侧和上边是控制可拉伸区域,建议拉伸的像素为1像素,这样不会导致拉伸内容遮盖和拉伸失真的问题
|