android 尺寸适配相关

Android上常见度量单位

px(像素):屏幕上的点,绝对长度,与硬件相关。

in(英寸):长度单位。

mm(毫米):长度单位。

pt(磅):1/72英寸,point。

dp(与密度无关的像素):一种基于屏幕密度的抽象单位。在每英寸160点的显示器上,1dp = 1px。

dip:Density-independent pixel,同dp相同。

sp:在dp的基础上,还与比例无关,个人理解为是一个矢量图形单位。

在xml中定义大小,建议TextView使用sp,其他使用dp

系统定义了四种像素密度:低(120dpi)、中(160dpi)、高(240dpi)和超高(320dpi)

设备独立像素转换成屏幕实际像素的换算很简单:px
= dp * (dpi/ 160).  pixls=160*(320/160)

ImageView中XML属性src和background的区别:

background会根据ImageView组件给定的长宽进行拉伸,而src就存放的是原图的大小,不会进行拉伸。src是图片内容(前景),bg是背景,可以同时使用。

此外:scaleType只对src起作用

Android资源文件

drawable-hdpi里面存放高分辨率的图片,如WVGA (480x800),FWVGA (480x854)
drawable-mdpi里面存放中等分辨率的图片,如HVGA (320x480)
drawable-ldpi里面存放低分辨率的图片,如QVGA (240x320)

对应关系

                Android手机屏幕标准       对应图标尺寸标准   屏幕密度

xhdpi               1280*720                               96*96             320

hdpi                 480*800                               72*72             240

mdpi                480*320                               48*48             160

ldpi                  320*240                                36*36             120

以480dip*800dip的WVGA(density=240)为例,详细列出不同density下屏幕分辨率信息:

当density=120时 屏幕实际分辨率为240px*400px (两个点对应一个分辨率)

状态栏和标题栏高各19px或者25dip

横屏是屏幕宽度400px 或者800dip,工作区域高度211px或者480dip

竖屏时屏幕宽度240px或者480dip,工作区域高度381px或者775dip

density=160时 屏幕实际分辨率为320px*533px (3个点对应两个分辨率)

状态栏和标题栏高个25px或者25dip

横屏是屏幕宽度533px 或者800dip,工作区域高度295px或者480dip

竖屏时屏幕宽度320px或者480dip,工作区域高度508px或者775dip

density=240时 屏幕实际分辨率为480px*800px (一个点对于一个分辨率)

状态栏和标题栏高个38px或者25dip

横屏是屏幕宽度800px 或者800dip,工作区域高度442px或者480dip

竖屏时屏幕宽度480px或者480dip,工作区域高度762px或者775dip

如何计算密度(dpi)

1.标准是240*320画在1.5*2平方inch上。那么像每平方英寸有240*320/(1.5*2)=25600点,也就是一平方英寸的像素点为25600,所以dpi取为它的平方根160;如果你的dpi是120,那么它的密度就是0.75.

2. 密度不只是与width有关,还与height有关,所以不管width是1.8还是1.3,它的密度都有可能是1;比如width是1.8,只要它的 height是3/1.8的话,如果pixel为240*320的话,它的密度仍旧是1;同样如果width为1.3,只要它的 height为3/1.3的话,像素点为240*320,则密度也是1.

3.320*480/(1.5*2)得到单位平方英寸的点为51200,所以单位平方英寸是240*320画在1.5*2屏幕的2倍。但是这是平方英寸啊,算密度的时候要开平方的啊,所以应该是2开平方,是1.414吧,大致密度为1.5。

px与dip的关系

Android中,在160dpi (mdpi)中, 1 dip= 1 px;

以此类推,在120dpi(ldpi)中, 1 dip = 0.75px;

                  在240dpi (hdpi)中,  1 dip = 1.5px;

                  在320dpi(xhdpi)中, 1dip = 2px;

如何做到与密度无关

  如果屏幕密度为160,这时dp和sp和px是一样的。1dp=1sp=1px,但如果使用px作单位,如果屏幕大小不变(假设还是3.2寸),而屏 幕密度变成了320。那么原来TextView的宽度设成160px,在密度为320的3.2 寸屏幕里看要比在密度为160的3.2寸屏幕上看短了一半。但如果设置成160dp或160sp的话。系统会自动将width属性值设置成320px的。 也就是160 * 320 / 160。其中320 / 160可称为密度比例因子。也就是说,如果使用dp和sp,系统会根据屏幕密度的变化自动进行转换。官方文档总结的计算公式为:pixels
= dps * (density /160).

使用dip作为View的单位,这样就可以同时兼容各种不同的分辨率,不会造成UI的不可兼容。

优化的两种方式:

1大背景图使用:9.png,使用9png不但能节省APK包容量,更能有效节省堆栈内存

2小技巧1:使用多分辨率图片设计[hdpi,mdpi,ldpi,xhdpi]。UI图片分别设计hdpi,mdpi,ldpi,xhdpi等多种规格,这也是官方推荐的方式,

 使用这种方式,还有好处就是可以降低峰值内存,优先避免内存溢出。在android中图片的加载会根据分辨率来自动缩放【缩放的过程会额外消耗内存】
