android auto 源代码,最近心血来潮,把Androidautosize的源码搂了一眼

https://codechina.csdn.net/mirrors/jessyancoding/androidautosize?utm_source=csdn_github_accelerator

以上是Androidautosize的源码,有兴趣的就去下下来搂一眼

我这边还没看完,就把最基础的看了一下,然后顺了下简单的流程,顺便自己写了写试试,来给大家看一眼。

Androidautosize用起来很方便,基础用法一共两步。

第一步在你的项目里面引入Androidautosize,像这样

implementation 'me.jessyan:autosize:1.2.1'

第二步,在你的AndroidManifest.xml  文件里面配置一下,像这样,

android:name="design_width_in_dp"

android:value="360"/>

android:name="design_height_in_dp"

android:value="640"/>

然后就完事了。具体细节的使用方法大家可以百度其他文章,这里就不在说了。之前也看过介绍这个框架的文章,说是用的contentprovider做的,但没细看。最近看了看,顺便写了写,就给大家搂一搂;

我们知道 ContentProvider 的执行时机非常的靠前,靠前到什么程度呢,在执行application之前就会执行ContentProvider ,所以可以在ContentProvider里面拿AndroidManifest.xml的参数。先看下ContentProvider 的定义,像这样

public class AutoSizeProvider extends ContentProvider {

@Override

public boolean onCreate() {

Context applicationContext = getContext().getApplicationContext();

AutoSizeConfig.getInstance().init((Application) applicationContext);

return true;

}

@Nullable

@Override

public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection, @Nullable String[] selectionArgs, @Nullable String sortOrder) {

return null;

}

@Nullable

@Override

public String getType(@NonNull Uri uri) {

return null;

}

@Nullable

@Override

public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) {

return null;

}

@Override

public int delete(@NonNull Uri uri, @Nullable String selection, @Nullable String[] selectionArgs) {

return 0;

}

@Override

public int update(@NonNull Uri uri, @Nullable ContentValues values, @Nullable String selection, @Nullable String[] selectionArgs) {

return 0;

}

我们可以看到里面有个oncreate()方法,啥意思就不说了大家都懂,然后我在这里面执行了两行代码,我把其中相关的类给大家贴一下:

public class AutoSizeConfig {

private static AutoSizeConfig sInstance;

private String AUTO_SIZE_WIDTH_IN_DP_KEY = "sky_width_in_dp";//在文件中设置的默认宽度_KEY

private String AUTO_SIZE_HEIGHT_IN_DP_KEY = "sky_height_in_dp";//在文件中设置的默认高度_KEY

private int AUTO_SIZE_WIDTH_IN_DP_VALUE;//在文件中设置的默认宽度

private int AUTO_SIZE_HEIGHT_IN_DP_VALUE;//在文件中设置的默认宽度

private AutoSizeConfig() {

}

//单例对象

public static AutoSizeConfig getInstance() {

if (sInstance == null) {

synchronized (AutoSizeConfig.class) {

if (sInstance == null) {

sInstance = new AutoSizeConfig();

}

}

}

return sInstance;

}

//初始化参数

public void init(Application application) {

PackageManager packageManager = application.getPackageManager();

ApplicationInfo applicationInfo = null;

try {

//拿到applicationinfo对象

applicationInfo =

packageManager.getApplicationInfo(application.getPackageName(), PackageManager.GET_META_DATA);

Bundle metaData = applicationInfo.metaData;

//在这里拿AndroidManifest里面的参数

AUTO_SIZE_WIDTH_IN_DP_VALUE = (int) metaData.get(AUTO_SIZE_WIDTH_IN_DP_KEY);

AUTO_SIZE_HEIGHT_IN_DP_VALUE = (int) metaData.get(AUTO_SIZE_HEIGHT_IN_DP_KEY);

//这个是具体去执行适配方法的类,贴在下面了

LayoutSizeStrategy layoutSizeStrategy = new DefaultLayoutSizeStrategy();

//activity生命周期监听,当监听到activity执行oncreate或者onstart时,去修改系统的density和其他参数

Application.ActivityLifecycleCallbacks callbacks = new ActivityLifecycleCallbacksImpl(layoutSizeStrategy, application, AUTO_SIZE_WIDTH_IN_DP_VALUE, false);

application.registerActivityLifecycleCallbacks(callbacks);

} catch (PackageManager.NameNotFoundException e) {

e.printStackTrace();

}

}

}

