使用AndroidAutoSize进行屏幕适配

  • Post author:
  • Post category:其他




公司许多应用的UI都是用AndroidAutoSize框架来做适配的,其中系统源码apk都是基于mk文件编译的。由于在不重新提供UI设计图的情况下需要进行大量的应用移植和适配工作,AndroidAutoSize库能很好的适配不同机型的UI显示。

  1. 介绍

使用上非常简单,只需要填写设计图尺寸即可接入项目。使用dp、sp为默认单位进行布局,侵入性很低。

原理上因为只需修改一次density,项目中所有地方都会自动适配,这种一刀切的做法有时候是一种优点,但也是其最大的缺点。当某个系统控件或三方库控件的设计图尺寸和和我们项目自身的设计图尺寸差距很大时,这个问题就越严重。

大家可以自行根据项目情况决定是否接入该适配方案。


  1. 项目集成

在工程libs下首先上传autosize-1.2.1.aar

1)gradle方式

implementation fileTree(dir: 'libs', include: ['*.jar','*.aar'])

2)mk方式

include $(CLEAR_VARS)
LOCAL_AAPT_FLAGS := --auto-add-overlay
LOCAL_AAPT_FLAGS += --extra-packages me.jessyan.autosize
LOCAL_STATIC_JAVA_AAR_LIBRARIES := OtaUpdate_autosize-1.2.1
#解决Error: Compilation can't be completed because `android.support.v4.app.FragmentManager$FragmentLifecycleCallbacks` 
LOCAL_STATIC_ANDROID_LIBRARIES := \
	android-support-v4 \
	androidx.appcompat_appcompat
include $(BUILD_PACKAGE)

include $(CLEAR_VARS) 
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := OtaUpdate_autosize-1.2.1:libs/autosize-1.2.1.aar
include $(BUILD_MULTI_PREBUILT)

  1. 基本使用

1)清单文件

<application
	<!--解决Androidx和Android support库不能共存的编译错误-->
	android:appComponentFactory="androidx.core.app.CoreComponentFactory"
	tools:replace="android:appComponentFactory">

	<!--重点:填写以某设计图为基准的design UI dp值-->
	<meta-data
		android:name="design_width_in_dp"
		android:value="1333" />
    <meta-data
		android:name="design_height_in_dp"
		android:value="800" />
<application

2)CustomAdapt和CancelAdapt

  • 如果页面需要适配,建议继承该基类。通过实现CustomAdapt接口以扩展适配参数。
public abstract class BaseAutoSizeActivity extends Activity implements CustomAdapt {

    private float density;

    @Override
    public boolean isBaseOnWidth() {
        return true;
    }

    @Override
    public float getSizeInDp() {
        int sizeInDp;
        if (AutoSizeConfig.getInstance().getScreenWidth() > AutoSizeConfig.getInstance().getScreenHeight()) {
            sizeInDp = AutoSizeConfig.getInstance().getDesignWidthInDp();
        } else {
            sizeInDp = AutoSizeConfig.getInstance().getDesignHeightInDp();
        }
        return sizeInDp;
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        setScreenWidthHeight();
        setDensityByAutoSize();
    }

    @Override
    protected void onResume() {
        super.onResume();
        setScreenWidthHeight();
        setDensityByAutoSize();
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        setScreenWidthHeight();
        setDensityByAutoSize();
    }

    @Override
    public Resources getResources() {
        setDensityByAutoSize();
        return super.getResources();
    }

    public void setScreenWidthHeight() {
        int[] screenSize = ScreenUtils.getScreenSize(getApplicationContext());
        int width = screenSize[0];
        int height = screenSize[1];
        AutoSizeConfig.getInstance().setScreenWidth(width);
        AutoSizeConfig.getInstance().setScreenHeight(height);
    }

    private void setDensityByAutoSize() {
        float tempDensity = super.getResources().getDisplayMetrics().density;
        if (density != tempDensity) {
            setScreenWidthHeight();
            try {
                AutoSizeCompat.autoConvertDensityOfCustomAdapt(super.getResources(), this);
            } catch (Exception e) {
                e.printStackTrace();
            }
            density = super.getResources().getDisplayMetrics().density;
        }
    }
}
  • 当某个Activity想放弃适配时,可以实现CancelAdapt接口。

  1. 常见问题

1)旋转屏幕等系统配置发生变化导致失效:重写getResource方法重新设置density,如上面基类所示。

2)多进程适配失效:默认进程界面正常适配,其他进程界面(通过android:process指定运行在另一进程)显示异常。在Application的onCreate方法中调用:AutoSize.initCompatMultiProcess(this)。

3)更多问题请参考:

https://github.com/JessYanCoding/AndroidAutoSize/issues



版权声明:本文为qq_23069607原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。