热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

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

在Android开发中dp和px,sp和px之间的转换时必不可少的。下面脚本之家小编给大家带来了android中px和dp,px和sp之间的转换方法,感兴趣的朋友一起看看吧

在Android开发中dp和px,sp和px之间的转换时必不可少的,网上流传的方法

public class DisplayUtils {
  /**
   * convert px to its equivalent dp
   * 将px转换为与之相等的dp
   */
  public static int px2dp(Context context, float pxValue) {
    final float scale = context.getResources().getDisplayMetrics().density;
    return (int) (pxValue / scale + 0.5f);
  }
  /**
   * convert dp to its equivalent px
   * 将dp转换为与之相等的px
   */
  public static int dp2px(Context context, float dipValue) {
    final float scale = context.getResources().getDisplayMetrics().density;
    return (int) (dipValue * scale + 0.5f);
  }
  /**
   * convert px to its equivalent sp 
   * 将px转换为sp
   */
  public static int px2sp(Context context, float pxValue) {
    final float fOntScale= context.getResources().getDisplayMetrics().scaledDensity;
    return (int) (pxValue / fontScale + 0.5f);
  }
  /**
   * convert sp to its equivalent px
   * 将sp转换为px
   */
  public static int sp2px(Context context, float spValue) {
    final float fOntScale= context.getResources().getDisplayMetrics().scaledDensity;
    return (int) (spValue * fontScale + 0.5f);
  }
}

关于转换公式中,通过类比一元一次函数,怎么看都是有问题的,这么明显的问题,为什么没人纠正,后来发现是自己并没有理解,原因是float类型在强转为int类型是,用的是去尾法,精度上有较大差异,所以通过+0.5f的方式,将去尾法转变成四舍五入法,提高精度。

调用TypedValue类实现转换

/**
* convert dp to its equivalent px
*/
protected int dp2px(int dp){
    return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp,getResources().getDisplayMetrics());
}
/**
* convert sp to its equivalent px
*/
protected int sp2px(int sp){
    return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, sp,getResources().getDisplayMetrics());
}
public class TypedValue {
  ...
  /** {@link #TYPE_DIMENSION} complex unit: Value is raw pixels. */
  public static final int COMPLEX_UNIT_PX = 0;
  /** {@link #TYPE_DIMENSION} complex unit: Value is Device Independent
   * Pixels. */
  public static final int COMPLEX_UNIT_DIP = 1;
  /** {@link #TYPE_DIMENSION} complex unit: Value is a scaled pixel. */
  public static final int COMPLEX_UNIT_SP = 2;
  /** {@link #TYPE_DIMENSION} complex unit: Value is in points. */
  public static final int COMPLEX_UNIT_PT = 3;
  /** {@link #TYPE_DIMENSION} complex unit: Value is in inches. */
  public static final int COMPLEX_UNIT_IN = 4;
  /** {@link #TYPE_DIMENSION} complex unit: Value is in millimeters. */
  public static final int COMPLEX_UNIT_MM = 5;
  /**
   * Converts an unpacked complex data value holding a dimension to its final floating 
   * point value. The two parameters unit and value
   * are as in {@link #TYPE_DIMENSION}.
   * 
   * @param unit The unit to convert from.
   * @param value The value to apply the unit to.
   * @param metrics Current display metrics to use in the conversion -- 
   *        supplies display density and scaling information.
   * 
   * @return The complex floating point value multiplied by the appropriate 
   * metrics depending on its unit. 
   */
  public static float applyDimension(int unit, float value,
                    DisplayMetrics metrics)
  {
    switch (unit) {
    case COMPLEX_UNIT_PX:
      return value;
    case COMPLEX_UNIT_DIP:
      return value * metrics.density;
    case COMPLEX_UNIT_SP:
      return value * metrics.scaledDensity;
    case COMPLEX_UNIT_PT:
      return value * metrics.xdpi * (1.0f/72);
    case COMPLEX_UNIT_IN:
      return value * metrics.xdpi;
    case COMPLEX_UNIT_MM:
      return value * metrics.xdpi * (1.0f/25.4f);
    }
    return 0;
  }
  ...
}

对比两种方式的差异,其实就在+0.5f上,去尾法和四舍五入法的区别,即精度问题。