图片资源放在assets或no-dpi中

import android.content.Context;
import android.util.DisplayMetrics;

/**
 * 计算公式 pixels = dips * (density / 160)
 *
 * @version 1.0.1 2010-12-11
 *
 * @author
 */
public class DensityUtil {

	private static final String TAG = DensityUtil.class.getSimpleName();

	// 当前屏幕的densityDpi
	private static float dmDensityDpi = 0.0f;
	private static DisplayMetrics dm;
	private static float scale = 0.0f;

	/**
	 *
	 * 根据构造函数获得当前手机的屏幕系数
	 *
	 * */
	public DensityUtil(Context context) {
		// 获取当前屏幕
		dm = new DisplayMetrics();
		dm = context.getApplicationContext().getResources().getDisplayMetrics();
		// 设置DensityDpi
		setDmDensityDpi(dm.densityDpi);
		// 密度因子
		scale = getDmDensityDpi() / 160;
		Logger.i(TAG, toString());
	}

	/**
	 * 当前屏幕的density因子
	 *
	 * @param DmDensity
	 * @retrun DmDensity Getter
	 * */
	public static float getDmDensityDpi() {
		return dmDensityDpi;
	}

	/**
	 * 当前屏幕的density因子
	 *
	 * @param DmDensity
	 * @retrun DmDensity Setter
	 * */
	public static void setDmDensityDpi(float dmDensityDpi) {
		DensityUtil.dmDensityDpi = dmDensityDpi;
	}

	/**
	 * 密度转换像素
	 * */
	public static int dip2px(float dipValue) {

		return (int) (dipValue * scale + 0.5f);

	}

	/**
	 * 像素转换密度
	 * */
	public int px2dip(float pxValue) {
		return (int) (pxValue / scale + 0.5f);
	}

	@Override
	public String toString() {
		return " dmDensityDpi:" + dmDensityDpi;
	}
}
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
...
<supports-screens
     android:smallScreens="true"
     android:normalScreens="true"
     android:largeScreens="true"
     android:xlargeScreens="true"
     android:anyDensity="true" />

...
</manifest>

参考http://blog.csdn.net/liguangzhenghi/article/details/7244271

http://www.oschina.net/question/234345_40079

http://uoloveruo.blog.163.com/blog/static/283311422011102304132611/

http://blog.csdn.net/xixinyan/article/details/7316313

http://download.csdn.net/detail/welovesunflower/4540688

http://www.360doc.com/content/12/0301/17/5087210_190881395.shtml

使用Memory
Analyzer tool(MAT)分析内存泄漏(二)

http://www.blogjava.net/rosen/archive/2010/06/13/323522.html

MAT来分析,前提是Android开发和测试的工具安装完整,SDK,Eclipse:
1.打开Eclipse
2.选择 Help->Install New Software;
3.在Work with中添加站点:http://download.eclipse.org/mat/1.4/update-site/(这个地址可能会变化,但是新的地址可以在官方网站上找到:http://www.eclipse.org/mat/downloads.php )
4.生成.hprof文件:插入SD卡(Android机器很多程序都需要插入SD卡),并将设备连接到PC,在Eclipse中的DDMS中选择要测试的进程,然后点击Update Heap 和Dump HPROF file两个Button。
.hprof 文件会自动保存在SD卡上,把 .hprof 文件拷贝到PC上的\ android-sdk-windows\tools目录下。这个由DDMS生成的文件不能直接在MAT打开,需要转换。
运行cmd打开命令行,cd到\ android-sdk-windows\tools所在目录,并输入命令hprof-conv xxxxx.hprof yyyyy.hprof,其中xxxxx.hprof为原始文件,yyyyy.hprof为转换过后的文件。转换过后的文件自动放在android-sdk-windows\tools 目录下。
OK,到此为止,.hprof文件处理完毕,可以用来分析内存泄露情况了。
5.打开MAT:
在Eclipse中点击Windows->Open Perspective->Other->Memory Analysis
6.导入.hprof文件
在MAT中点击 File->Open File,浏览到刚刚转换而得到的.hprof文件,并Cancel掉自动生成报告,点击Dominator Tree,并按Package分组,选择自己所定义的Package 类点右键,在弹出菜单中选择List objects->With incoming references。

这时会列出所有可疑类,右键点击某一项,并选择Path to GC Roots->exclude weak/soft references,会进一步筛选出跟程序相关的所有有内存泄露的类。据此,可以追踪到代码中的某一个产生泄露的类。

Memory Analyzer 1.4.0 Release

时间: 2024-12-04 22:49:07

android 尺寸适配相关的相关文章

Android屏幕适配全攻略(最权威的官方适配指导)

转载请注明出处:http://blog.csdn.net/zhaokaiqiang1992 Android的屏幕适配一直以来都在折磨着我们这些开发者,本篇文章以Google的官方文档为基础,全面而深入的讲解了Android屏幕适配的原因.重要概念.解决方案及最佳实践,我相信如果你能认真的学习本文,对于Android的屏幕适配,你将有所收获! Android屏幕适配出现的原因 重要概念 屏幕尺寸 屏幕分辨率 屏幕像素密度 dpdipdpisppx mdpihdpixdpixxdpi 解决方案 支持

