dp、px、sp转换

  1.  public class DensityUtil {
    /**
    * 将px值转换为dip或dp值,保证尺寸大小不变
    *
    * @param pxValue
    * @param scale
    * (DisplayMetrics类中属性density)
    */
    9 public static int px2dip(float pxValue, float scale) {
    10 return (int) (pxValue / scale + 0.5f);
    11 }

    /**
    * 将dip或dp值转换为px值,保证尺寸大小不变
    *
    * @param dipValue
    * @param scale
    * (DisplayMetrics类中属性density)
    */
    20 public static int dip2px(float dipValue, float scale) {
    21 return (int) (dipValue * scale + 0.5f);
    22 }

    /**
    * 将px值转换为sp值,保证文字大小不变
    *
    * @param pxValue
    * @param fontScale
    * (DisplayMetrics类中属性scaledDensity)
    */
    31 public static int px2sp(float pxValue, float fontScale) {
    32 return (int) (pxValue / fontScale + 0.5f);
    33 }

    /**
    * 将sp值转换为px值,保证文字大小不变
    *
    * @param spValue
    * @param fontScale
    * (DisplayMetrics类中属性scaledDensity)
    */
    42 public static int sp2px(float spValue, float fontScale) {
    43 return (int) (spValue * fontScale + 0.5f);
    44 }
    }

但为什么 最后都要加上0.5f 呢?

按正常的推理应该是  dip = pxValue / scale 和 px = dipValue * scale ,

实际上准确的值就应该是 咱们推理出来的,之所以后面加上0.5f是因为 咱们要的只不是那么精准,根据推理算出来的是个浮点数,而咱们程序中一般使用int类型就够了,这里涉及到一个类型转换精准度问题,熟悉Java特效的同学应该知道

float 类型的 4.1 和4.9 强转成int类型后,会失去精准度变成 int类型的4, 而如果咱们想四舍五入的话,把他们都加上0.5f,这样转换出来的结果就是:

4.4 + 0.5 = 4.9 转为int 还是4,而4.5 + 0.5 = 5.0 转换成int后就是5,正好是四舍五入,这样就保证了咱们算出来的值相对精准。

Android坐标

android中有两种坐标系,分别称之为Android坐标系和视图坐标系。而对应的也有一些相关的方法可以获取坐标系中的

坐标值。只有搞清楚这些区别,才能在实现的时候不至于出错或者得不到你想要的效果。

一、Android坐标系和视图坐标系

(1)Android坐标系

先来看一看Android坐标系是个什么样子的。贴一张图来说明,如下:

如上图所示,Android坐标系以手机屏幕左上角的顶点为坐标原点,从该点向右为x轴正方向,从该点向下为y轴正方向。而触控事件中,使用getRawX()和getRawY()方法

获取的坐标就是以这个坐标系为标准下的坐标值。

(2)视图坐标系

android中的另外一个坐标系叫做视图坐标系,它描述的是子视图在父视图中的位置。再贴一张图来说明,如下:

如上图所示,视图坐标系是以父视图的左上角为坐标原点的。相应的原点向右为x轴正方向,原点向下为y轴正方向。在触控中,通过

getX()和getY()来获取的坐标值就是视图坐标系中的坐标值。

二、获取坐标值以及相对距离的那些方法

在android中,提供了非常丰富的方法来获得坐标值和相对距离。但是在使用这些方法的时候,一定要清楚是以哪个坐标系为标准来获取的。

为了将这些方法一一说明清楚,我也准备了一张图,如下:

上面的那张图很好的说明了每个方法获得的坐标值或者距离都是从哪里到哪里的。说明一下,图中有三个黑色的框框,最外层的是手机屏幕,

中间层的是ViewGroup,最内层的是ViewGroup中放置的view。

其实上图中标注的方法可以分为两类,一类是View提供的方法,一类是MotionEvent提供的方法。分别说明如下:

View提供的获取的坐标以及距离的方法:

getTop()           获取到的是view自身的顶边到其父布局顶边的距离

getLeft()           获取到的是view自身的左边到其父布局左边的距离

getRight()        获取到的是view自身的右边到其父布局左边的距离

getBottom()     获取到的是view自身底边到其父布局顶边的距离

MotionEvent提供的方法:

getX()       获取点击事件距离控件左边的距离,即视图坐标

getY()       获取点击事件距离控件顶边的距离,即视图坐标

getRawX()  获取到的是点击事件距离整个屏幕左边的距离,即绝对坐标

getRawY()  获取到的是点击事件距离整个屏幕顶边的距离,即绝对坐标

