Android适配不同屏幕
2016-04-29 11:13
477 查看
首先介绍下Android的密度独立性原则:
屏幕像素密度(dpi,即“dot per inch”):
通俗的讲,在不同分辨率的手机上,像素(px)的密集程度不同,所以指定px的view 在不同屏幕上宽高不同,如下图:
(
文本视图和位图绘制在像素(规定的尺寸
这是因为,尽管实际的屏幕尺寸可以是相同的,高密度屏幕具有每英寸更多的像素(像素的相同量适合在一个较小的区域),也就是像素密度大。所以显示的图像比例相对小;
接下来我们说DP, Android 提供了
密度独立单位DP在不同密度屏幕上将Dp转成Px
进行构图,展现出来的View比例大小一致,如下图:
所以我们可以通过设置View的密度独立像素(
为了支持多屏幕,我们也需要将资源文件(res,drawable,dimens)进行配置, 但由于要控制apk包大小, 我们一般选取一到两个主流分辨率进行适配,我们现在主要使用xxhdpi,
LDPI(低)〜120DPI
MDPI(中)〜160dpi
hdpi(高)〜240dpi
xhdpi(超高)〜320dpi
xxhdpi(超特高)〜480dpi
xxxhdpi(超超特高)〜640dpi
DEV建议:
使用
不在程序代码中使用硬编码的像素值
不要使用
提供备用位图资源针对不同屏幕密度
屏幕像素密度(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建议:
使用
WRAP_CONTENT,
FILL_PARENT或
DP在XML布局文件中指定的尺寸单位
不在程序代码中使用硬编码的像素值
不要使用
AbsoluteLayout
提供备用位图资源针对不同屏幕密度
/** * 根据手机的分辨率从 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...
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories