Android 屏幕适配

android屏幕适配的整体思路

  • 开发前,选取一款主流屏幕进行开发,比如现在的1280*720;
  • 开发过程中,遵循一些原则:不用AbsoluteLayout(绝对布局), 多用相对布局&线性布局(权重), 要用dp,不用px
    dp和px的关系:dp = px/设备密度
    320*480的设备密度为1.0, 480*800的设备密度为1.5, 1280*720的设备密度为2.0。
    // 获取设备密度
    float density = getResources().getDisplayMetrics().density;
    System.out.println("设备密度:" + density);
  • 开发后期,再在不同的屏幕上测试(480*800 、1920*1080)。

具体主要有如下几种适配

  1. 图片适配(不是很常用)
    • 在不同的drawable文件夹下,放置几套不同大小的图片。
    • 缺点:会导致apk体积过大。
    • 如果图片非常重要,比如app的logo,这时可以在不同的drawable下放置几张不同大小的logo图片
  2. 布局适配(不是很常用)
    • 在res目录下,创建不同布局的layout文件夹。比如要适配480*800的屏幕,就建立layout-800x480的文件夹
    • 缺点:不利于后期维护,一旦布局需要改动一丁点,将是一个浩大的工程。
  3. 尺寸适配(很常用)
    • 在res目录下,创建不同的values文件夹。比如要适配1280*720的屏幕,就建立values-1280x720文件夹,在该文件夹下,创建dimens.xml文件,在文件里面设置尺寸。
  4. 权重适配(很常用)
    • android:weightSum=”3” android:weight=”1”
    • 在要平均分配屏幕宽度或高度时常用权重,比如一般app的底部标签的布局。
  5. 代码适配
    • int width = getWindowManager().getDefaultDisplay().getWidth();
      int height = getWindowManager().getDefaultDisplay().getHeight();
    • 拿到屏幕的宽高,就可以进行相关适配了。

屏幕适配的工具类

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值