Android屏幕适配

http://www.apkbus.com/android-41832-1-1.html 图像显示所需的概念: 像素:一幅图片的显示就是由许多显示着不同颜色的小方格组成的,这样的小方格就被称为像素,是构成图片的最小单位.但是这个像素的具体大小是多少呢?这需要取决于显示这张图片的具体的物理设备显示一个图片像素点的荧光点的大小.图片文件只是记录着它自身有多少个像素点,每个像素点显示什么颜色,至于它自身物理尺寸有多大,它自身也无法得知,例如一张480*800像素的图片在电脑显示器上显示明显要比在手机屏

一种粗暴快速的Android全屏幕适配方案

本文讲的是一种粗暴快速的Android全屏幕适配方案,由于Android碎片化严重,屏幕适配一直是开发中较为头疼的问题.面对市面上五花八门的屏幕大小与分辨率,Android基于dp与res目录名称来适配的方案已无法满足一次编写全屏幕适配的需求,为了达到最优的视觉效果,开发过程中总是需要花费较多资源进行适配.也有开发者给出了一些自己的解决方案.首先来分析一下一些常见的解决方案的现状: 1. 官方适配方案 – dp.dp是Android开发中特有的一个单位.与px不同,dp是基于屏幕像素密度的一种单

图片-Android屏幕适配问题,菜鸟求助

问题描述 Android屏幕适配问题,菜鸟求助 如题, 本人菜鸟不知道怎么屏幕适配呀, 我用的是demin建立了两个文件, 一个是(1280x720的),另外一个是1920x1080的. 在里面写的尺寸.因为我们美工给我的图片都是px的. 换算如下 解决方案 做android开发,开源嘛,满市场都是凌乱的机型,总少不了适配这样或那样的型号.在这里分享一下自己在开发中用到的方法. 首先要介绍一下drawable-mdpi.drawable-hdpi-1280x800.drawable-hdpi.这

Android 屏幕适配方案

转载请标明出处:  http://blog.csdn.net/lmj623565791/article/details/45460089:  1.概述 大家在Android开发时,肯定会觉得屏幕适配是个尤其痛苦的事,各种屏幕尺寸适配起来蛋疼无比.如果我们换个角度我们看下这个问题,不知道大家有没有了解过web前端开发,或者说大家对于网页都不陌生吧,其实适配的问题在web页面的设计中理论上也存在,为什么这么说呢?电脑的显示器的分辨率.包括手机分辨率,我敢说分辨率的种类远超过Android设备的分辨率

android 屏幕适配问题

问题描述 android 屏幕适配问题 我写了4中尺寸的适配,但是每次都是跳到hdpi这边,不知道怎么回事,用了高分辨率的 手机和低分辨率的都是一样效果 解决方案 如何将一个应用程序适配在不同的手机上,虽然这不算是一个技术问题,但是对于刚刚做屏幕的开发人员来说,还真不是一件多么简单的事情. ? 首先:你需要在AndroidManifest.xml文件的<manifest>元素如下添加子元素 <supports-screens android:largeScreens="true

Android分辨率适配小试牛刀

概述 大家在Android开发时,肯定会觉得屏幕适配是个尤其痛苦的事,各种屏幕尺寸适配起来蛋疼无比.如果我们换个角度我们看下这个问题,不知道大家有没有了解过web前端开发,或者说大家对于网页都不陌生吧,其实适配的问题在web页面的设计中理论上也存在,为什么这么说呢?电脑的显示器的分辨率.包括手机分辨率,我敢说分辨率的种类远超过Android设备的分辨率,那么有一个很奇怪的现象: 为什么Web页面设计人员从来没有说过,尼玛适配好麻烦? 那么,到底是什么原因,让网页的设计可以在千差万别的分辨率的分辨

实用Android 屏幕适配方案分享

转载地址:http://blog.csdn.net/gao_chun/article/details/45645051 真正可用,并且简单易行,可以在多个屏幕大小和屏幕密度上有良好表现的Android 屏幕适配方案,已用在一款成熟互联网应用中,效果还不错. 说起android开发,UI界面的多机型适配,一向是个很重要的问题. 网上这方面的文章很多,面试的时候也经常会问到,大部分的内容都很类似,无外乎用dp,sp 不要用px之类老生常谈的问题. 但是会说的居多,实际可以执行的可行方案,很少有人会.

Android多分辨率适配框架(3)— 使用指南

探索Android软键盘的疑难杂症 深入探讨Android异步精髓Handler 详解Android主流框架不可或缺的基石 站在源码的肩膀上全解Scroller工作机制 Android多分辨率适配框架(1)- 核心基础 Android多分辨率适配框架(2)- 原理剖析 Android多分辨率适配框架(3)- 使用指南 自定义View系列教程00–推翻自己和过往,重学自定义View 自定义View系列教程01–常用工具介绍 自定义View系列教程02–onMeasure源码详尽分析 自定义View