欢迎访问移动开发之家(rcyd.net),关注移动开发教程。移动开发之家  移动开发问答|  每日更新
页面位置 : > > > 内容正文

Android自定义组件的精确适配,android自定义组件,如果我们想获得某一宽度值

来源: 开发者 投稿于  被查看 27967 次 评论:85

Android自定义组件的精确适配,android自定义组件,如果我们想获得某一宽度值


android的适配问题永远都是个头疼的问题,手机种类繁多,配置差异大,单纯的用dp,实际效果还是有差别的,本文分享下我的适配方法。

如果我们想获得某一宽度值,比如画个圆,获取圆的半径,

通常的做法:

/** 
     * 根据手机的分辨率从 dp 的单位 转成为 px(像素) 
     */  
    public static int dip2px(Context context, float dpValue) {  
        final float scale = context.getResources().getDisplayMetrics().density;  
        return (int) (dpValue * scale + 0.5f);  
    }

这种方法是通常的做法,也是Android内置组件使用的方法,如TextView中的一段代码:

 final float scale = getResources().getDisplayMetrics().density;
            mPopup = new ErrorPopup(err, (int) (200 * scale + 0.5f),

但是这种方法只考虑到了分辨率,没有考虑像素密度Dpi。这样的话,在相同分辨率下,如果手机的dpi很小,则显示的效果就会偏大。如果dpi很大,效果就会偏小。

另一种方法,其实也是笨方法:

/**
	 * 获得默认圆的半径
	 */
	public int getDefaultCircleRadius(){
    	if(screenWidth >= 1400){//1440,2k屏幕
    		return 34;
    	}
    	if(screenWidth >= 1000){//1080
    		if(densityDpi >=480)
        		return 30;
        	if(densityDpi >= 320)
        		return 31;
        	return 31;
    	}
    	if(screenWidth >= 700){//720
        	if(densityDpi >= 320)
        		return 18;
        	if(densityDpi >= 240)
        		return 18;
        	if(densityDpi >= 160)
        		return 19;
        	return 18;
    	}
    	if(screenWidth >= 500){//540
        	if(densityDpi >= 320)
        		return 15;
        	if(densityDpi >= 240)
        		return 16;
        	if(densityDpi >= 160)
        		return 17;
        	return 15;
    	}
    	return 15;
	}

densityDpi是像素密度。screenWidth是屏幕的宽度,代表分辨率,因为绝大多数手机的比例都是16:9或16:10的,所以高度上相差不大。

该方法就是在相同分辨率下,在根据像素密度区分。优点是适配灵活,可以任意添加适配的手机。缺点是,代码繁琐,另外对于大于2k的分辨率无法进行适配,解决的办法是,与第一种方法相结合:

public int getDefaultCircleRadius(){

        if(wcreenWidth > 1440){

             return dip2px(context, 30);

        }

    if(screenWidth >= 1400){//1440

    return 30;

    }

    if(screenWidth >= 1000){//1080

    if(densityDpi >=480)

        return 30;

        if(densityDpi >= 320)

        return 30;

        return 30;

    }

    if(screenWidth >= 700){//720

        if(densityDpi >= 320)

        return 18;

        if(densityDpi >= 240)

        return 18;

        if(densityDpi >= 160)

        return 18;

        return 18;

    }

    if(screenWidth >= 500){//540

        if(densityDpi >= 320)

        return 15;

        if(densityDpi >= 240)

        return 15;

        if(densityDpi >= 160)

        return 15;

        return 15;

    }

    return 15;

}

方法虽然优点笨,实际适配时也会增加很大工作量,但是对于精确适配以及全适配问题,还是很有用的。

用户评论