android autosize原理,(原创)AndroidAutoSize屏幕适配工具介绍[通俗易懂]

android autosize原理,(原创)AndroidAutoSize屏幕适配工具介绍[通俗易懂]屏幕适配是我们在开发中经常会遇到的一个问题不同的机型有不同的屏幕尺寸和密度现在市场上已经有不少屏幕适配的解决方案今天就来介绍一个我自己觉得不错的AutoSize这是是一个Android端可以根据设备不同屏幕尺寸自动适配宽高的工具特点是使用起来非常简单。作者写的介绍它网站有:https://www.jianshu.com/p/4aa23d69d481代码位置:https://github.com/J…

大家好,又见面了,我是你们的朋友全栈君。

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

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

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

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

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的宽高值

获取屏幕的宽高可以先获取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,跨应用横竖屏切换 等等导致忽大忽小的问题,可以参考这个处理:

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

}

}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/134896.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • leetcode-84柱状图中最大的矩形(单调栈)「建议收藏」

    leetcode-84柱状图中最大的矩形(单调栈)「建议收藏」原题链接给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。求在该柱状图中,能够勾勒出来的矩形的最大面积。以上是柱状图的示例,其中每个柱子的宽度为 1,给定的高度为 [2,1,5,6,2,3]。图中阴影部分为所能勾勒出的最大矩形面积,其面积为 10 个单位。示例:输入: [2,1,5,6,2,3]输出: 10题解对于每一个长方体,找出左边比他小的第一个长方体和右边比他小的第一个长方体,然后遍历求结即可class Solution {public

  • cmd输入java有效,输入javac无效解决方案

    cmd输入java有效,输入javac无效解决方案笔记本的系统是win1064bit的系统,按照网上的指导安装了jdk和jre运行cmd的时候,输入java会有输出,但是输入javac的时候就报javac不是内部或外部命令的错误。最终的解决办法是:cmd中输入:setpath="%JAVA_HOME%\bin"…

  • Java中next()和nextLine()区别及用法「建议收藏」

    Java中next()和nextLine()区别及用法「建议收藏」今天在项目之余,到杭电上刷了一道题,那道题是1062题,程序本身不是难,但是在里面实现过程中,突然发现用的Scanner类进行输入的,用到了next和nextLine这两个方法,在输入过程中也遇到一些问题,接下来进行讲述自己遇到的问题,以及如何解决的杭电1062题目:TextReverseProblemDescriptionIgnatiuslike

  • [Elasticsearch] 邻近匹配 (三) – 性能,关联单词查询以及Shingles

    [Elasticsearch] 邻近匹配 (三) – 性能,关联单词查询以及Shingles提高性能短语和邻近度查询比简单的match查询在性能上更昂贵。match查询只是查看词条是否存在于倒排索引(InvertedIndex)中,而match_phrase查询则需要计算和比较多个可能重复词条(Multiplepossiblyrepeated)的位置。在LuceneNightlyBenchmarks中,显示了一个简单的term查询比一个短语查询快大概10倍,比一

    2022年10月31日
  • Hmily 源码解析 (三) —— himly事务上下文

    Hmily 源码解析 (三) —— himly事务上下文目录1.HmilyTransactionContexthimly事务上下文,在一个线程内只有唯一实例。在线程内时不时的需要获取事务的id及角色状态等信息。如果作为参数在函数中传递并不合适,并且由于切面,拦截器等等编程方式也无法依靠该方式获取所需要的信息。hmily采用的方式是将所需要的信息封装为一个实体,这个实体就是HmilyTransactionContext。并将HmilyTr…

  • 使用MQTTnet搭建Mqtt服务器

    使用MQTTnet搭建Mqtt服务器官方介绍:MQTTnetMQTTnetisahighperformance.NETlibraryforMQTTbasedcommunication.ItprovidesaMQTTclientandaMQTTserver(broker).Theimplementationisbasedonthedocumentationfrom h…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号