美文网首页
今日头条解决适配(Android)

今日头条解决适配(Android)

作者: 阿立Vitasoy | 来源:发表于2020-07-20 18:20 被阅读0次
工具类如下:
/**
     * @param activity
     * @param application
     * @param isLandscape 是否是横屏
     */
 public class ScreenUtils {

    /** 设计稿标准 */
    private static final float width = 750f;
    private static final float high = 1334f;


    private static float textDensity = 0;
    private static float textScaledDensity = 0;


    /**
     * 今日头条的屏幕适配方案
     * 根据当前设备物理尺寸和分辨率去动态计算density、densityDpi、scaledDensity
     * 同时也解决了用户修改系统字体的情况
     * @param activity
     */
    public static void setCustomDensity(@NonNull Activity activity) {
        setCustomDensity(activity, false);
    }


    /**
     * @param activity
     * @param isLandscape 是否是横屏
     */
    public static void setCustomDensity(@NonNull final Activity activity, boolean isLandscape) {
        final Application application = activity.getApplication();
        final DisplayMetrics displayMetrics = application.getResources().getDisplayMetrics();
        if (textDensity == 0) {
            textDensity = displayMetrics.density;
            textScaledDensity = displayMetrics.scaledDensity;
            application.registerComponentCallbacks(new ComponentCallbacks() {
                @Override
                public void onConfigurationChanged(Configuration configuration) {
                    if (configuration != null && configuration.fontScale > 0) {
                        textScaledDensity = application.getResources().getDisplayMetrics().scaledDensity;
                    }
                }

                @Override
                public void onLowMemory() {

                }
            });
        }

        final float targetDensity;
        if (isLandscape) {//横屏
            targetDensity = displayMetrics.widthPixels / (high / 2); //当前UI标准750*1334
        } else {
            targetDensity = displayMetrics.widthPixels / (width / 2); //当前UI标准750*1334
        }


        final float targetScaledDensity = targetDensity * (textScaledDensity / textDensity);
        final int targetDpi = (int) (160 * targetDensity);

        displayMetrics.density = targetDensity;
        displayMetrics.scaledDensity = targetScaledDensity;
        displayMetrics.densityDpi = targetDpi;

        final DisplayMetrics activityDisplayMetrics = activity.getResources().getDisplayMetrics();
        activityDisplayMetrics.density = targetDensity;
        activityDisplayMetrics.scaledDensity = targetScaledDensity;
        activityDisplayMetrics.densityDpi = targetDpi;
    }

}
使用如下:
public class MainActivity extends AppCompatActivity {
    private TextView tv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //在设置布局之前调用工具类方法
        ScreenUtils.setCustomDensity(this);
        setContentView(R.layout.activity_main);
        tv = (TextView) findViewById(R.id.tv);
        int densityDpi = getResources().getDisplayMetrics().densityDpi;
        tv.setText("逻辑像素密度 dpi  " + densityDpi);

    }
}
//推荐使用
implementation 'me.jessyan:autosize:1.2.1'

相关文章

网友评论

      本文标题:今日头条解决适配(Android)

      本文链接:https://www.haomeiwen.com/subject/psvhzftx.html