屏幕适配方案

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像素,这样不会导致拉伸内容遮盖和拉伸失真的问题

image.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值