Android dp和px之间转换 及 获取坐标的更多相关文章

  1. Android中实现滑动翻页—使用ViewFlipper(dp和px之间进行转换)

    Android中实现滑动翻页—使用ViewFlipper(dp和px之间进行转换) Android中dp和px之间进行转换 在xml布局文件中,我们既可以设置px,也可以设置dp(或者dip).一般情 ...

  2. 【转】Android中dip(dp)与px之间单位转换

    Android中dip(dp)与px之间单位转换 dp这个单位可能对web开发的人比较陌生,因为一般都是使用px(像素)但是,现在在开始android应用和游戏后,基本上都转换成用dp作用为单位了,因 ...

  3. Android笔记之dp与px之间的转换以及LayoutParams

    dp与px之间的转换公式 px = dp * (dpi / 160) dp = px / (dpi / 160) 其中dpi的获取方式如下 private void getDpi() { Displa ...

  4. android 手机屏幕有关的几个工具(屏幕宽高,dp和px互相转换)

    平时适配页面时经常会需要根据屏幕的宽高来设置控件的大小,很多时候在代码中还会需要dp和px互相转换. 今天把最常用的几个记录一下,经测试包括2.3 ~ 5.0之间的版本都可用,其他版本未测,不过应该也 ...

  5. Android系统中的dp和px的转换

    android系统中DP和SP的转化:1.首先分析TypedValue.java 可以调用以下代码获得dp的值 TypedValue.applyDimension(TypedValue.COMPLEX ...

  6. dp和px的转换

    /** * dp转px * @param context * @param dp * @return */ public static int dp2px(Context context, float ...

  7. Android中dp和px之间进行转换

    在xml布局文件中,我们既可以设置px,也可以设置dp(或者dip).一般情况下,我们都会选择使用dp,这样可以保证不同屏幕分辨率的机器上布局一致.但是在代码中,如何处理呢?很多控件的方法中都只提供了 ...

  8. Android中Tablayout设置下划线宽度 和 dp和px之间进行相互转换

    开发中遇到了一个问题,Tablayout设置下换线长度,看了点资料,分享给大家. 效果图:               直接贴代码(要在tabLayout添加完所有的tab后调用) public vo ...

  9. dp与px之间的转换

    代码如下: package com.example.fxvideo.utils; import android.content.Context; public class DensityUtils { ...

随机推荐

  1. Message,MessageQueue,Looper,Handler ——由view.post(runnable想到的)

    近日看到代码有view.post(runable),发现对handler机制又有些模糊,故做些复习. 这里就不再对具体的源码原理做深入复习了,就抄一些基本的结论吧. 1.基本概念 Message:基本 ...

  2. mysql set names.

    SET NAMES utf8 相当于 SET character_set_client = utf8 --用来设置客户端送给MySQL服务器的数据的 字符集 SET character_set_res ...

  3. java_log_01

    logback&slf4j(本文中的版本为logback1.1.7.slf4j1.7.21),参照 原作者:Ceki Gülcü.Sébastien Pennec中文版译者:陈华联系方式:cl ...

  4. KB006: CSS 框模型( Box module )

    框和布局 在 KB005: CSS 层叠 中已经介绍了 CSS 的重要之处.CSS 可以说是页面表现的基础, CSS 可以控制布局,控制元素的渲染. 布局是讲在电影画面构图中,对环境的布置.人物地位的 ...

  5. C#:装箱和拆箱相关知识整理

    1.装箱和拆箱是一个抽象的概念   2. 装箱是将值类型转换为引用类型 ;   拆箱是将引用类型转换为值类型   利用装箱和拆箱功能,可通过允许值类型的任何值与Object 类型的值相互转换,将值类型 ...

  6. WebService cxf 接口中获得拦截器参数

    1. 拦截器中put属性 Message message = PhaseInterceptorChain.getCurrentMessage(); message.put("AuthCode ...

  7. 利用路由修改thinkphp框架开发的后台地址

    一般我们写前台是home 后台是 admin那么我们的后台是 域名/admin 那我们要随时修改这个地址是非常麻烦的事情开始可能会想到,就是把模块名称改掉,或者分组(3.1版)这样的话不但要改配置,连 ...

  8. Django models通过DateTimeField保存到MySQL的时间的时区问题

    最近开始使用Django开发一些系统,在models.py中设置一些数据库表结构并给日期时间字段赋初值,不过在使用的过程中,遇到一点问题.问题是,我本来服务器使用的市区是“Asia/Shanghai” ...

  9. JS键盘的键码(event.keyCode)

    keycode 8 = BackSpace BackSpace keycode 9 = Tab Tab keycode 12 = Clear keycode 13 = Enter keycode 16 ...

  10. 周赛D题

    D - D Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u   Description ...