Android 单位转换(dp、sp、px)

本文介绍了Android系统中不同屏幕密度的定义及其之间的换算比例,并提供了dp、px和sp单位之间的转换方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Android 系统屏幕密度信息见下表:



独立像素密度 dp 

Android 系统使用 mdpi 即密度值为 160 的屏幕作为标准,在这个屏幕上 1px = 1 dp。例如同样是 100dp 的长度,在 mdpi 中为 100px,在 hdpi 中为 150px。各个密度值中的换算公式,在 mdpi 中 1 dp = 1 px,在 hpdi 中 1dp = 1.5 px,在 xhpi 中 1 dp = 2px,在 xxhdpi 中 1 dp = 3 px。所以各个分辨率直接换算比例:

ldpi: mdpi: hdpi: xhdpi: xxhdpi = 3: 4: 6: 8: 12。


下面是单位转换(可以作为工具类):

DisplayUtil.java :

package com.imooc.anim;

import android.content.Context;

/**
 *  dp、sp 转换为 px 的工具类
 */
public class DisplayUtil {

    /**
     *  将 px 值转换为 dip 或 dp, 保证尺寸大小不变
     *  DisplayMetrics 类中的 density 属性
     * @param context
     * @param pxValue
     * @return
     */
    public static int px2dip(Context context, float pxValue) {
        final float scale = context.getResources().getDisplayMetrics().density;
        return (int)(pxValue / scale + 0.5f);
    }

    /**
     *  将 dip 或 dp 值转换为 px 值,保证尺寸大小不变
     *  DisplayMetrics 类中的 density 属性
     * @param context
     * @param dipValue
     * @return
     */
    public static int dip2px(Context context, float dipValue) {
        final float scale = context.getResources().getDisplayMetrics().density;
        return (int)(dipValue * scale + 0.5f);
    }

    /**
     *  将 px 值转换为 sp 值,保证文字大小不变
     *  DisplayMetrics 类中的 scaledDensity 属性
     * @param context
     * @param pxValue
     * @return
     */
    public static int px2sp(Context context, float pxValue) {
        final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
        return (int)(pxValue / fontScale + 0.5f);
    }

    /**
     *  将 sp 值转换为 px 值,保证文字大小不变
     *  DisplayMetrics 类中的 scaledDensity 属性
     * @param context
     * @param spValue
     * @return
     */
    public static int sp2px(Context context, float spValue) {
        final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
        return (int)(spValue * fontScale + 0.5f);
    }

}

其中 density 就是前面所说的换算比例,这里使用的是公式换算方法进行转换。同时,系统也提供了 TypedValue 类帮助我们转换,代码如下:

   /**
     *  dp2px 系统提供的 TypedValue 类帮我们转换
     * @param context
     * @param dp
     * @return
     */
    protected int dp2px(Context context,int dp) {
        return (int) TypedValue.applyDimension(
                TypedValue.COMPLEX_UNIT_DIP,
                dp,
                context.getResources().getDisplayMetrics());
    }

    /**
     * sp2px 系统提供的 TypedValue 类帮我们转换
     * @param context
     * @param sp
     * @return
     */
    protected int sp2px(Context context, int sp) {
        return (int)TypedValue.applyDimension(
                TypedValue.COMPLEX_UNIT_SP,
                sp,
                context.getResources().getDisplayMetrics());
    }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值