2016-06-06 14:53:59 qq_16628781 阅读数 2571

知识点:

1、android的dp和px之间的转换;


android是一个开源平台,android安装的硬件厂商也是多不胜数,导致了市场上有着各种各样分辨率的手机,对于这些不同分辨率的手机,我们就必须要有一个统一的方式来适配我们应用的布局和字体大小。如果不这样做的话,那么布局在不同手机上,就乱了套了。

下面是我自己收集实验,使用的一套关于dp和px之间转换的代码。在有需要时,我们可以拿它来作为一个工具类。很实用。

关于dp和px的差别,不是我这里讨论的问题,有兴趣了解的同学可以往上搜一下。


/**
 * Created by kuyu.yaojt on 16/6/6.
 */

public class ScreenUtil {
    /**
     * 根据手机的分辨率从 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);
    }
}

如有任何问题,请及时与我联系,谢谢。

2015-03-11 10:03:29 chadeltu 阅读数 1142

android布局常用单位有dip、dp、sp、px。

dip/dp

    表示密度无关像素(density-independent pixel),是基于屏幕物理密度的抽象单元。dp是相对一个160dpi密度的屏幕来讲的,所以在160dpi密度的屏幕里1个dp表示一个像素。屏幕密度高单位dp对应像素值高,屏幕密度低单位dp对应像素值低。也就是说不同密度的屏幕,单位dp对应的像素值也不一样。但记住一点就行,无论哪种密度,1个dp在屏幕上总是表示1/160英寸,从而保证不同屏幕上dp总能表示相同的尺寸。

    使用场景:除字体以外任何场景

sp

    表示缩放无关像素(scale-independent pixel),也是一种密度无关像素,只是会受到用户所设定的字体偏好影响,跟随字体大小缩放。

    使用场景:只在字体大小

px

    表示像素(pixel),屏幕实际像素。

    使用场景:尽量不用,但在准确需要多少像素的场景可以使用,比如:列表分割线高度


下面2张图片可以帮助大家更好的了解上述布局单位


图1


图2

2012-07-26 15:54:43 laojing123 阅读数 4318

           机器升级为android 4.1,10寸的平板跟以前的布局没有什么两样,但是7寸的就出了点问题。

           谷歌Nexus 7也是7寸,默认使用的layout跟手机有些相似,但不全是手机布局。Nexus 7是1280 x 800,DPI 为213,这样经过计算,宽度换算为DP就是

800 * 160 / 213 = 600; 4.1中对于600 ~ 719 dp的分辨率使用一种新的布局,姑且叫做Phone Tablet吧。我们的平板是1024 x 600分辨率。DPI 和DP 都是600,但是

这样设置之后,看不到导航键。

           看了网上关于谷歌Nexus 7使用平板布局的方法,就是去修改ro.sf.lcd_density这个属性,知道修改后变为720DP 以上,这样的话,我们的7寸平板要修改为小于 133,因为只有这样600 * 160 / 133 = 721;才会使用720DP的布局。但是这样修改之后,感觉界面怪怪的,图标和字体都很小。因为这样修改后,实际上在逻辑上,屏幕尺寸是变大了(变为 7 *160/133) 。

           4.1的代码中确实对于600DP~ 719DP之间做了特殊的修改,这部分改动太大,想直接revert不太现实,有太多的冲突。所以需要找到一个全局的,能强制使用720DP布局的地方,关键就在如何找到使用哪一种布局资源作为当前系统的布局。

          

              查了点资料,找到Android系统中选择使用哪一种布局的文件

在frameworks/base目录下的libs/androidfw/ResourceTypes.cpp 

bool ResTable_config::match(const ResTable_config& settings) 

在该函数中,是选择布局的关键。这个函数把不合是的布局过滤掉,剩下的布局中,最大的那个就认为是最合适的。

比如 480DP, 600DP, 720DP,把720DP过滤掉了,剩下的就选600DP作为当前最好的布局。    

           只需修改如下几行

 
+       int WidthDp = settings.smallestScreenWidthDp;
+       if (WidthDp < 720 && 599 < WidthDp) WidthDp = 720;
         if (smallestScreenWidthDp != 0
-                && smallestScreenWidthDp > settings.smallestScreenWidthDp) {
+                && smallestScreenWidthDp > WidthDp) {
             return false;
         }

即可强制使用720DP 的布局。

其中smallestScreenWidthDp是在循环中赋值的,有几个layout 资源文件,就有几次循环

settings.smallScreenWidthDp是当前系统的屏幕宽度方向的像素无关分辨率,这里是600. 原来 的程序是 720 > 600.所以被过滤掉,而600 > 600为假,所以被保留下来。

           这样改过之后,还需要修改另外一个地方,否则还是没有Navigation Bar.

同样是frameworks/base目录下

policy/src/com/android/internal/policy/impl/PhoneWindowManager.java

--- a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
+++ b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
@@ -1183,7 +1183,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
             // 0-599dp: "phone" UI with a separate status & navigation bar
             mHasSystemNavBar = false;
             mNavigationBarCanMove = true;
-        } else if (shortSizeDp < 720) {
+        } else if (false && shortSizeDp < 720) {
             // 600-719dp: "phone" UI with modifications for larger screens
             mHasSystemNavBar = false;
             mNavigationBarCanMove = false;

这样就把整个系统中对600 ~719DP的处理给绕过去了。

2015-08-20 09:00:15 ten11 阅读数 2142
如标题所说,尽量使用android:layout_marginLeft="10dp",虽然android:paddingLeft="10dp"是内间距,其实也可以使用控件间距实现一样效果,而且目前
RelativeLayout
使用内间距android:paddingLeft="10dp",魅族一台,vivo一台,都发现无效,只是局部布局无效,简单页面而已,效果图看到能有效果,真机不行,需注意
2013-12-28 22:59:31 u012782626 阅读数 651

在android开发中,我们常常在activity中初始化某个组件的高宽度属性。在android中默认单位为px,我们常常用dp作为单位布局,其转化过程很简单。

px转化dp方法代码:

public static int pxTodip(Context context, float pxValue) {  
        final float scale = context.getResources().getDisplayMetrics().density;  
        return (int) (pxValue / scale + 0.5f);  
    }


Android dp和px的转换

阅读数 274

没有更多推荐了,返回首页