屏幕适配是我们在开发中经常会遇到的一个问题
不同的机型有不同的屏幕尺寸和密度
现在市场上已经有不少屏幕适配的解决方案
今天就来介绍一个我自己觉得不错的
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);
}
}
|