总结

以上所述是小编给大家介绍的android中px和dp,px和sp之间的转换方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!


推荐阅读
  • ArcGIS技巧:为相邻地块创建指定宽度的隔离带
    在地理信息系统(GIS)的数据处理中,为了满足特定项目的质量检查标准,需要在相邻地块之间创建一定宽度的隔离带。本文将探讨如何使用ArcGIS工具解决这一问题,确保不同地块图斑间保持规定的最小距离。 ... [详细]
  • 深度兴趣网络在点击率预测中的应用研究
    本文探讨了一种名为深度兴趣网络(Deep Interest Network, DIN)的新方法,该方法通过捕捉用户的历史行为和当前上下文之间的交互来提高点击率预测的准确性。DIN模型不仅考虑了用户的静态偏好,还动态地调整了对不同商品的兴趣权重,从而实现了更加个性化的推荐。 ... [详细]
  • 本文探讨了Windows Presentation Foundation (WPF)如何通过扩展Microsoft Build Engine (MSBuild)来增强其构建能力,特别是在处理WPF特有的任务时。 ... [详细]
  • CGroups: 资源管理和控制
    CGroups(Control Groups)是Linux内核提供的一个功能,旨在限制、记录和隔离进程组使用的物理资源,如CPU、内存和I/O等。它通过精细的资源管理,支持现代容器技术如Docker的资源限制需求。 ... [详细]
  • 深入解析Java中的锁类型及其应用场景
    本文详细介绍了Java中常见的锁类型,包括乐观锁与悲观锁、独占锁与共享锁、互斥锁与读写锁、可重入锁、公平锁与非公平锁、分段锁、偏向锁、轻量级锁、重量级锁以及自旋锁。每种锁的特性、作用及适用场景均有所涉及。 ... [详细]
  • 本文探讨了HDU 4035的问题,涉及一个由n个房间组成的迷宫,这些房间通过n-1条隧道相互连接,形成一棵树结构。任务是从起点1号房间出发,计算到达出口所需经过的平均隧道数量,考虑了在每个房间中可能发生的三种情况及其相应概率。 ... [详细]
  • 本文介绍如何通过自定义控件LoadLayout实现ListView的上拉加载更多和下拉刷新功能。LoadLayout支持上拉加载,而下拉刷新则利用了android.support.v4.widget.SwipeRefreshLayout组件。 ... [详细]
  • 本文详细介绍了如何在Windows系统中安装并使用JEB逆向工具,包括必要的环境配置和基本操作指南。 ... [详细]
  • Android 手机安全应用首屏布局设计
    本文详细介绍了如何构建一个功能丰富的手机安全应用的首个导航界面布局。通过实例代码和效果展示,帮助开发者快速理解和实现相关功能。 ... [详细]
  • 本文介绍如何利用Python中的Epoll机制构建一个高效的Web服务器,该服务器能够处理多个并发连接,并向每个连接的客户端返回预定义的响应文本。通过使用Epoll,服务器可以实现高性能的I/O多路复用。 ... [详细]
  • 本文介绍了Android中常见的动画类型及其应用场景,通过具体的代码示例展示了如何在Activity跳转时添加平滑过渡效果,提升用户体验。 ... [详细]
  • 一、数据更新操作DML语法中主要包括两个内容:查询与更新,更新主要包括:增加数据、修改数据、删除数据。其中这些操作是离不开查询的。1、增加数据语法:INSERTINTO表名称[(字 ... [详细]
  • 本文探讨了在iOS应用中实现类似Android Snack Bar功能的方法,并特别关注如何确保Snack Bar正确显示在键盘下方。 ... [详细]
  • 本文介绍了一种解决方案,当笔记本电脑不具备作为无线接入点的能力时,如何通过开启Android手机的便携WLAN热点功能,使笔记本能够连接到手机并共享其网络资源,从而实现上网。文中详细描述了在Linux系统下配置的具体步骤。 ... [详细]
  • 本文介绍了如何通过安装 VirtualBox 和 Vagrant 来快速搭建和管理虚拟机环境。我们将详细探讨如何选择合适的 Box 镜像,以及如何高效地下载、添加和管理这些镜像。 ... [详细]
author-avatar
大学城贝岗彩虹屋屋公寓
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有