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

}

}

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • JAVA三元运算符_java中三元运算符详解

    JAVA三元运算符_java中三元运算符详解一:三元运算符条件表达式?取值1:取值2三元运算符是ifelse或者ifelseifelse的简写形式,可以使代码看起来简洁些。privateStringternary1(intfirst){System.out.println("=================================================================…

    2022年8月30日
    5
  • Excel VBA编程教程(基础一)

    Excel VBA编程教程(基础一)VBA介绍VisualBasicforApplications(VBA)是VisualBasic的一种宏语言,是微软开发出来在其桌面应用程序中执行通用的自动化(OLE)任务的编程语言。主要能用来扩展Windows的应用程序功能,特别是MicrosoftOffice软件。说简单点,VBA是运行在MicrosoftOffice软件之上,可以用来编写非软件自带的功能的编程语言。Office软件提供丰富的功能接口,VBA可以调用它们,实现自定义的需求。基本上,能用鼠标和键盘能做的

    2022年4月29日
    2.1K
  • linux rpm解压命令,LINUX下各种解压命令收藏「建议收藏」

    linux rpm解压命令,LINUX下各种解压命令收藏「建议收藏」大致总结了一下linux下各种格式的压缩包的压缩、解压方法。但是部分方法我没有用到,也就不全,希望大家帮我补充,我将随时修改完善,谢谢!.tar解包:tarxvfFileName.tar打包:tarcvfFileName.tarDirName(注:tar是打包,不是压缩!)———————————————.gz解压1:gunzipFileName.gz解压2:gzip-dFileN…

    2022年5月16日
    151
  • php phantomjs 截屏,phantomjs截图

    php phantomjs 截屏,phantomjs截图废话不多说,直接上代码。功能:随便截取一个url页面:https://www.baidu.com/s?word=phantomjs+%E6%88%AA%E5%9B%BE&tn=43061099_196_hao_pg&ie=utf-8&ssl_sample=hao_1phantomjs的js环境test.jssystem=require(‘system’)address…

    2022年7月14日
    19
  • rabbitmq集群搭建_集群搭建步骤

    rabbitmq集群搭建_集群搭建步骤MQ为什么要使用集群?单机版无法满足真实应用的要求,如果RabbitMQ服务器遇到内存崩溃、机器掉电或者主板故障等情况况,该怎么办?单台RabbitMQ服务器可以满足每秒1000条消息的吞吐量,那么如果应用需要RabbitMQ服务满足每秒10万条消息的吞吐量呢?购买昂贵的服务器来增强单机RabbitMQ务的性能显得不足,此时搭建一个RabbitMQ集群才是解决实际生产中问题的关键。准备环境虚拟机环境:VMware®Workstation16Pro虚拟机版本:16.1.2build-1

    2025年10月20日
    5
  • 负载均衡、Apache 负载均衡配置[通俗易懂]

    负载均衡、Apache 负载均衡配置[通俗易懂][1]Apache负载均衡设置方法mod_proxy使用介绍一般来说,负载均衡就是将客户端的请求分流给后端的各个真实服务器,达到负载均衡的目的。还有一种方式是用两台服务器,一台作为主服务器(Master),另一台作为热备份(HotStandby),请求全部分给主服务器,在主服务器当机时,立即切换到备份服务器,以提高系统的整体可 第一次看到这个标题时我也很惊讶,Apache居然还能做负载

    2025年10月15日
    6

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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