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;

}

}

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值