Skip to content

Commit 2d071d3

Browse files
committed
Add screenWidthDp and screenHeightDp support.
1 parent 4bc1c23 commit 2d071d3

5 files changed

Lines changed: 171 additions & 4 deletions

File tree

autosize/src/main/java/me/jessyan/autosize/AutoSize.java

Lines changed: 44 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import android.app.Application;
2020
import android.app.Dialog;
2121
import android.content.Context;
22+
import android.content.res.Configuration;
2223
import android.content.res.Resources;
2324
import android.net.Uri;
2425
import android.util.DisplayMetrics;
@@ -163,6 +164,8 @@ public static void autoConvertDensity(Activity activity, float sizeInDp, boolean
163164
int targetDensityDpi = 0;
164165
float targetScaledDensity = 0;
165166
float targetXdpi = 0;
167+
int targetScreenWidthDp;
168+
int targetScreenHeightDp;
166169

167170
if (displayMetricsInfo == null) {
168171
if (isBaseOnWidth) {
@@ -175,26 +178,32 @@ public static void autoConvertDensity(Activity activity, float sizeInDp, boolean
175178
targetScaledDensity = targetDensity * scale;
176179
targetDensityDpi = (int) (targetDensity * 160);
177180

181+
targetScreenWidthDp = (int) (AutoSizeConfig.getInstance().getScreenWidth() / targetDensity);
182+
targetScreenHeightDp = (int) (AutoSizeConfig.getInstance().getScreenHeight() / targetDensity);
183+
178184
if (isBaseOnWidth) {
179185
targetXdpi = AutoSizeConfig.getInstance().getScreenWidth() * 1.0f / subunitsDesignSize;
180186
} else {
181187
targetXdpi = AutoSizeConfig.getInstance().getScreenHeight() * 1.0f / subunitsDesignSize;
182188
}
183189

184-
mCache.put(key, new DisplayMetricsInfo(targetDensity, targetDensityDpi, targetScaledDensity, targetXdpi));
190+
mCache.put(key, new DisplayMetricsInfo(targetDensity, targetDensityDpi, targetScaledDensity, targetXdpi, targetScreenWidthDp, targetScreenHeightDp));
185191
} else {
186192
targetDensity = displayMetricsInfo.getDensity();
187193
targetDensityDpi = displayMetricsInfo.getDensityDpi();
188194
targetScaledDensity = displayMetricsInfo.getScaledDensity();
189195
targetXdpi = displayMetricsInfo.getXdpi();
196+
targetScreenWidthDp = displayMetricsInfo.getScreenWidthDp();
197+
targetScreenHeightDp = displayMetricsInfo.getScreenHeightDp();
190198
}
191199

192200
setDensity(activity, targetDensity, targetDensityDpi, targetScaledDensity, targetXdpi);
201+
setScreenSizeDp(activity, targetScreenWidthDp, targetScreenHeightDp);
193202

194-
LogUtils.d(String.format(Locale.ENGLISH, "The %s has been adapted! \n%s Info: isBaseOnWidth = %s, %s = %f, %s = %f, targetDensity = %f, targetScaledDensity = %f, targetDensityDpi = %d, targetXdpi = %f"
203+
LogUtils.d(String.format(Locale.ENGLISH, "The %s has been adapted! \n%s Info: isBaseOnWidth = %s, %s = %f, %s = %f, targetDensity = %f, targetScaledDensity = %f, targetDensityDpi = %d, targetXdpi = %f, targetScreenWidthDp = %d, targetScreenHeightDp = %d"
195204
, activity.getClass().getName(), activity.getClass().getSimpleName(), isBaseOnWidth, isBaseOnWidth ? "designWidthInDp"
196205
: "designHeightInDp", sizeInDp, isBaseOnWidth ? "designWidthInSubunits" : "designHeightInSubunits", subunitsDesignSize
197-
, targetDensity, targetScaledDensity, targetDensityDpi, targetXdpi));
206+
, targetDensity, targetScaledDensity, targetDensityDpi, targetXdpi, targetScreenWidthDp, targetScreenHeightDp));
198207
}
199208

200209
/**
@@ -217,6 +226,9 @@ public static void cancelAdapt(Activity activity) {
217226
, AutoSizeConfig.getInstance().getInitDensityDpi()
218227
, AutoSizeConfig.getInstance().getInitScaledDensity()
219228
, initXdpi);
229+
setScreenSizeDp(activity
230+
, AutoSizeConfig.getInstance().getInitScreenWidthDp()
231+
, AutoSizeConfig.getInstance().getInitScreenHeightDp());
220232
}
221233

222234
/**
@@ -291,6 +303,35 @@ private static void setDensity(DisplayMetrics displayMetrics, float density, int
291303
}
292304
}
293305

306+
/**
307+
* 给 {@link Configuration} 赋值
308+
*
309+
* @param activity {@link Activity}
310+
* @param screenWidthDp {@link Configuration#screenWidthDp}
311+
* @param screenHeightDp {@link Configuration#screenHeightDp}
312+
*/
313+
private static void setScreenSizeDp(Activity activity, int screenWidthDp, int screenHeightDp) {
314+
if (AutoSizeConfig.getInstance().getUnitsManager().isSupportDP() && AutoSizeConfig.getInstance().getUnitsManager().isSupportScreenSizeDP()) {
315+
Configuration activityConfiguration = activity.getResources().getConfiguration();
316+
setScreenSizeDp(activityConfiguration, screenWidthDp, screenHeightDp);
317+
318+
Configuration appConfiguration = AutoSizeConfig.getInstance().getApplication().getResources().getConfiguration();
319+
setScreenSizeDp(appConfiguration, screenWidthDp, screenHeightDp);
320+
}
321+
}
322+
323+
/**
324+
* Configuration赋值
325+
*
326+
* @param configuration {@link Configuration}
327+
* @param screenWidthDp {@link Configuration#screenWidthDp}
328+
* @param screenHeightDp {@link Configuration#screenHeightDp}
329+
*/
330+
private static void setScreenSizeDp(Configuration configuration, int screenWidthDp, int screenHeightDp) {
331+
configuration.screenWidthDp = screenWidthDp;
332+
configuration.screenHeightDp = screenHeightDp;
333+
}
334+
294335
/**
295336
* 解决 MIUI 更改框架导致的 MIUI7 + Android5.1.1 上出现的失效问题 (以及极少数基于这部分 MIUI 去掉 ART 然后置入 XPosed 的手机)
296337
* 来源于: https://github.com/Firedamp/Rudeness/blob/master/rudeness-sdk/src/main/java/com/bulong/rudeness/RudenessScreenHelper.java#L61:5

autosize/src/main/java/me/jessyan/autosize/AutoSizeCompat.java

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
package me.jessyan.autosize;
1717

1818
import android.app.Activity;
19+
import android.content.res.Configuration;
1920
import android.content.res.Resources;
2021
import android.util.DisplayMetrics;
2122

@@ -151,6 +152,8 @@ public static void autoConvertDensity(Resources resources, float sizeInDp, boole
151152
int targetDensityDpi = 0;
152153
float targetScaledDensity = 0;
153154
float targetXdpi = 0;
155+
int targetScreenWidthDp;
156+
int targetScreenHeightDp;
154157

155158
if (displayMetricsInfo == null) {
156159
if (isBaseOnWidth) {
@@ -163,21 +166,27 @@ public static void autoConvertDensity(Resources resources, float sizeInDp, boole
163166
targetScaledDensity = targetDensity * scale;
164167
targetDensityDpi = (int) (targetDensity * 160);
165168

169+
targetScreenWidthDp = (int) (AutoSizeConfig.getInstance().getScreenWidth() / targetDensity);
170+
targetScreenHeightDp = (int) (AutoSizeConfig.getInstance().getScreenHeight() / targetDensity);
171+
166172
if (isBaseOnWidth) {
167173
targetXdpi = AutoSizeConfig.getInstance().getScreenWidth() * 1.0f / subunitsDesignSize;
168174
} else {
169175
targetXdpi = AutoSizeConfig.getInstance().getScreenHeight() * 1.0f / subunitsDesignSize;
170176
}
171177

172-
mCache.put(key, new DisplayMetricsInfo(targetDensity, targetDensityDpi, targetScaledDensity, targetXdpi));
178+
mCache.put(key, new DisplayMetricsInfo(targetDensity, targetDensityDpi, targetScaledDensity, targetXdpi, targetScreenWidthDp, targetScreenHeightDp));
173179
} else {
174180
targetDensity = displayMetricsInfo.getDensity();
175181
targetDensityDpi = displayMetricsInfo.getDensityDpi();
176182
targetScaledDensity = displayMetricsInfo.getScaledDensity();
177183
targetXdpi = displayMetricsInfo.getXdpi();
184+
targetScreenWidthDp = displayMetricsInfo.getScreenWidthDp();
185+
targetScreenHeightDp = displayMetricsInfo.getScreenHeightDp();
178186
}
179187

180188
setDensity(resources, targetDensity, targetDensityDpi, targetScaledDensity, targetXdpi);
189+
setScreenSizeDp(resources, targetScreenWidthDp, targetScreenHeightDp);
181190
}
182191

183192
/**
@@ -200,6 +209,9 @@ public static void cancelAdapt(Resources resources) {
200209
, AutoSizeConfig.getInstance().getInitDensityDpi()
201210
, AutoSizeConfig.getInstance().getInitScaledDensity()
202211
, initXdpi);
212+
setScreenSizeDp(resources
213+
, AutoSizeConfig.getInstance().getInitScreenWidthDp()
214+
, AutoSizeConfig.getInstance().getInitScreenHeightDp());
203215
}
204216

205217
/**
@@ -264,6 +276,35 @@ private static void setDensity(DisplayMetrics displayMetrics, float density, int
264276
}
265277
}
266278

279+
/**
280+
* 给 {@link Configuration} 赋值
281+
*
282+
* @param resources {@link Resources}
283+
* @param screenWidthDp {@link Configuration#screenWidthDp}
284+
* @param screenHeightDp {@link Configuration#screenHeightDp}
285+
*/
286+
private static void setScreenSizeDp(Resources resources, int screenWidthDp, int screenHeightDp) {
287+
if (AutoSizeConfig.getInstance().getUnitsManager().isSupportDP() && AutoSizeConfig.getInstance().getUnitsManager().isSupportScreenSizeDP()) {
288+
Configuration activityConfiguration = resources.getConfiguration();
289+
setScreenSizeDp(activityConfiguration, screenWidthDp, screenHeightDp);
290+
291+
Configuration appConfiguration = AutoSizeConfig.getInstance().getApplication().getResources().getConfiguration();
292+
setScreenSizeDp(appConfiguration, screenWidthDp, screenHeightDp);
293+
}
294+
}
295+
296+
/**
297+
* Configuration赋值
298+
*
299+
* @param configuration {@link Configuration}
300+
* @param screenWidthDp {@link Configuration#screenWidthDp}
301+
* @param screenHeightDp {@link Configuration#screenHeightDp}
302+
*/
303+
private static void setScreenSizeDp(Configuration configuration, int screenWidthDp, int screenHeightDp) {
304+
configuration.screenWidthDp = screenWidthDp;
305+
configuration.screenHeightDp = screenHeightDp;
306+
}
307+
267308
/**
268309
* 解决 MIUI 更改框架导致的 MIUI7 + Android5.1.1 上出现的失效问题 (以及极少数基于这部分 MIUI 去掉 ART 然后置入 XPosed 的手机)
269310
* 来源于: https://github.com/Firedamp/Rudeness/blob/master/rudeness-sdk/src/main/java/com/bulong/rudeness/RudenessScreenHelper.java#L61:5

autosize/src/main/java/me/jessyan/autosize/AutoSizeConfig.java

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,14 @@ public final class AutoSizeConfig {
7272
* 最初的 {@link DisplayMetrics#xdpi}
7373
*/
7474
private float mInitXdpi;
75+
/**
76+
* 最初的 {@link Configuration#screenWidthDp}
77+
*/
78+
private int mInitScreenWidthDp;
79+
/**
80+
* 最初的 {@link Configuration#screenHeightDp}
81+
*/
82+
private int mInitScreenHeightDp;
7583
/**
7684
* 设计图上的总宽度, 单位 dp
7785
*/
@@ -199,6 +207,7 @@ AutoSizeConfig init(final Application application, boolean isBaseOnWidth, AutoAd
199207
this.mApplication = application;
200208
this.isBaseOnWidth = isBaseOnWidth;
201209
final DisplayMetrics displayMetrics = Resources.getSystem().getDisplayMetrics();
210+
final Configuration configuration = Resources.getSystem().getConfiguration();
202211

203212
getMetaData(application);
204213
isVertical = application.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT;
@@ -212,6 +221,8 @@ AutoSizeConfig init(final Application application, boolean isBaseOnWidth, AutoAd
212221
mInitDensityDpi = displayMetrics.densityDpi;
213222
mInitScaledDensity = displayMetrics.scaledDensity;
214223
mInitXdpi = displayMetrics.xdpi;
224+
mInitScreenWidthDp = configuration.screenWidthDp;
225+
mInitScreenHeightDp = configuration.screenHeightDp;
215226
application.registerComponentCallbacks(new ComponentCallbacks() {
216227
@Override
217228
public void onConfigurationChanged(Configuration newConfig) {
@@ -479,6 +490,24 @@ public float getInitXdpi() {
479490
return mInitXdpi;
480491
}
481492

493+
/**
494+
* 获取 {@link #mInitScreenWidthDp}
495+
*
496+
* @return {@link #mInitScreenWidthDp}
497+
*/
498+
public int getInitScreenWidthDp() {
499+
return mInitScreenWidthDp;
500+
}
501+
502+
/**
503+
* 获取 {@link #mInitScreenHeightDp}
504+
*
505+
* @return {@link #mInitScreenHeightDp}
506+
*/
507+
public int getInitScreenHeightDp() {
508+
return mInitScreenHeightDp;
509+
}
510+
482511
/**
483512
* 获取屏幕方向
484513
*

autosize/src/main/java/me/jessyan/autosize/DisplayMetricsInfo.java

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ public class DisplayMetricsInfo implements Parcelable {
3333
private int densityDpi;
3434
private float scaledDensity;
3535
private float xdpi;
36+
private int screenWidthDp;
37+
private int screenHeightDp;
3638

3739
public DisplayMetricsInfo(float density, int densityDpi, float scaledDensity, float xdpi) {
3840
this.density = density;
@@ -41,6 +43,15 @@ public DisplayMetricsInfo(float density, int densityDpi, float scaledDensity, fl
4143
this.xdpi = xdpi;
4244
}
4345

46+
public DisplayMetricsInfo(float density, int densityDpi, float scaledDensity, float xdpi, int screenWidthDp, int screenHeightDp) {
47+
this.density = density;
48+
this.densityDpi = densityDpi;
49+
this.scaledDensity = scaledDensity;
50+
this.xdpi = xdpi;
51+
this.screenWidthDp = screenWidthDp;
52+
this.screenHeightDp = screenHeightDp;
53+
}
54+
4455
public float getDensity() {
4556
return density;
4657
}
@@ -73,6 +84,22 @@ public void setXdpi(float xdpi) {
7384
this.xdpi = xdpi;
7485
}
7586

87+
public int getScreenWidthDp() {
88+
return screenWidthDp;
89+
}
90+
91+
public void setScreenWidthDp(int screenWidthDp) {
92+
this.screenWidthDp = screenWidthDp;
93+
}
94+
95+
public int getScreenHeightDp() {
96+
return screenHeightDp;
97+
}
98+
99+
public void setScreenHeightDp(int screenHeightDp) {
100+
this.screenHeightDp = screenHeightDp;
101+
}
102+
76103
@Override
77104
public int describeContents() {
78105
return 0;
@@ -84,13 +111,17 @@ public void writeToParcel(Parcel dest, int flags) {
84111
dest.writeInt(this.densityDpi);
85112
dest.writeFloat(this.scaledDensity);
86113
dest.writeFloat(this.xdpi);
114+
dest.writeInt(this.screenWidthDp);
115+
dest.writeInt(this.screenHeightDp);
87116
}
88117

89118
protected DisplayMetricsInfo(Parcel in) {
90119
this.density = in.readFloat();
91120
this.densityDpi = in.readInt();
92121
this.scaledDensity = in.readFloat();
93122
this.xdpi = in.readFloat();
123+
this.screenWidthDp = in.readInt();
124+
this.screenHeightDp = in.readInt();
94125
}
95126

96127
public static final Creator<DisplayMetricsInfo> CREATOR = new Creator<DisplayMetricsInfo>() {
@@ -112,6 +143,8 @@ public String toString() {
112143
", densityDpi=" + densityDpi +
113144
", scaledDensity=" + scaledDensity +
114145
", xdpi=" + xdpi +
146+
", screenWidthDp=" + screenWidthDp +
147+
", screenHeightDp=" + screenHeightDp +
115148
'}';
116149
}
117150
}

autosize/src/main/java/me/jessyan/autosize/unit/UnitsManager.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,10 @@ public class UnitsManager {
6868
* 是否支持副单位, 以什么为副单位? 默认不支持
6969
*/
7070
private Subunits mSupportSubunits = Subunits.NONE;
71+
/**
72+
* 是否支持 ScreenSizeDp 修改, 默认不支持
73+
*/
74+
private boolean isSupportScreenSizeDP = false;
7175

7276
/**
7377
* 设置设计图尺寸
@@ -175,6 +179,25 @@ public Subunits getSupportSubunits() {
175179
return mSupportSubunits;
176180
}
177181

182+
/**
183+
* 是否支持 ScreenSizeDp 修改, 默认不支持, 详情请看类文件的注释 {@link UnitsManager}
184+
*
185+
* @return {@code true} 为支持, {@code false} 为不支持
186+
*/
187+
public boolean isSupportScreenSizeDP() {
188+
return isSupportScreenSizeDP;
189+
}
190+
191+
/**
192+
* 是否让 AndroidAutoSize 支持 ScreenSizeDp 修改, 默认不支持, 详情请看类文件的注释 {@link UnitsManager}
193+
*
194+
* @param supportScreenSizeDP {@code true} 为支持, {@code false} 为不支持
195+
*/
196+
public UnitsManager setSupportScreenSizeDP(boolean supportScreenSizeDP) {
197+
isSupportScreenSizeDP = supportScreenSizeDP;
198+
return this;
199+
}
200+
178201
/**
179202
* 让 AndroidAutoSize 以什么单位为副单位, 在 pt、in、mm 这三个冷门单位中选择一个即可, 三个效果都是一样的
180203
* 按自己的喜好选择, 比如我就喜欢 mm, 翻译为中文是妹妹的意思

0 commit comments

Comments
 (0)