Android屏幕100%适配方案

一、创建一个UiUtils工具类,用于计算控件的缩放比例

计算设备实际高度

  //基准宽高    private final static int STANDARD_WIDTH = 1080;    private final static int STANDARD_HEIGHT = 1920 - 48;    //实际设备分辨率    private float displayMetricsWidth;    private float displayMetricsHeight;    private UIUtil(Context context)    {        mContext = context;        WindowManager windowManager = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE);        DisplayMetrics displayMetrics = new DisplayMetrics();        if (displayMetricsWidth == 0.0F || displayMetricsHeight == 0.0F) {            windowManager.getDefaultDisplay().getMetrics(displayMetrics);            //获取            int systemBarHight = getSystemBarHeight();            //处理真实宽高得问题            if (displayMetrics.widthPixels > displayMetrics.heightPixels) {//横屏                this.displayMetricsWidth = (float) displayMetrics.heightPixels;                this.displayMetricsHeight = (float) displayMetrics.widthPixels - systemBarHight;            } else {//竖屏                this.displayMetricsWidth = (float) displayMetrics.widthPixels;                this.displayMetricsHeight = (float) displayMetrics.heightPixels - systemBarHight;            }        }    }

 获取状态框的高度的两个方法

方法1、通过反射获得

private static String DIME_CLAZZ = "com.android.internal.R$dimen"; private int getSystemBarHeight()    {        return getValue(mContext,DIME_CLAZZ,"system_bar_height",48);    }private int getValue(Context context, String attrGroupClass,String attrName,int defValue)    {        try{            Class clz = Class.forName(attrGroupClass);            Object obj = clz.newInstance();            Field field = clz.getField(attrName);            int id = Integer.parseInt(field.get(obj).toString());            return context.getResources().getDimensionPixelSize(id);        }catch(Exception e){            return defValue;        }    }

方法2 通过系统给我们提供了一个Resource类

public int getStatusBarHeight() {  int result = 0;  int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");  if (resourceId > 0) {      result = getResources().getDimensionPixelSize(resourceId);  }  return result;}

计算宽高缩放比例

public float getHorizontalScaleValue()    {        return this.displayMetricsWidth / (float) STANDARD_WIDTH;    }    public float getVerticalScaleValue()    {        return this.displayMetricsHeight / (float) STANDARD_HEIGHT;    }

二、创建自定义Layout extern RelativeLayout

在自定义布局onMeasure方法中,对子控件的按照缩放比例进行重新计算。

@Override    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {        if(!isMeasure) {            isMeasure = true;            int childCount = this.getChildCount();            float scaleX = UIUtil.getInstance(getContext()).getHorizontalScaleValue();            float scaleY = UIUtil.getInstance(getContext()).getVerticalScaleValue();            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);                child.setPadding((int)(child.getPaddingLeft()* scaleX),(int)(child.getPaddingTop()* scaleY),(int)(child.getRight()* scaleX),(int)(getPaddingBottom()* scaleY));            }        }        super.onMeasure(widthMeasureSpec, heightMeasureSpec);    }

 

 

更多相关文章

  1. java.lang.IllegalStateException Fragment already added: Home
  2. android软件盘的开关
  3. Android面试-Android部分
  4. Android(安卓)MediaPlayer使用方法简单介绍
  5. Android(安卓)将Uri转换成File
  6. Android(安卓)风格
  7. 对RecycleView的多种item布局的封装
  8. [Android]Http通信,HttpService服务端通过getEntity获取HttpClien
  9. Android的消息框处理方法

随机推荐

  1. Azure首席架构师John Gossman就微软加入L
  2. 刘光聪|剖析TensorFlow架构与设计:编程模
  3. 集成软件开发工具有多难?现实很残酷!
  4. 酱茄教你怎么用H5链接打开微信小程序
  5. 快递100快递查询接口(API)接口规范说明文
  6. React新特性一览
  7. 紫微圣人的程序员人生 [原创IT小说]--第
  8. JavaScript中的基本字符串与字符串对象的
  9. JavaScript中是如何定义私有变量的
  10. 浅谈时间复杂度