AutoUtils 的使用:
原文地址:https://blog.youkuaiyun.com/zhengjingle/article/details/51742839
我使用了以后,在不同手机上面也做了测试,简直完美!可以直接用UI所给的px值为单位,顺便搭配PxCook软件,简直爽的不要不要的。
如图,可以直接写marginTop="30px".
在所有的手机上面,看起来都是一样的。
正题开始!
一、Activity使用AutoUtils:
在setContentView();方法之前加入:
AutoUtils.setSize(this, false, 750, 1334);
其中750为UI给图时给的原型图手机的宽度,1334为高度。
(750*1334是苹果6的像素值。)
然后,在setContentView();方法之后加入:
AutoUtils.auto(this);
至此。Activity上面的适配就已经没有问题了。
二、Fragment中使用AutoUtils:
只需要在Fragment的onCreateView()方法中
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment, container, false); AutoUtils.auto(view); return view; }
即可。
由上面的,估计你已经知道代码添加View的使用了。
三、View使用AutoUtils:
同二。定义完成View以后,加入:
AutoUtils.auto(view);
四、Adapter中使用AutoUtils。
在你的ViewHolder构造方法中:
AutoUtils.auto(view);
//参数view,是View对象。
凡是需要inflate导入view的地方,用这个方法处理一下就可以。
注意:
我用的EasyRecyclerView。
在其RecyclerArrayAdapter中,
public class HomeAdapter extends RecyclerArrayAdapter<HomeModel> { public HomeAdapter(Context context) { super(context); } @Override public BaseViewHolder OnCreateViewHolder(ViewGroup parent, int viewType) { return new CircleViewHolder(parent); } class CircleViewHolder extends BaseViewHolder<HomeModel> { private TextView name; public CircleViewHolder(ViewGroup parent) { name = $(R.id.item_home_name); AutoUtils.auto(itemView); } @Override public void setData(final HomeModel model) { //逻辑处理。 } } }
进行如图设置即可。
顺便问一下各位大神。在
BaseRecyclerViewAdapterHelper
中,如何处理?
AutoUtils代码如下:
import android.app.Activity; import android.content.Context; import android.content.res.Resources; import android.util.TypedValue; import android.view.Display; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; /** * @author zhengjingle * @version 1.1 * @date 2017/12/29 * */ public class AutoUtils { public static int displayWidth; public static int displayHeight; private static int designWidth; private static int designHeight; private static double textPixelsRate; public static void setSize(Activity act, boolean hasStatusBar, int designWidth, int designHeight) { if (act == null || designWidth < 1 || designHeight < 1) return; Display display = act.getWindowManager().getDefaultDisplay(); int width = display.getWidth(); int height = display.getHeight(); if (hasStatusBar) { height -= getStatusBarHeight(act); } AutoUtils.displayWidth = width; AutoUtils.displayHeight = height; AutoUtils.designWidth = designWidth; AutoUtils.designHeight = designHeight; double displayDiagonal = Math.sqrt(Math.pow(AutoUtils.displayWidth, 2) + Math.pow(AutoUtils.displayHeight, 2)); double designDiagonal = Math.sqrt(Math.pow(AutoUtils.designWidth, 2) + Math.pow(AutoUtils.designHeight, 2)); AutoUtils.textPixelsRate = displayDiagonal / designDiagonal; } public static int getStatusBarHeight(Context context) { int result = 0; try { int resourceId = context.getResources().getIdentifier( "status_bar_height", "dimen", "android"); if (resourceId > 0) { result = context.getResources().getDimensionPixelSize(resourceId); } } catch (Resources.NotFoundException e) { e.printStackTrace(); } return result; } public static void auto(Activity act) { if (act == null || displayWidth < 1 || displayHeight < 1) return; View view = act.getWindow().getDecorView(); auto(view); } public static void auto(View view) { if (view == null || displayWidth < 1 || displayHeight < 1) return; AutoUtils.autoTextSize(view); AutoUtils.autoSize(view); AutoUtils.autoPadding(view); AutoUtils.autoMargin(view); if (view instanceof ViewGroup) { auto((ViewGroup) view); } } private static void auto(ViewGroup viewGroup) { int count = viewGroup.getChildCount(); for (int i = 0; i < count; i++) { View child = viewGroup.getChildAt(i); if (child != null) { auto(child); } } } public static void autoMargin(View view) { if (!(view.getLayoutParams() instanceof ViewGroup.MarginLayoutParams)) return; ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams) view.getLayoutParams(); if (lp == null) return; lp.leftMargin = getDisplayWidthValue(lp.leftMargin); lp.topMargin = getDisplayHeightValue(lp.topMargin); lp.rightMargin = getDisplayWidthValue(lp.rightMargin); lp.bottomMargin = getDisplayHeightValue(lp.bottomMargin); } public static void autoPadding(View view) { int l = view.getPaddingLeft(); int t = view.getPaddingTop(); int r = view.getPaddingRight(); int b = view.getPaddingBottom(); l = getDisplayWidthValue(l); t = getDisplayHeightValue(t); r = getDisplayWidthValue(r); b = getDisplayHeightValue(b); view.setPadding(l, t, r, b); } public static void autoSize(View view) { ViewGroup.LayoutParams lp = view.getLayoutParams(); if (lp == null) return; boolean isSquare = false; if (lp.width == lp.height) { isSquare = true; } if (lp.width > 0) { lp.width = getDisplayWidthValue(lp.width); } if (lp.height > 0) { lp.height = getDisplayHeightValue(lp.height); } if (isSquare) { if (lp.width > lp.height) { lp.width = lp.height; } else { lp.height = lp.width; } } } public static void autoTextSize(View view) { if (view instanceof TextView) { double designPixels = ((TextView) view).getTextSize(); double displayPixels = textPixelsRate * designPixels; ((TextView) view).setIncludeFontPadding(false); ((TextView) view).setTextSize(TypedValue.COMPLEX_UNIT_PX, (float) displayPixels); } } public static int getDisplayWidthValue(int designWidthValue) { if (Math.abs(designWidthValue) < 2) { return designWidthValue; } return designWidthValue * displayWidth / designWidth; } public static int getDisplayHeightValue(int designHeightValue) { if (Math.abs(designHeightValue) < 2) { return designHeightValue; } return designHeightValue * displayHeight / designHeight; } public static float getDisplayTextSize(float designTextSize){ return (float) (AutoUtils.textPixelsRate*designTextSize); } }