(原创)AndroidAutoSize屏幕适配工具介绍

论坛 期权论坛 编程之家     
选择匿名的用户   2021-6-2 15:57   1512   0

屏幕适配是我们在开发中经常会遇到的一个问题

不同的机型有不同的屏幕尺寸和密度

现在市场上已经有不少屏幕适配的解决方案

今天就来介绍一个我自己觉得不错的

AutoSize

这是是一个Android端可以根据设备不同屏幕尺寸自动适配宽高的工具

特点是使用起来非常简单。

作者写的介绍它网站有:

https://www.jianshu.com/p/4aa23d69d481

代码位置:

https://github.com/JessYanCoding/AndroidAutoSize

现在来介绍基本的使用方法

首先是依赖

私有依赖

implementation 'me.jessyan:autosize:1.1.2'

共有依赖

api 'me.jessyan:autosize:1.1.2'

第二步是在你的配置清单里面,配置你的屏幕宽高

注意用dp来配置

比如下面就是1280*900的宽高值

<manifest>
    <application>            
        <meta-data
            android:name="design_width_in_dp"
            android:value="1280"/>
        <meta-data
            android:name="design_height_in_dp"
            android:value="900"/>           
     </application>           
</manifest>

获取屏幕的宽高可以先获取px,然后根据密度转换

之前有写过这块:

(原创)分享自己写的几个工具类(十一)配置文件的操作工具类

到这里其实就已经完成了自动适配

其实还有一些进阶的用法

这个方案默认是根据宽度来适配

也可以转换成根据高度

在Application的onCreate方法里面配置

AutoSizeConfig.getInstance().setBaseOnWidth(false);

当然,如果针对单个的Activity或者Fragment也可以自定义

首先要实现CustomAdapt这个类

如果不想采用这种方案

就实现CancelAdap这个类

然后有这几个实现方法

boolean isBaseOnWidth():是否按照宽度来适配,false就是按照高度

float getSizeInDp():根据上一个方法决定是按照宽还是高来适配,然后返回你要重新设置的宽或者高。

返回0则代表继续使用配置清单配置的宽高

注意:如果是Fragment也要自定义的话

需要在Application的onCreate方法里面这样配置

AutoSizeConfig.getInstance().setCustomFragment(true);

还有更自由的方式,自定义适配器

在Application的onCreate方法里面配置:

AutoSizeConfig.getInstance().setAutoAdaptStrategy(new AutoAdaptStrategy());

实现原理:

在setContentView前,修改DisplayMetrics类的内容。

核心代码如下:

AutoSize.autoConvertDensity(activity, sizeInDp, isBaseOnWidth)

AutoSize.setDensity(activity, density, densityDpi, scaledDensity, xdpi)

AutoSize.senDensity(displayMetrics, density, densityDpi, scaledDensity, xdpi)


如果遇到部分界面添加autosize、部分界面取消autosize,跨应用横竖屏切换 等等导致忽大忽小的问题,可以参考这个处理:

首先打印出屏幕密度,如果屏幕忽大忽小,说明密度会起变化

Log.d("print", "result: " + getResources().getDisplayMetrics().density);

然后便是处理:

1、在合适的生命周期或方法内调用setScreenWidthHeight和autoConvertDensity

2、不使用getResources().getConfiguration().orientation来判断横竖屏,改用DisplayMetrics的宽高对比

具体看下面这个例子

public class BaseAutoSizeActivity extends Activity implements CustomAdapt {

    @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();
        AutoSize.autoConvertDensityOfCustomAdapt(this, this);
    }

    @Override
    protected void onResume() {
        super.onResume();
        setScreenWidthHeight();
        AutoSize.autoConvertDensityOfCustomAdapt(this, this);
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        setScreenWidthHeight();
        AutoSize.autoConvertDensityOfCustomAdapt(this, this);
    }

    @Override
    public Resources getResources() {
        setScreenWidthHeight();
        try {
            AutoSizeCompat.autoConvertDensityOfCustomAdapt(super.getResources(), this);
        } catch (Exception e) {
            e.printStackTrace();
        }
        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);
    }
}

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP