Anroid屏幕适配之dp2px和sp2px的正确姿势

先看完Andoid屏幕适配终极手段(小编用过最得劲的dp适配)

https://www.jianshu.com/p/375d614401aa

private String getScreenParams() {
        DisplayMetrics dm = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(dm);
        int heightPixels = dm.heightPixels;//高的像素
        int widthPixels = dm.widthPixels;//宽的像素
        int densityDpi = dm.densityDpi;//dpi
        float xdpi = dm.xdpi;//xdpi
        float ydpi = dm.ydpi;//ydpi
        float density = dm.density;//density=dpi/160,密度比
        float scaledDensity = dm.scaledDensity;//scaledDensity=dpi/160 字体缩放密度比
        float heightDP = heightPixels / density;//高度的dp
        float widthDP = widthPixels / density;//宽度的dp
        String str = "heightPixels: " + heightPixels + "px";
        str += "\nwidthPixels: " + widthPixels + "px";
        str += "\ndensityDpi: " + densityDpi + "dpi";
        str += "\nxdpi: " + xdpi + "dpi";
        str += "\nydpi: " + ydpi + "dpi";
        str += "\ndensity: " + density;
        str += "\nscaledDensity: " + scaledDensity;
        str += "\nheightDP: " + heightDP + "dp";
        str += "\nwidthDP: " + widthDP + "dp";

        return str;
    }

density=dpi/160,密度比
dp和dip是一样的,密度无关像素,Density Independent Pixels的缩写,以160dpi为基准。在160dpi设备 上1dp=1px,在240dpi设备上1dp=1.5px,以此类推
那么,在给控件设置宽高的时候,给textView设置字体大小的时候,dp2px,sp2px的正确姿势如下:

选定一个普遍的widthdp的手机作为适配的标本,如360widthdp的手机,按比例由dp和sp计算px

/**
     * 将dp值转换为px值,保证尺寸大小不变
     *
     * @return
     */
    public static int dpAdapt(Activity activity, float dp,float widthDpBase) {
        DisplayMetrics dm = new DisplayMetrics();
        activity.getWindowManager().getDefaultDisplay().getMetrics(dm);
        int heightPixels = dm.heightPixels;//高的像素
        int widthPixels = dm.widthPixels;//宽的像素
//        int densityDpi = dm.densityDpi;//dpi
//        float xdpi = dm.xdpi;//xdpi
//        float ydpi = dm.ydpi;//ydpi
        float density = dm.density;//density=dpi/160,密度比
//        float scaledDensity = dm.scaledDensity;//scaledDensity=dpi/160 字体缩放密度比
        float heightDP = heightPixels / density;//高度的dp
        float widthDP = widthPixels / density;//宽度的dp
        float w=widthDP>heightDP?heightDP:widthDP;
//        final float scale = activity.getResources().getDisplayMetrics().density;
        return (int) (dp *w/widthDpBase* density + 0.5f);
    }
    /**
     * 将sp值转换为px值,保证尺寸大小不变
     *
     * @return
     */
    public static int spAdapt(Activity activity, float sp,float widthDpBase) {
        DisplayMetrics dm = new DisplayMetrics();
        activity.getWindowManager().getDefaultDisplay().getMetrics(dm);
        int heightPixels = dm.heightPixels;//高的像素
        int widthPixels = dm.widthPixels;//宽的像素
//        int densityDpi = dm.densityDpi;//dpi
//        float xdpi = dm.xdpi;//xdpi
//        float ydpi = dm.ydpi;//ydpi
        float density = dm.density;//density=dpi/160,密度比
//        float scaledDensity = dm.scaledDensity;//scaledDensity=dpi/160 字体缩放密度比
        float heightDP = heightPixels / density;//高度的dp
        float widthDP = widthPixels / density;//宽度的dp
        float w=widthDP>heightDP?heightDP:widthDP;
//        final float scale = activity.getResources().getDisplayMetrics().density;
        return (int) (sp *w/widthDpBase + 0.5f);
    }

使用的正确姿势

   tv_install.setTextSize(spAdapt(18));
   tv_install.setPadding(dpAdapt(20), dpAdapt(6), dpAdapt(20), dpAdapt(6));
 /**
     * 将dip或dp值转换为px值,保证尺寸大小不变
     *
     * @return
     */
    protected int dpAdapt(float dp) {
        return ScreenUtils.dpAdapt(activity, dp, 360);
    }

    /**
     * 将dip或dp值转换为px值,保证尺寸大小不变
     *
     * @return
     */
    protected int spAdapt(float sp) {
        return ScreenUtils.spAdapt(activity, sp, 360);

    }

欢迎联系、指正、批评

Github:https://github.com/AnJiaoDe

CSDN:https://blog.csdn.net/confusing_awakening

OpenCV入门教程:https://blog.csdn.net/confusing_awakening/article/details/113372425

ffmpeg入门教程:https://blog.csdn.net/confusing_awakening/article/details/102007792

微信公众号
这里写图片描述

QQ群

这里写图片描述

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值