`
CshBBrain
  • 浏览: 654747 次
  • 性别: Icon_minigender_1
  • 来自: 成都
博客专栏
B7d9bf34-126e-301f-819e-81f2615b5a2a
开源WebSocket服务...
浏览量:145922
Group-logo
HTML5移动开发
浏览量:138771
社区版块
存档分类
最新评论

Android中dip, dp, px, sp之间的区别

 
阅读更多

(文章来自网络) 

Android中dip, dp, px, sp之间的区别:

dip: device independent pixels(设备独立像素). 不同设备有不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGA、HVGA和QVGA 推荐使用这个,不依赖像素。
px: pixels(像素). 不同设备显示效果相同,一般我们HVGA代表320x480像素,这个用的比较多。
pt: point,是一个标准的长度单位,1pt=1/72英寸,用于印刷业,非常简单易用;
sp: scaled pixels(放大像素). 主要用于字体显示best for textsize,根据 google 的建议,TextView 的字号最好使用 sp 做单位,

过去,程序员通常以像素为单位设计计算机用户界面。例如,定义一个宽度为300像素的表单字段,列之间的间距为5个像素,图标大小为16×16像素 等。这样处理的问题在于,如果在一个每英寸点数(dpi)更高的新显示器上运行该程序,则用户界面会显得很小。在有些情况下,用户界面可能会小到难以看清 内容。
与分辨率无关的度量单位可以解决这一问题,Android支持下列所有单位:
px(像素):屏幕上的点。
in(英 寸):长度单位。
mm(毫米):长度单位。
pt(磅):1/72英寸。
dp(与密度无关的像素):一种基于屏幕密度的抽象 单位。在每英寸160点的显示器上,1dp = 1px。
dip:与dp相同,多用于android/ophone示例中。
sp(与 刻度无关的像素):与dp类似,但是可以根据用户的字体大小首选项进行缩放。

我来补充两句:说说dp和sp,dp也就是dip。这个和sp基本类似。如果设置表示长度、高度等属性时可以使用dp或sp。但如果设置字体,需要使用 sp。dp是与密度无关,sp除了与密度无关外,还与scale无关。如果屏幕密度为160,这时dp和sp和px是一样的。1dp=1sp=1px,但 如果使用px作单位,如果屏幕大小不变(假设还是3.2寸),而屏幕密度变成了320。那么原来TextView的宽度设成160px,在密度为320的 3.2寸屏幕里看要比在密度为160的3.2寸屏幕上看短了一半。但如果设置成160dp或160sp的话。系统会自动将width属性值设置成 320px的。也就是160 * 320 / 160。其中320 / 160可称为密度比例因子。也就是说,如果使用dp和sp,系统会根据屏幕密度的变化自动进行转换。

Android下获取字体宽度的方法

第1种方法:

Rect rect=newRect();
paint.getTextBounds("abcd",0,1, rect);
Log.v("a:","height:"+rect.height()+"width:"+rect.width());

第2种方法:
//字符宽度获取方法:
intwidth=(int)paint.measureText("a",0,1);
Log.v("width:","width:"+width);

Android获取屏幕宽高的两种方法

Display display = getWindowManager().getDefaultDisplay();
Log.i("view" , "height:" +display.getHeight());
Log.i("view" , "width:" +display.getWidth());

DisplayMetrics displayMetrics = getResources().getDisplayMetrics();
Log.i("view" , "height" +displayMetrics.heightPixels);
Log.i("view" , "width" +displayMetrics.widthPixels);



Android可设置为随着窗口大小调整缩放比例,但即便如此,手机程序设计人员还是必须知道手机屏幕的边界,以避免缩放造成的布局变形问题。

手机的分辨率信息是手机的一项重要信息,很好的是,Android已经提供DisplayMetircs类可以很方便的获取分辨率。下面简要介绍DisplayMetics类:

Andorid.util包下的DisplayMetrics类提供了一种关于显示的通用信息,如显示大小,分辨率和字体。

为了获取DisplayMetrics成员,首先初始化一个对象如下:

DisplayMetrics metrics=new DisplayMetrics();

getWindowManager().getDefaultDisplay().getMetrics;

注:构造函数DisplayMetrics不需要传递任何参数;调用getWindowManager()之后,会取得现有Activity的Handle,此时,getDefaultDisplay()方法将取得的宽高维度存放于DisplayMetrics对象中,而取得的宽高维度是以像素为单位(Pixel),“像素”所指的是“绝对像素”而非“相对像素”。

Android获取字体高度和设置行高

文章分类:移动开发  网络中好多资料介绍获取字体高度的方法如下:

Java 代码

  1. publicintgetFontHeight(floatfontSize)
  2. {
  3. Paint paint =newPaint();
  4. paint.setTextSize(fontSize);
  5. FontMetrics fm = paint.getFontMetrics();
  6. return(int) Math.ceil(fm.descent - fm.top) +2;
  7. }

public int getFontHeight(float fontSize) { Paint paint = new Paint(); paint.setTextSize(fontSize); FontMetrics fm = paint.getFontMetrics(); return (int) Math.ceil(fm.descent - fm.top) + 2; }



个人更倾向于以下方式获取字体实际高度:

Java 代码

  1. Math.ceil(fm.descent - fm.ascent)

Math.ceil(fm.descent - fm.ascent)



通过实际的截图对文字高度的确定,后者更准确一些。

有了字体高度信息,就可以添加行与行之间的空隙,调整行高。
个人实现方式如下:

Java 代码

  1. paint.setTextSize(fFontWidth);
  2. FontMetrics fm = paint.getFontMetrics();
  3. fFontHeight = (float)Math.ceil(fm.descent - fm.ascent);
  4. if(fFontHeight > fLineHeight)
  5. {
  6. fMulValue = fLineHeight / fFontHeight;
  7. fAddValue = -1;
  8. }
  9. else
  10. {
  11. fMulValue =1;
  12. fAddValue = fLineHeight - fFontHeight;
  13. }
  14. textViewLeft.setTextSize(fFontWidth);
  15. textViewLeft.setLineSpacing(fAddValue, fMulValue);

paint.setTextSize(fFontWidth); FontMetrics fm = paint.getFontMetrics(); fFontHeight = (float)Math.ceil(fm.descent - fm.ascent); if(fFontHeight > fLineHeight) { fMulValue = fLineHeight / fFontHeight; fAddValue = -1; } else { fMulValue = 1; fAddValue = fLineHeight - fFontHeight; } textViewLeft.setTextSize(fFontWidth); textViewLeft.setLineSpacing(fAddValue, fMulValue);



实践验证这种方式对多种分辨率的屏幕的适应性较强。
以上是个人在实际的功能实现过程中的总结,水平较浅,若看官有不同的看法或者见解,望不惜赐教!

Canvas 作为绘制文本时,使用FontMetrics对象,计算位置的坐标。

它的思路和java.awt.FontMetrics的基本相同。

FontMetrics对象

它以四个基本坐标为基准,分别为:

・FontMetrics.top
・FontMetrics.ascent
・FontMetrics.descent
・FontMetrics.bottom

Java代码

  1. Paint textPaint =newPaint( Paint.ANTI_ALIAS_FLAG);
  2. textPaint.setTextSize(35);
  3. textPaint.setColor( Color.WHITE);
  4. // FontMetrics对象
  5. FontMetrics fontMetrics = textPaint.getFontMetrics();
  6. String text ="abcdefghijklmnopqrstu";
  7. // 计算每一个坐标
  8. floatbaseX =0;
  9. floatbaseY =100;
  10. floattopY = baseY + fontMetrics.top;
  11. floatascentY = baseY + fontMetrics.ascent;
  12. floatdescentY = baseY + fontMetrics.descent;
  13. floatbottomY = baseY + fontMetrics.bottom;
  14. // 绘制文本
  15. canvas.drawText( text, baseX, baseY, textPaint);
  16. // BaseLine描画
  17. Paint baseLinePaint =newPaint( Paint.ANTI_ALIAS_FLAG);>
  18. baseLinePaint.setColor( Color.RED);
  19. canvas.drawLine(0, baseY, getWidth(), baseY, baseLinePaint);
  20. // Base描画
  21. canvas.drawCircle( baseX, baseY,5, baseLinePaint);
  22. // TopLine描画
  23. Paint topLinePaint =newPaint( Paint.ANTI_ALIAS_FLAG);
  24. topLinePaint.setColor( Color.LTGRAY);
  25. canvas.drawLine(0, topY, getWidth(), topY, topLinePaint);
  26. // AscentLine描画
  27. Paint ascentLinePaint =newPaint( Paint.ANTI_ALIAS_FLAG);
  28. ascentLinePaint.setColor( Color.GREEN);
  29. canvas.drawLine(0, ascentY, getWidth(), ascentY, ascentLinePaint);
  30. // DescentLine描画
  31. Paint descentLinePaint =newPaint( Paint.ANTI_ALIAS_FLAG);
  32. descentLinePaint.setColor( Color.YELLOW);
  33. canvas.drawLine(0, descentY, getWidth(), descentY, descentLinePaint);
  34. // ButtomLine描画
  35. Paint bottomLinePaint =newPaint( Paint.ANTI_ALIAS_FLAG);
  36. bottomLinePaint.setColor( Color.MAGENTA);
  37. canvas.drawLine(0, bottomY, getWidth(), bottomY, bottomLinePaint);

Paint textPaint = new Paint( Paint.ANTI_ALIAS_FLAG); textPaint.setTextSize( 35); textPaint.setColor( Color.WHITE); // FontMetrics对象 FontMetrics fontMetrics = textPaint.getFontMetrics(); String text = "abcdefghijklmnopqrstu"; // 计算每一个坐标 float baseX = 0; float baseY = 100; float topY = baseY + fontMetrics.top; float ascentY = baseY + fontMetrics.ascent; float descentY = baseY + fontMetrics.descent; float bottomY = baseY + fontMetrics.bottom; // 绘制文本 canvas.drawText( text, baseX, baseY, textPaint); // BaseLine描画 Paint baseLinePaint = new Paint( Paint.ANTI_ALIAS_FLAG);> baseLinePaint.setColor( Color.RED); canvas.drawLine(0, baseY, getWidth(), baseY, baseLinePaint); // Base描画 canvas.drawCircle( baseX, baseY, 5, baseLinePaint); // TopLine描画 Paint topLinePaint = new Paint( Paint.ANTI_ALIAS_FLAG); topLinePaint.setColor( Color.LTGRAY); canvas.drawLine(0, topY, getWidth(), topY, topLinePaint); // AscentLine描画 Paint ascentLinePaint = new Paint( Paint.ANTI_ALIAS_FLAG); ascentLinePaint.setColor( Color.GREEN); canvas.drawLine(0, ascentY, getWidth(), ascentY, ascentLinePaint); // DescentLine描画 Paint descentLinePaint = new Paint( Paint.ANTI_ALIAS_FLAG); descentLinePaint.setColor( Color.YELLOW); canvas.drawLine(0, descentY, getWidth(), descentY, descentLinePaint); // ButtomLine描画 Paint bottomLinePaint = new Paint( Paint.ANTI_ALIAS_FLAG); bottomLinePaint.setColor( Color.MAGENTA); canvas.drawLine(0, bottomY, getWidth(), bottomY, bottomLinePaint); 

分享到:
评论

相关推荐

    dip, dp, px, sp区别 android

    "Android 中的 dip, dp, px, sp 单位区别" Android 中的单位系统是一个复杂的问题,对于开发人员来说,选择正确的单位是非常重要的。在 Android 中,我们常见的单位有 dip, dp, px, sp 等,这些单位都有其特点和...

    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中显示单位px和dip以及sp的区别.doc

    Android 中显示单位 px 和 dip 以及 sp 的区别 Android 中显示单位 px、dip、sp 等的区别是 Android 开发中一个非常重要的概念。了解这些单位的区别可以帮助开发者更好地设计和开发 Android 应用程序。 首先,px ...

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

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

    Android像素转换dp转px或相反

    理解Android中的像素和dp转换是开发跨设备兼容应用的关键。通过使用dp单位和适当的转换函数,我们可以确保用户在不同屏幕尺寸和密度的设备上都能获得良好的视觉体验。同时,Android还提供了sp(scaled pixel)单位,...

    比较android px sp dip单位

    总结来说,Android中的px、dp和sp单位各有其特点和用途。px用于精确的像素操作,dp保证了不同密度设备上元素的相对大小,sp则保证了文本的可读性。理解和灵活运用这些单位是Android开发者必备的技能之一。

    Adnroid 中dip、dp、px、sp等单位说明

    让我们深入探讨一下Android中的dip、dp、px、sp等单位。 1. dip (device independent pixels) - 设备独立像素: 这是一种基于设备的物理特性(如屏幕密度)的抽象单位,旨在确保UI元素在不同分辨率的屏幕上看起来...

    dimens资源文件实现px值与dp值、sp值之间的转化

    本主题将深入探讨如何利用`dimens`资源文件实现像素(px)、密度独立像素(dp)和可缩放像素(sp)之间的转换,以及它在UI适配中的重要作用。 首先,我们需要理解Android屏幕的密度概念。Android设备有多种不同的...

    Android的计量单位px,in,mm,pt,dp,dip,sp

    在Android中,pt主要用于文本大小的设置,但不如sp常用。 5. **dp(设备独立像素)**:dp,全称为device-independent pixels,是一种基于设备密度的抽象单位。在160dpi(dots per inch,每英寸点数)的标准屏幕密度...

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

    本文主要解析Android中的五个关键单位:dip、dp、sp、pt和px,以及它们之间的区别。 1. **dip(设备独立像素)**: 设备独立像素是一种与设备硬件无关的单位,它的大小会根据设备的物理密度进行调整,确保在不同...

    Androd px转dip和sp

    `px`(像素)是设备独立像素,而`dip`(设备独立像素,也称为dp)和`sp`(可缩放像素,主要用于字体大小)是Android系统为了适应不同分辨率屏幕而引入的概念。这些单位有助于创建适应多种屏幕尺寸的应用。 `px`...

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

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

    解析android中的dip,dp,px,sp和屏幕密度

    本文将深入解析Android中的dip, dp, px, sp这四个关键概念,以及它们与屏幕密度的关系。 1. dip(设备独立像素) dip,全称device independent pixels,是Android中用来实现跨设备一致性显示的单位。它不受物理像素...

    Android dip,px,pt,sp 的区别详解

    以下是关于Android中dip, px, pt, sp的区别详解: 1. dip(设备独立像素,Device Independent Pixels):dip是一种抽象单位,旨在确保在不同密度的屏幕上元素看起来具有相同的大小。它不直接对应于物理像素,而是...

    简单谈谈Android中SP与DP的区别

    一、dp(或者dip device independent pixels) 一种基于屏幕密度的抽象单位。在每英寸160点的显示器上,1dp=1px。不同设备有不同的显示效果,这个和设备硬件有关。 二、sp(Scaled Pixels) 主要用于字体显示,与...

    Android中的常用尺寸单位(dp、sp)快速入门教程

    Android开发中的常用尺寸单位有如下几种: dp (dip) px pt inch sp 算不知道确切含义,相信对于以上这几种尺寸单位大家也都比较脸熟,这里先让我们重新认识一下它们: dp (dip): 即设备无关像素(device ...

Global site tag (gtag.js) - Google Analytics