Android适配不同屏幕

  • 首先介绍下Android的密度独立性原则:
  • 屏幕像素密度( dpi,即“dot per inch” )DisplayMetrics.density 在中等屏幕上等于1.0; 高密度的屏幕上它等于1.5; 一个额外的高密度屏幕上,它等于2.0; 和低密度屏幕上,它等于0.75.

  • 通俗的讲,在不同分辨率的手机上,像素(px)的密集程度不同,所以指定px的view 在不同屏幕上宽高不同,如下图:


  • 文本视图和位图绘制在像素(规定的尺寸 PX  单位),所以看法是低密度屏幕上的物理较大和较小的高密度屏幕上
  • 这是因为,尽管实际的屏幕尺寸可以是相同的,高密度屏幕具有每英寸更多的像素(像素的相同量适合在一个较小的区域),也就是像素密度大。所以显示的图像比例相对小;
  • 接下来我们说DP,  Android 提供了 密度独立 单位 DP 在不同密度屏幕上将Dp转成Px 进行构图,展现出来的View比例大小一致,如下图:

  • 所以我们可以通过设置View的密度独立像素( DP 单位)或 “WRAP_CONTENT”最简单通用的实现Android不同屏幕适配

  • 为了支持多屏幕,我们也需要将资源文件(res,drawable,dimens)进行配置, 但由于要控制apk包大小, 我们一般选取一到两个主流分辨率进行适配,我们现在主要使用xxhdpi,

  • LDPI(低)〜120DPI
  • MDPI(中)〜160dpi
  • hdpi(高)〜240dpi
  • xhdpi(超高)〜320dpi
  • xxhdpi(超特高)〜480dpi
  • xxxhdpi(超超特高)〜640dpi

DEV建议: 

  1. 使用WRAP_CONTENTFILL_PARENTDP在XML布局文件中指定的尺寸单位
  2. 不在程序代码中使用硬编码的像素值
  3. 不要使用AbsoluteLayout
  4. 提供备用位图资源针对不同屏幕密度


 /**
     * 根据手机的分辨率从 px(像素) 的单位 转成为 dp
     */
    public static float[] px2dp(Context context, float[] pxValue) {
        return new float[]{TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, pxValue[0],
                context.getResources().getDisplayMetrics()), TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, pxValue[1],
                context.getResources().getDisplayMetrics())};
    }

    /**
     * 根据手机的分辨率从 dp 的单位 转成为 px(像素)
     */
    public static float[] dp2px(Context context, float[] dpValue) {
        return new float[]{TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dpValue[0],
                context.getResources().getDisplayMetrics()), TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dpValue[1],
                context.getResources().getDisplayMetrics())};
    }


    public static float dp2px(Context cxt, float dp) {
        return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp,
                cxt.getResources().getDisplayMetrics());
    }

    public static float px2dp(Context cxt, float px) {
        final float scale = cxt.getResources().getDisplayMetrics().density;
        return (int) (px / scale + 0.5f); 
    }


// The gesture threshold expressed in dp   -- Google 提供.
private static final float GESTURE_THRESHOLD_DP = 16.0f;

// Get the screen's density scale
final float scale = getResources().getDisplayMetrics().density;
// Convert the dps to pixels, based on density scale
mGestureThreshold = (int) (GESTURE_THRESHOLD_DP * scale + 0.5f);

// Use mGestureThreshold as a distance in pixels...



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值