IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> 使用AndroidAutoSize进行屏幕适配 -> 正文阅读

[游戏开发]使用AndroidAutoSize进行屏幕适配

公司许多应用的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

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2022-05-04 07:31:23  更:2022-05-04 07:32:12 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 11:05:22-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码