android中px与sp,dp之间的转换

android中px与sp,dp之间的转换
原创 2016年12月17日 22:00:51 标签:单位转换 /屏幕分辨率 /屏幕尺寸 /dpi 4552
由于Android手机厂商很多,导致了不同设备屏幕大小和分辨率都不一样,然而我们开发者要保持在不同设备上显示同样的视觉效果,就需要做一些适配效果。 
相关名词解释 
屏幕大小:通常指的是屏幕对角线的长度,使用“寸”为单位来衡量。 
分辨率:指手机屏幕的像素点个数,例如:720*1280,指的是宽有720个像素点,高有1280个像素点。 
dpi:指的是每英寸像素,是由对角线上的像素点数除以屏幕大小所得。 
系统屏幕密度 
ldpi文件夹下对应的密度为120dpi,对应的分辨率为240*320 
mdpi文件夹下对应的密度为160dpi,对应的分辨率为320*480 
hdpi文件夹下对应的密度为240dpi,对应的分辨率为480*800 
xhdpi文件夹下对应的密度为320dpi,对应的分辨率为720*1280 
xxhdpi文件夹下对应的密度为480dpi,对应的分辨率为1080*1920


由于各种屏幕密度的不同,导致了同一张图片在不同的手机屏幕上显示不同;
在屏幕大小相同的情况下,高密度的屏幕包含了更多的像素点。
android系统将密度为160dpi的屏幕作为标准对于mdpi文件夹,在此屏幕的手机上1dp=1px。
从上面系统屏幕密度可以得出各个密度值之间的换算;
在mdpi中1dp=1px,在hdpi中1dp=1.5px,在xhdpi中1dp=2px,在xxhpi中1dp=3px。
换算比例如下:ldpi:mdpi:hdpi:xhdpi:xxhdpi=3:4:6:8:12。


单位换算方法


/**
     * dp转换成px
     */
    private int dp2px(Context context,float dpValue){
        float scale=context.getResources().getDisplayMetrics().density;
        return (int)(dpValue*scale+0.5f);
    }


    /**
     * px转换成dp
     */
    private int px2dp(Context context,float pxValue){
        float scale=context.getResources().getDisplayMetrics().density;
        return (int)(pxValue/scale+0.5f);
    }
    /**
     * sp转换成px
     */
    private int sp2px(Context context,float spValue){
        float fontScale=context.getResources().getDisplayMetrics().scaledDensity;
        return (int) (spValue*fontScale+0.5f);
    }
    /**
     * px转换成sp
     */
    private int px2sp(Context context,float pxValue){
        float fontScale=context.getResources().getDisplayMetrics().scaledDensity;
        return (int) (pxValue/fontScale+0.5f);
    }




利用系统TypeValue类来转换


private int dp2px(Context context,int dpValue){
        return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,dpValue,context.getResources().getDisplayMetrics());
    }
    private int sp2px(Context context,int spValue){
        return (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP,spValue,context.getResources().getDisplayMetrics());
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值