`
su1216
  • 浏览: 671133 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
Group-logo
深入入门正则表达式(jav...
浏览量:71931
E60283d7-4822-3dfb-9de4-f2377e30189c
android手机的安全问...
浏览量:128785
社区版块
存档分类
最新评论

android 项目移植/分辨率适配与dip(dp)的使用

阅读更多

如果想在不同型号手机对同一个应用做适配,如果你在xml中全部使用dp没有使用px,那么适配上依然很有可能出问题!

 

无数人存在误区,认为自己使用的都是dp,为什么在手机A上面和手机B上面看上去比例不一样,为什么在A手机上显示正好而手机B上却显示到屏幕外面

 

每次解释的都很累,所以写此blog

 

首先先明确几个概念

density值表示每英寸有多少个显示点(*)

dip/dp: device independent pixels(设备独立像素)

注意:dip与屏幕密度有关,屏幕密度与硬件有关,硬件设置不正确,有可能导致dip不能正常显示。在屏幕密度为160的显示屏上,1dip=1px

 

下面是一些分辨率信息

 

名称 分辨率 屏幕密度
QVGA 320*240 120
WQVGA400 400*240 120
WQVGA432 432*240 120
HVGA 640*480 160
WSVGA 1024*600 160
WXGA800 1280*800 160
WVGA800 800*480 240
WVGA854 854*480 240
WXGA720 1280*720 320

 

下面没有特殊说明的话,屏幕的宽度都指其像素数

我们在手机A上面放了一张图片,120px宽,手机屏幕240px宽,也就是说图片的宽度占了整个屏幕的一半

如果把应用安装在手机B上,B的宽度=320px,那么我们希望图片宽度为多少呢?如果大家希望按着比例缩放,那图片宽度应该是160px,占屏幕宽度的50%

 

如果我们在xml中使用的单位为dp,下面看看如何保持这个比例:

px = (density/160)dp(density这里是(*)的意思)

我们把所期待的比例记为rate,baseDensity=160,屏幕的宽度(像素数)为x,屏幕密度为density

那么rate=((density/baseDensity)*dp)/x;

这里baseDensity是已知的=160,dp也是已知的,因为是你写的嘛。

未知的是density屏幕密度和屏幕宽度x

 

rate可以写为:

rate=(dp/baseDensity)*(density/x);

现在情况就比较明朗了,rate=K(常数)*(density/x);

如果想保持rate不变,那么需要保证density/x保持比例

 

给数学不好的同学多解释两句

想保持rate的话,必须要手机A的屏幕密度/屏幕宽度=手机B的屏幕密度/屏幕宽度

或者说手机A的屏幕密度/手机B的屏幕密度=手机A的屏幕宽度/手机B的屏幕宽度

 

同样,如果你要保持纵向也保持等比缩放,那么也同样需要保持比例。

只有这样,你的应用才能看上去是等比缩放的。

使用dp保持比例只和这些有关,和你屏幕大小半点关系都没有。

 

还有另一种方式来保持比例:就是直接使用比例方式定义组件大小

但是很有局限性,只有LinearLayout中可以使用android:layout_weight属性

 

其实很容易理解,给大家举个例子

很多人觉得,如果项目中全部使用dp,那么就可以完美移植。

我们的一个移植项目,任务是把应用从A(分辨率为WXGA720=1280*720)移植到B(分辨率WVGA800=800*480)

其中A的密度=320,B的密度为240

 

我们现在来看看A横向有多少个dp

A dp数=720/(320/160)=360

B dp数=480/(240/160)=320

 

手机A横向有360个dp,如果你的图片占用360个dp,B去哪找你多出来的40dp呢!必然它会显示在屏幕外面阿!

 

 

ps:下面是一点相关内容

下面是函数void android.util.DisplayMetrics.setToDefaults()

public void setToDefaults() {
    widthPixels = 0;
    heightPixels = 0;
    density = DENSITY_DEVICE / (float) DENSITY_DEFAULT;
    densityDpi = DENSITY_DEVICE;
    scaledDensity = density;
    xdpi = DENSITY_DEVICE;
    ydpi = DENSITY_DEVICE;
    noncompatWidthPixels = 0;
    noncompatHeightPixels = 0;
}

 

其中density变量注释如下

 

density变量注释 写道
float android.util.DisplayMetrics.density

The logical density of the display.
This is a scaling factor for the Density Independent Pixel unit, where one DIP is one pixel on an approximately 160 dpi screen (for example a 240x320, 1.5"x2" screen), providing the baseline of the system's display.
Thus on a 160dpi screen this density value will be 1; on a 120 dpi screen it would be .75; etc.

This value does not exactly follow the real screen size (as given by xdpi and ydpi, but rather is used to scale the size of the overall UI in steps based on gross changes in the display dpi.
For example, a 240x320 screen will have a density of 1 even if its width is 1.8", 1.3", etc.
However, if the screen resolution is increased to 320x480 but the screen size remained 1.5"x2" then the density would be increased (probably to 1.5).

See Also:
DENSITY_DEFAULT

可以看出这个density是个近似值,并不严格按着真实屏幕尺寸计算。

 

 

转贴请保留以下链接

本人blog地址

http://su1216.iteye.com/

http://blog.csdn.net/su1216/

分享到:
评论

相关推荐

    Android多分辨率多密度下UI适配方案.

    Android 多分辨率多密度下 UI 适配方案 Android 设计之初就考虑到了 UI 在多平台的适配,它本身提供了...通过以上方法,可以实现 Android 应用程序在多分辨率多密度下的 UI 适配,提高应用程序的可移植性和用户体验。

    SSH移植到android系统步骤.doc

    我们可以从GitHub上克隆OpenSSH源码:`$git clone https://android.googlesource.com/platform/external/openssh` 将源码克隆到Android源码的external目录下。 Step 2: 编译OpenSSH模块 接下来,我们需要编译...

    Android系统移植与平台开发

    Android系统移植与平台开发涉及到多个方面,包含对Android系统本身的下载、编译、移植过程,以及对开发人员如何针对特定硬件平台进行开发的指导。本篇文档的内容详细描述了Android系统移植与平台开发的前期准备、...

    android系统移植资料集锦

    8. **权限管理与SELinux**:Android采用基于角色的权限管理系统(RMS)和强制访问控制(MAC)的SELinux,移植时需要适配目标设备的权限模型。 9. **系统启动流程**:理解Zygote进程的启动、SystemServer的初始化...

    [14本经典Android开发教程]-11-Android系统移植技术详解

    Android系统移植技术是Android开发中的一个重要环节,它涉及到将Android操作系统适配到不同的硬件平台,以便在各种设备上运行。本文将重点解析Android系统移植的关键步骤和技术要点。 首先,进行Android系统移植...

    NXP-PN5XX Android 驱动移植官方文档

    - **移植源码**:然后详细描述如何逐步适应从NXP-NCI Android NFC软件包交付的Android开源项目源码。这个过程包括了对原生库、Java框架、JNI代码的修改和适配。 5. **移植过程中的关键点:** - **Android系统适配...

    Android驱动开发与移植实战详解_android驱动_android驱动_android_

    本文将深入探讨Android驱动开发与移植的实战细节,帮助开发者理解和掌握这一关键技能。 一、Android驱动概述 Android驱动主要分为内核空间驱动和用户空间驱动两部分。内核空间驱动直接与硬件交互,而用户空间驱动则...

    Android项目_Porting台湾 移植与研究实行.rar

    **Android项目:Porting台湾移植与研究实行** 本项目旨在提供一个全面的Android项目移植和研究框架,特别关注于将现有台湾地区的应用或系统功能无缝地集成到新的Android项目中。通过我们的研究和实践,我们整理出了...

    Android系统移植技术详解

    Android系统移植技术是一个复杂而精细的过程,涉及到多个层面的工作,包括环境配置、代码编译、设备驱动移植以及系统服务的定制。以下是对标题和描述中所提及知识点的详细解释: 1. **Android系统开发编译环境配置*...

    Android系统移植文档

    首先,Android系统移植的核心是理解和掌握Android的内核层与硬件抽象层(HAL)的关系。Android基于Linux内核,因此移植首先需要对目标硬件的驱动程序进行适配,确保内核能够正确识别并驱动设备的各个部件,如CPU、...

    Android 驱动移植 英文

    驱动移植是将操作系统(在此为Android)与特定硬件平台(例如ARM架构下的SoC)进行适配的过程。这涉及到对底层硬件的深入理解以及操作系统内核和用户空间软件的修改。对于本主题而言,我们将重点放在WLAN(无线...

    android 系统移植讲解

    Android系统移植是一个复杂而精细的过程,它涉及到操作系统内核、硬件驱动、用户界面以及应用程序等多个层面的整合。本文将深入探讨Android系统移植的关键步骤和重要知识点。 首先,我们需要理解Bootloader。...

    基于Android的BSP移植自动适配技术.pdf

    基于此背景,"基于Android的BSP移植自动适配技术"提出了新的解决方案,旨在提高移植效率并减少人工干预。 本技术着重探讨如何实现BSP移植过程的自动化,包括以下几个核心知识点: 1. **驱动程序自动化适配**:驱动...

    Android系统移植

    这部分移植工作包括安装和配置AOSP(Android开放源码项目)源码,调整Build系统以适应目标硬件,以及处理权限管理、系统服务、运行库等方面的适配。 在完成上述工作后,还需要进行系统集成和测试。这包括编译构建...

    dropbear移植到android9.0系统

    《Dropbear在Android 9.0系统的移植与应用》 Dropbear是一款轻量级的SSH服务器和客户端软件,尤其适用于资源有限的设备,如嵌入式系统和移动设备,如Android。在Android 9.0(Pie)系统上移植Dropbear,能够为设备...

    NTFS-3g android 移植版

    《NTFS-3g在Android平台的移植与应用》 NTFS-3g是一款开源的、为Linux系统设计的NTFS文件系统驱动程序,它允许Linux用户读写Microsoft Windows操作系统所使用的NTFS格式的磁盘。这个软件项目始于2005年,经过多次...

    《Android系统移植和驱动开发》 PDF

    本书针对特定硬件平台从零构建Android系统,包括平台移植、应用开发、内核开发以及驱动开发。目前企业对Android人才需求主要分布在应用开发和底层系统开发两个方面,企业最紧缺的是兼具二者的全才型系统工程师,和...

    Android系统级深入开发——移植与调试 pdf

    4. **系统编译与构建**:AOSP(Android开放源码项目)提供了构建系统,开发者需要学习使用mm、mmm等命令编译特定模块,以及使用source build/envsetup.sh和lunch来配置编译环境和选择目标设备。 5. **Android运行时...

    wireless_tools.29版本Android移植完的代码

    在Android系统上移植这些工具,可以使得开发者在没有USB连接或者无法使用ADB的情况下,依然能够通过无线网络进行远程调试和诊断。 移植`wireless_tools.29`到Android系统主要涉及以下几个步骤: 1. **源码获取**:...

    android中移植 c c++程序

    Android 中移植 C/C++ 程序 Android 中移植 C/C++ 程序是一项复杂的任务,需要了解 Android 的编译环境和 Linux 内核中的移植机制。在 Android 中,C/C++ 程序需要编译成静态库或动态链接库,以便在 Android 设备上...

Global site tag (gtag.js) - Google Analytics