AndroidAutoSize
大概的实现原理:
px = dp * density
当前设备屏幕总宽度(单位为像素)/ 设计图总宽度(单位为 dp) = density
mPx:当前设备屏幕总宽度(变化)
mDp:设计图总宽度(不变)
mDensity: mPx/mDp 系数比(变化)
1. 假设当前设备的屏幕总宽度为1080px,当前设计图总宽度为375dp,根据以上计算出mDensity为2.88
屏幕上有一个50dp*50dp的控件,转化为px是50dp*2.88=144px
144px/1080px=0.133 即此控件占屏幕的实际比例为0.133
2.
假设当前设备的屏幕总宽度为1440 px,当前设计图总宽度为375dp,根据以上计算出mDensity为 3.84
屏幕上有一个50dp*50dp的控件,转化为px是50dp* 3.84= 192px
192px/1080px=0.133 即此控件占屏幕的实际比例为0.133
由此可看出,随着屏幕大小的变化,控件的实际占比是一样的
使用步骤:
1. implementation 'me.jessyan:autosize:0.9.1'
2.声明设计图中的尺寸(如果项目完全使用副单位, 则可以直接以像素为单位填写 AndroidManifest 中需要填写的设计图尺寸, 不需再把像素转化为 dp)
3.MyApplication中可以设置副单位(只能在 pt、in、mm 这三个冷门单位中选择一个作为副单位,选择什么单位就在 layout 文件中用什么单位进行布局)。
AutoSizeConfig.getInstance().getUnitsManager() .setSupportDP(false).setSupportSubunits(Subunits.MM);
副单位是用于规避修改 {@link DisplayMetrics#density} 所造成的对于其他使用 dp 布局的系统控件或三方库控件的不良影响
public enum Subunits { /** * 不使用副单位 */ NONE, /** * 单位 pt * * @see android.util.TypedValue#COMPLEX_UNIT_PT */ PT, /** * 单位 in * * @see android.util.TypedValue#COMPLEX_UNIT_IN */ IN, /** * 单位 mm * * @see android.util.TypedValue#COMPLEX_UNIT_MM */ MM }
4.
/** *isBaseOnWidth() * 是否按照宽度进行等比例适配 (为了保证在高宽比不同的屏幕上也能正常适配, 所以只能在宽度和高度之中选一个作为基准进行适配) * * @return {@code true} 为按照宽度适配, {@code false} 为按照高度适配 */
/** *getSizeInDp() * 返回设计图上的设计尺寸, 单位 dp * {@link #getSizeInDp} 须配合 {@link #isBaseOnWidth()} 使用, 规则如下: * 如果 {@link #isBaseOnWidth()} 返回 {@code true}, {@link #getSizeInDp} 则应该返回设计图的总宽度 * 如果 {@link #isBaseOnWidth()} 返回 {@code false}, {@link #getSizeInDp} 则应该返回设计图的总高度 * 如果您不需要自定义设计图上的设计尺寸, 想继续使用在 AndroidManifest 中填写的设计图尺寸, {@link #getSizeInDp} 则返回 {@code 0} * * @return 设计图上的设计尺寸, 单位 dp */
public class CustomAdaptActivity extends AppCompatActivity implements CustomAdapt { @Override public boolean isBaseOnWidth() { return false; } @Override public float getSizeInDp() { return 667; } }
public class CancelAdaptActivity extends AppCompatActivity implements CancelAdapt { }
AutoSizeConfig.getInstance().setCustomFragment(true);
public class CustomAdaptFragment extends Fragment implements CustomAdapt { @Override public boolean isBaseOnWidth() { return false; } @Override public float getSizeInDp() { return 667; } }
public class CancelAdaptFragment extends Fragment implements CancelAdapt { }
XML
-keep class me.jessyan.autosize.** { *; }
-keep interface me.jessyan.autosize.** { *; }