自定义一个计算屏幕缩放比例的单例类,用于获取屏幕的横向和水平方向的缩放比例。 package com.example.screenadaptation; import android.content.Context; import android.util.DisplayMetrics; import android.view.WindowManager; public class ScreenAdaptationUtils { //设计稿的宽高像素 private static final int STANDARD_WITH = 720; private static final int STANDARD_HEIGHT = 1280; private static ScreenAdaptationUtils screenAdaptationUtils; private int mDisplayWith; private int mDisplayHeight; private ScreenAdaptationUtils(Context context) { //获取屏幕宽高 if (mDisplayHeight == 0 || mDisplayWith == 0) { WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); if (windowManager != null) { DisplayMetrics displayMetrics = new DisplayMetrics(); windowManager.getDefaultDisplay().getMetrics(displayMetrics); if (displayMetrics.widthPixels > displayMetrics.heightPixels) { //如果横向宽度大于 竖直高度,那就是横屏状态 mDisplayWith = displayMetrics.heightPixels; mDisplayHeight = displayMetrics.widthPixels; } else { mDisplayHeight = displayMetrics.heightPixels; mDisplayWith = displayMetrics.widthPixels - getStatusBarHight(context); } } } } //获取屏幕状态栏的高度 private int getStatusBarHight(Context context) { int resId = context.getResources().getIdentifier("status_bar_height", "dimen", "android"); if (resId > 0) { return context.getResources().getDimensionPixelSize(resId); } return 0; } public static ScreenAdaptationUtils getScreenAdaptationUtils(Context context) { if (screenAdaptationUtils == null) { synchronized (ScreenAdaptationUtils.class) { if (screenAdaptationUtils == null) { screenAdaptationUtils = new ScreenAdaptationUtils(context.getApplicationContext()); } } } return screenAdaptationUtils; } //获取横向的缩放比例 public float getHorizontalScale() { return mDisplayWith / STANDARD_WITH; } //获取垂直方向的缩放比例 public float getVerticalScale() { return mDisplayHeight / STANDARD_HEIGHT; } }
实用例子:
package com.example.screenadaptation; import android.content.Context; import android.util.AttributeSet; import android.view.View; import android.widget.RelativeLayout; public class MyLayout extends RelativeLayout { private boolean flag; public MyLayout(Context context) { super(context); } public MyLayout(Context context, AttributeSet attrs) { super(context, attrs); } public MyLayout(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { if (!flag){ float ScaleX = ScreenAdaptationUtils.getScreenAdaptationUtils(getContext()).getHorizontalScale(); float ScaleY = ScreenAdaptationUtils.getScreenAdaptationUtils(getContext()).getVerticalScale(); int viewCount = getChildCount(); for (int i = 0; i < viewCount; i++) { View view = getChildAt(i); LayoutParams params = (LayoutParams) view.getLayoutParams(); params.width = (int) (params.width*ScaleX); params.height = (int) (params.height * ScaleY); params.leftMargin = (int) (params.leftMargin * ScaleX); params.rightMargin = (int) (params.rightMargin * ScaleX); params.topMargin = (int) (params.topMargin * ScaleY); params.bottomMargin = (int) (params.bottomMargin * ScaleY); } }else { flag = true; } super.onMeasure(widthMeasureSpec, heightMeasureSpec); } }