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