生命周期监听在这:

public class ActivityLifecycleCallbacksImpl implements Application.ActivityLifecycleCallbacks {

private LayoutSizeStrategy mLayoutSizeStrategy;

private Application application;

private int baseSize;

private boolean isBaseOnWidth;

public ActivityLifecycleCallbacksImpl(LayoutSizeStrategy mLayoutSizeStrategy, Application application, int baseSize, boolean isBaseOnWidth) {

this.mLayoutSizeStrategy = mLayoutSizeStrategy;

this.application = application;

this.baseSize = baseSize;

this.isBaseOnWidth = isBaseOnWidth;

}

@Override

public void onActivityCreated(@NonNull Activity activity, @Nullable Bundle savedInstanceState) {

Log.d("zhd", "onActivityCreated: ");

if (mLayoutSizeStrategy != null) {

mLayoutSizeStrategy.applyStrategy(activity, application, baseSize, isBaseOnWidth);

}

}

@Override

public void onActivityStarted(@NonNull Activity activity) {

Log.d("zhd", "onActivityStarted: ");

if (mLayoutSizeStrategy != null) {

mLayoutSizeStrategy.applyStrategy(activity, application, baseSize, isBaseOnWidth);

}

}

@Override

public void onActivityResumed(@NonNull Activity activity) {

}

@Override

public void onActivityPaused(@NonNull Activity activity) {

}

@Override

public void onActivityStopped(@NonNull Activity activity) {

}

@Override

public void onActivitySaveInstanceState(@NonNull Activity activity, @NonNull Bundle outState) {

}

@Override

public void onActivityDestroyed(@NonNull Activity activity) {

}

具体的执行适配代码的地方在这:

public class DefaultLayoutSizeStrategy implements LayoutSizeStrategy {

private static float sNoncompatDesity;

private static float sNoncompatScaledDensity;

//在此执行改变的逻辑

@Override

public void applyStrategy(Activity activity, Application application, int baseSize, boolean isBaseOnWidth) {

final DisplayMetrics appDisplayMetrics = application.getResources().getDisplayMetrics();

if (sNoncompatDesity == 0) {

sNoncompatDesity = appDisplayMetrics.density;

sNoncompatScaledDensity = appDisplayMetrics.scaledDensity;

application.registerComponentCallbacks(new ComponentCallbacks() {

@Override

public void onConfigurationChanged(@NonNull Configuration newConfig) {

if (newConfig != null && newConfig.fontScale > 0) {

sNoncompatScaledDensity = application.getResources().getDisplayMetrics().scaledDensity;

}

}

@Override

public void onLowMemory() {

}

});

final float targetDensity;

if (isBaseOnWidth) {

//以宽为基准

targetDensity = appDisplayMetrics.widthPixels / baseSize;

} else {

//以高为基准

targetDensity = appDisplayMetrics.heightPixels / baseSize;

}

final float targetScaledDensity = targetDensity * (sNoncompatScaledDensity / sNoncompatDesity);

final int targetDensityDpi = (int) (160 * targetDensity);

appDisplayMetrics.density = targetDensity;

appDisplayMetrics.scaledDensity = targetScaledDensity;

appDisplayMetrics.densityDpi = targetDensityDpi;

final DisplayMetrics activityDisplayMetrics = activity.getResources().getDisplayMetrics();

activityDisplayMetrics.density = targetDensity;

activityDisplayMetrics.scaledDensity = targetScaledDensity;

activityDisplayMetrics.densityDpi = targetDensityDpi;

}

}

整个框架大体的思路就这些,其他的还没看,等有空了再看看,然后贴出来我们聊一聊。说实话,还是看看源码,然后自己动手写写有意思。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/263692.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

11次作业

1、实验要求&#xff1a;建立一个通信录&#xff0c;通信录的结构体记录包括&#xff1a;姓名、生日、电话号码&#xff1b;其中生日又包括三项&#xff1a;年、月、日。编写程序&#xff0c;定义一个嵌套的结构类型&#xff0c;输入n&#xff08;n<10&#xff09;个联系人的…

Lucene.net 下载地址

Lucene.net 官方网站 http://lucene.apache.org/lucene.net/ Lucene.net 2.9.2 下载地址 Lucene.Net_2_9_2/ 转载于:https://www.cnblogs.com/leco/archive/2010/12/22/1913806.html

android内存卡测试,安卓sd卡真假检测工具_内存卡检测扩容卡软件_sd insight

内存卡检测扩容卡软件内存卡检测扩容卡软件由于U盘、TF卡&#xff0c;sd内存卡等移动存储设备越来越便宜&#xff0c;导致很在某宝上买到便宜且容量大的U盘或者内存卡&#xff0c;结果基本上都是扩容盘&#xff0c;所谓扩容盘&#xff0c;就是实际容量比如2G的U盘&#xff0c;经…

bashrcprofile

# /etc/bashrc# are we an interactive shell? 是交互式的shell吗&#xff1f;# System wide functions and aliases //系统功能和别名比如说&#xff1a;你设置个别名alias xixdate当你键入xix时&#xff0c;那么系统显示为命令date的信息。&#xff08;键入后才输出&#…

android ftp权限,实战android手机telnet、ftp登陆,权限修改

问题的提出&#xff1a;我用的手机是HTC magic&#xff0c;sd卡用的是金士顿的&#xff0c;不知道什么原因&#xff0c;总是有时能找到sd卡&#xff0c;有时找不到。我个人总有一些数据文件&#xff0c;想固定放在手机的系统上&#xff0c;而不是sd卡上(/sdcard)&#xff0c;那…

Linux nohup和的功效

Linux nohup和&的功效 https://www.cnblogs.com/laoyeye/p/9346330.html 这是我转载的文章&#xff0c;写的很好&#xff0c; nohup Command [ Arg ... ] [ & ] &&#xff1a;进程后台执行 不挂断地运行命令。no hangup的缩写&#xff0c;意即“不挂断” 例如&…

获取手机通讯录跟sim卡通讯录

/** 获取库Phone表字段 **/ private static final String[] PHONES_PROJECTION new String[] { Phone.DISPLAY_NAME, Phone.NUMBER }; private List<ContactsModel> contactsModels new ArrayList<ContactsModel>(); /** 得到手机通讯录联系人信息 **/ …

如何去掉ECShop 2.7.2中的Powered by ECShop字符

1.去掉标题上Powered by ECShop的字样如下: 在includes/lib_main.php找到lib_main.php文件,打开后,找到136行,将$page_title $GLOBALS[’_CFG’][’shop_title’] . ‘ – ‘ . ‘Powered by ECShop’ ;改为$page_title $GLOBALS[’_CFG’][’shop_title’] ;当然, . ‘ – ‘…

proguard android 配置,android – Proguard忽略库的配置文件

我现在面对一个非常奇怪的问题吗&#xff1f;我有一个具有两个模块的Gradle应用程序&#xff0c;一个主要模块和一个库模块。>在两个模块中&#xff0c;我已经声明了一个正确的proguard-rules.pro文件路径>在两个.gradle文件中我有minifyEnabled为true这是第一个问题&…

MySql Workbench 安全模式(safe mode)

默认情况下&#xff0c;MySql WorkBench 的安全模式是打开的&#xff0c;即&#xff1a;update、delete语句必须带 where 条件字句&#xff0c;单条记录更新或删除。 如果关闭安全模式&#xff08;safe mode&#xff09;&#xff1a; 菜单栏&#xff1a;编辑(Edit) ---> 个…

Hark的数据结构与算法练习之希尔排序

算法说明 希尔排序是插入排序的优化版。 插入排序的最坏时间复杂度是O(n2)&#xff0c;但如果要排序的数组是一个几乎有序的数列&#xff0c;那么会降低有效的减低时间复杂度。 希尔排序的目的就是通过一个increment&#xff08;增量&#xff09;来对数列分组进行交换排序&…

13 个超炫的 Conky 配置

Conky 是一款桌面美化及系统信息监控软件&#xff0c;有着很强的自定义性&#xff0c;如果你熟悉的话可以配置出各类不同效果的界面&#xff0c;而下面列出了 13 个超炫的 Conkey 配置&#xff0c;你可以尝试其中之一。 Bionic Conky&#xff1a; Hi-Tek Conky&#xff1a; Con…

android 播放声音 停止其他,Android AudioManager处理两个播放器同时有声音,停止其中一个播放的问题,暂停其他的播放...

尽管某个时刻只有一个activity可以运行&#xff0c;Android却是一个多任务环境&#xff0e;这对使用音频的应用带来了特殊的挑战&#xff0c;因为只有一个音频输出而可能多个媒体都想用它&#xff0e;在Android2.2之前&#xff0c;没有内建的机制来处理这个问题&#xff0c;所以…

数据仓库定义

数据仓库&#xff08;Data Warehouse&#xff09;是一个面向主题的&#xff08;Subject Oriented&#xff09;、集成的&#xff08;Integrated&#xff09;、相对稳定的&#xff08;Non-Volatile&#xff09;、反映历史变化&#xff08;Time Variant&#xff09;的数据集合&…

C# 操作 Word 修改word的高级属性中的自定义属性

为 Microsoft Word 创建自动化客户端 启动 Visual Studio .NET。在文件菜单上&#xff0c;单击新建&#xff0c;然后单击项目。从 Visual C# 项目类型中选择 Windows 应用程序。默认情况下会创建 Form1。添加对 Microsoft Word 对象库的引用。为此&#xff0c;请按照下列步骤操…

大型门户网站的可伸缩性架构设计

大型门户网站的可伸缩性架构设计2009-12-28 来源&#xff1a;网络我们知道&#xff0c;对于一个大型门户网站来说&#xff0c;可伸缩性是非常重要的&#xff0c;怎么样在纵向和横向有良好的可伸缩性&#xff0c;就需要在做架构设计的时候考虑到一个分的原则&#xff0c;我想在多…

html中dd dt的效果,html中dt dd

html中&#xff0c;dl,dt,dd怎么使用html中,dl和dd和dt标签是什么意思,什么时候需要用定义列表的意思 一般用在图文并排的时候 应网友提问。html中&#xff0c;dl和dd和dt标签是什么意思&#xff0c;什么时候需要html中&#xff0c;dl和dd和dt标签的意思如下&#xff1a;dl标签…

mysql存储引擎优化参数

MySQL配置参数优化本文来自道森学习笔记&#xff0c;版权归 http://wubx.net/ 所有MyISAM存储引擎优化涉及参数如下&#xff1a;Key_buffery_sizeConcurrent_insert 2 | WAAYSBulk_insert_buffer_size8MMyisam_recover_optionsFORCEMyisam_recover_threads1Myisam_sort_buffer…

实现 laravel 的artisan

laravel 的 artisan 命令行太好用了&#xff0c;换个框架没有这个功能&#xff0c;于是自己学习实现一些&#xff0c;直接上代码 新建目录 -artisan --bin --src 进入artisan composer init composer require symfony/console #!/usr/bin/env php<?phpuse Symfony\Comp…