AutoSize 今日头条屏幕适配方案

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
 */

 

Activity

  • Customize the adaptation parameters of the Activity:
public class CustomAdaptActivity extends AppCompatActivity implements CustomAdapt {

    @Override
    public boolean isBaseOnWidth() {
        return false;
    }

    @Override
    public float getSizeInDp() {
        return 667;
    }
}
  • Cancel the adaptation of the Activity:
public class CancelAdaptActivity extends AppCompatActivity implements CancelAdapt {

}

Fragment

  • First enable the ability to support Fragment custom parameters
AutoSizeConfig.getInstance().setCustomFragment(true);
  • Customize the adaptation parameters of the Fragment:
public class CustomAdaptFragment extends Fragment implements CustomAdapt {

    @Override
    public boolean isBaseOnWidth() {
        return false;
    }

    @Override
    public float getSizeInDp() {
        return 667;
    }
}
  • Cancel the adaptation of the Fragment:
public class CancelAdaptFragment extends Fragment implements CancelAdapt {

}

XML

ProGuard

 -keep class me.jessyan.autosize.** { *; }
 -keep interface me.jessyan.autosize.** { *; }

你可能感兴趣的:(Android)