`

Android 中dp 和px 转换及原理分析

阅读更多

 

具体的转换方法如下,网上都是有的,但是自己看了之后感觉还是有点不明不白的,具体为什么呢,可以继续看后面.

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

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

 

首先先列出来相关的方法:

Resources.java

public Resources(AssetManager assets, DisplayMetrics metrics,
            Configuration config, CompatibilityInfo compInfo) {
        mAssets = assets;
        mMetrics.setToDefaults();
        mCompatibilityInfo = compInfo;
        updateConfiguration(config, metrics);
        assets.ensureStringBlocks();
}

 

DisplayMetrics.java 相关方法

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 = widthPixels;
        noncompatHeightPixels = heightPixels;
        noncompatDensity = density;
        noncompatDensityDpi = densityDpi;
        noncompatScaledDensity = scaledDensity;
        noncompatXdpi = xdpi;
        noncompatYdpi = ydpi;
    }
	
	
	 public static int DENSITY_DEVICE = getDeviceDensity();
	 
	 
	  private static int getDeviceDensity() {
        // qemu.sf.lcd_density can be used to override ro.sf.lcd_density
        // when running in the emulator, allowing for dynamic configurations.
        // The reason for this is that ro.sf.lcd_density is write-once and is
        // set by the init process when it parses build.prop before anything else.
        return SystemProperties.getInt("qemu.sf.lcd_density",
                SystemProperties.getInt("ro.sf.lcd_density", DENSITY_DEFAULT));
    }
	
	/**
     * The reference density used throughout the system.
     */
    public static final int DENSITY_DEFAULT = DENSITY_MEDIUM;
	
	/**
     * Standard quantized DPI for medium-density screens.
     */
    public static final int DENSITY_MEDIUM = 160;

 

在 Resources.java 的构造函数里面调用DisplayMetrics 的setToDefaults 方法,使density 取值为DENSITY_DEVICE / (float) DENSITY_DEFAULT;

使density 最终的值和key:qemu.sf.lcd_density 和default_value:ro.sf.lcd_density 有关系,

系统里面一般并没有额外对key:qemu.sf.lcd_density 赋值,故取值ro.sf.lcd_density,而ro.sf.lcd_density 的值一般是在系统源码里面的设置好的了,比如:system.prop 里面可以设置该值.

0
6
分享到:
评论

相关推荐

    Android dp和px/sp等单位相互转换

    在Android开发中,理解并掌握dp、px、sp等单位之间的转换是非常重要的,因为它们直接影响到界面元素在不同分辨率和像素密度设备上的显示效果。dp(density-independent pixels)是独立像素,px(pixels)是像素,sp...

    android dp和px之间转换

    ### Android DP和PX之间的转换 在Android开发过程中,经常需要处理不同屏幕尺寸和密度下的UI适配问题。其中,DP(Density-independent Pixel)和PX(Pixel)是两种常见的单位,它们之间的转换对于实现良好的跨设备...

    android Px,DP转换工具(可选择不同的dpi)

    每英寸像素数)等级,包括ldpi(低密度)、mdpi(中密度)、hdpi(高密度)、xhdpi(超高密度)、xxhdpi(双超高密度)和xxxhdpi(三超高密度),来进行像素(Px)和密度无关像素(DP)之间的转换。 1. **像素(Px...

    Android像素转换dp转px或相反

    在Android开发中,我们可以使用以下Java代码来实现dp和px的转换: ```java public class DisplayUtils { // dp转px public static float dpToPx(Context context, float dp) { return dp * context.getResources...

    android dx和dp 像素和dp之间转换的工具类

    `dx`和`dp`(Density-independent Pixels)是Android系统中处理像素单位的关键概念,它们对于创建跨设备一致的用户体验至关重要。本文将详细探讨`dx`、`dp`以及如何在像素和`dp`之间进行转换。 `dp`,全称为密度...

    Android-Android将px值转换成dp

    本篇文章将深入探讨如何将px值转换为dp值,以及在Android开发中的应用。 首先,理解px和dp的区别至关重要。px是物理像素,是屏幕上的实际点,而dp是Android系统为了提供跨不同密度设备的统一视觉体验而引入的概念。...

    Android 的px到DP的转换工具

    在android开发中布局文件要用DP进行布局,但是美工在设置的时候一般都是用PX,美工按照800*480分辨率设计完了,程序人员可以直接使用PX进行布局测试,该工具可以再程序完成时将PX直接转换为DP 方便适配

    android中px和dp,px和sp之间的转换方法

    Android 中 px 和 dp、px 和 sp 之间的转换方法 在 Android 开发中,dp 和 px、sp 和 px 之间的转换是必不可少的。下面,我们将详细介绍 Android 中 px 和 dp、px 和 sp 之间的转换方法。 一、什么是 dp 和 px? ...

    px和dp转换

    android 里面有个dp和px转换,sp字体的大小,对这些进行了详细的转换分析

    基于Android中dp和px之间进行转换的实现代码

    总的来说,理解和熟练运用dp与px之间的转换是Android开发者必备的技能之一,这有助于创建适应性强且视觉一致的用户界面。通过`DensityUtil`类这样的辅助工具,开发者可以轻松地在代码中实现这一转换过程。

    Android(dp-px)互转工具类

    这是一个很详细的转换类 可以很直观的实现 你想要的转换

    android布局单位sp,dp,pt,px的区别

    在Android开发中,为了确保应用在不同屏幕尺寸和密度下的适应性和一致性,使用了多种布局单位,其中最为常见的包括sp、dp(或dip)、pt和px。这些单位各有其特性和应用场景,理解它们之间的差异对于创建响应式和用户...

    android开发之dip,dp与px像素之间的转换工具,

    在Android开发中,理解和使用dip(设备独立像素)、dp(密度无关像素)以及px(像素)是非常重要的,因为它们关系到应用在不同分辨率屏幕上的显示效果。本篇将详细介绍这三个概念及其相互转换。 首先,像素(px)是...

    Android中dip、dp、sp、pt和px的区别

    本文将详细解析Android中常见的五种尺寸单位:dip(设备独立像素)、dp(密度无关像素)、sp(可缩放像素)、pt(点)和px(像素),并探讨它们之间的关系和应用场景。 首先,我们来了解一下px(像素)。像素是屏幕...

    引用 Android上dip、dp、px、sp等单位说明

    在Android开发中,为了确保应用在不同分辨率和屏幕尺寸上的显示效果一致,开发者需要掌握几种关键的尺寸单位,包括dip(或dp)、px、sp以及它们之间的转换关系。 #### 1. dip(dp) **dip**(device-independent ...

    Android常用共通工具类,包括dp与px转换,获取屏幕密度,获取versionName和versionCode,获取网络连接状态等等。

    Android常用共通工具类,包括dp与px转换,获取屏幕密度,获取versionName和versionCode,获取网络连接状态等等。

    dip, dp, px, sp区别 android

    在 Android 中,我们常见的单位有 dip, dp, px, sp 等,这些单位都有其特点和应用场景。 首先,我们来看一下 dip。dip 代表 device independent pixels(设备独立像素),它是一种与设备无关的单位,主要用于支持 ...

Global site tag (gtag.js) - Google Analytics