android屏幕适配问题

android屏幕适配问题


参考: https://blog.csdn.net/mac_lim/article/details/8928442
参考: https://blog.csdn.net/dhy270498872/article/details/8210968
参考: https://www.cnblogs.com/fengzhblog/p/3220333.html
web开发要做兼容,Android开发也抛不开类似的问题。。。。那就是要做屏幕适配。手机屏幕有各种大小,各种尺寸。有两种标准分类:
①按尺寸分:小屏幕、中屏幕、大屏幕、超大屏幕;
②按密度分:低密度(ldpi 120)、中密度(mdpi 160)、高密度(hdpi 240)、超高密度(xhdpi 320);

了解适配前先理清几个单词:
dpi:密度density的测量单位,dots per inch 每英寸内的像素数;
density:密度,1dp 占当前设备多少像素,ldpi为120,mdpi为160,hdpi为240,xhdpi为320;
dip:指定大小的单位,device independent pixels 设备独立像素;

当一张图片在不同的android设备上显示时,在屏幕占比是不一样的。
例:一张160px的图片,在480x800的屏幕上显示:
密度为:
160dpi时,占屏幕的三分之一(= 160px/480px)
240dpi时,占屏幕的二分之一(> 160px/480px)

图片如何在不同的设备上显示相同的像素数?
①为不同的设备准备相应的图片,放在对应的文件夹当中。
优点:图片不管在哪种密度的设备都很清晰细腻。
缺点:图片较多,图片制作工作量大。
②只准备一组图片放在drawable-nodpi中。
优点:图片数量较少减少图片制作工作量。
缺点:图片在不同的设备上会进行拉伸导致图片模糊不细腻。
③使用px指定图片大小。
把密度无关像素转换为屏幕像素的公式:
pixels = dip * (density / 160)
例:在dpi为240的屏幕上,1个dip等于1.5个物理像素,所以最好使用dip来定义程序界面布局。

//dip到pixel转化
Resources r = getResources();
float px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 12, r.getDisplayMetrics());

dip/dp与px之间的相互转换:

public int dip2px(Context context, float dipValue){
	float m=context.getResources().getDisplayMetrics().density ;
	return (int)(dipValue * m + 0.5f) ;
}

public int px2dip(Context context, float pxValue){
   float m=context.getResources().getDisplayMetrics().density ;
   return (int)(pxValue / m + 0.5f) ;
}

你可能感兴趣的:(Android)