android中的dp在渲染前会将dp转为px,计算公式:

px = density * dp;

density = dpi / 160;

px = dp * (dpi / 160);

dpi = √widthpix widthpix + heightpix heightpix / 尺寸大小

android中所有的dp和px的转换都是通过 DisplayMetrics 中相关的值来计算的

假设设计图宽度是360dp,以宽维度来适配。
那么适配后的 density = 设备真实宽(单位px) / 360,接下来只需要把我们计算好的 density 在系统中修改下即可

public class ScreenAdapter {    private float sNonCompatDensity;    private float sNonCompatScaledDensity;    /**     * 假如:设计图是使用宽度为360dp设计     * 布局中就可以直接使用360dp宽度大小去设计     * 适配后的 density = 设备真实宽(单位px) / 360,接下来只需要把我们计算好的 density 在系统中修改下即可     * @param modelDpSize 设计模版宽dp大小     */    private void setCustomDensity(final Application application, int modelDpSize) {        final DisplayMetrics appDisplayMetrics = application.getResources().getDisplayMetrics();        if (sNonCompatDensity == 0) {            sNonCompatDensity = appDisplayMetrics.density;            sNonCompatScaledDensity = appDisplayMetrics.scaledDensity;            //监听系统字体切换            application.registerComponentCallbacks(new ComponentCallbacks() {                @Override                public void onConfigurationChanged(Configuration newConfig) {                    if (newConfig != null && newConfig.fontScale > 0) {                        sNonCompatScaledDensity = application.getResources().getDisplayMetrics().scaledDensity;                    }                }                @Override                public void onLowMemory() {                }            });        }        //density = px / dp        final float targetDensity = appDisplayMetrics.widthPixels / modelDpSize;        //不能直接用原始的scaledDensity,直接用的话可能导致某些文字超过显示区域,        //因此我们可以通过计算之前scaledDensity和density的比获得现在的scaledDensity        final float targetScaleDensity = targetDensity * (sNonCompatScaledDensity / sNonCompatDensity);        //density = dpi / 160;        final int targetDensityDpi = (int) (targetDensity * 160);        appDisplayMetrics.density = targetDensity;        appDisplayMetrics.scaledDensity = targetScaleDensity;        appDisplayMetrics.densityDpi = targetDensityDpi;        final DisplayMetrics activityDisplayMetrics = application.getResources().getDisplayMetrics();        activityDisplayMetrics.density = targetDensity;        activityDisplayMetrics.scaledDensity = targetScaleDensity;        activityDisplayMetrics.densityDpi = targetDensityDpi;    }}

更多相关文章

  1. android设置系统语言,字体大小,字体样式导致widget控件失效
  2. android:初级 [Android] Eclipse Android中设置模拟器屏幕大小几
  3. android字体大小多屏幕适配
  4. Android 自定义 Dialog 大小 位置 样式
  5. Android 使用 TableLayout 布局拉伸宽度
  6. android4.2上获取应用程序大小的变更点
  7. android:Spinner 设置收起以及展开的字体大小

随机推荐

  1. 【Android开机启动Activity或者Service方
  2. 定制自己的 Android(安卓)Dialog 信息提
  3. Android常用开源库(模块部分)
  4. 10.Android之测试代码实现步骤
  5. Android客户端通过socket与服务器通信
  6. 离线下载android sdk
  7. Android学习与面试重点目录
  8. Android 实用工具之HierarchyViewer
  9. android屏幕分辨率详解 ldpi mdpi hdpi
  10. 使用maven构建android 的apk包并自动签名