AutoUtils android终极适配——so easy!

本文介绍了一种名为AutoUtils的布局适配方案,通过在Activity、Fragment、View及Adapter中应用该方案,可以实现不同屏幕尺寸上的UI元素自动适配。适配过程简单高效,仅需几行代码即可完成。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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);
    }

}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值