`
蓝月儿
  • 浏览: 49828 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

android数据单位dp,px和sp

 
阅读更多

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 代码publicintgetFontHeight(floatfontSize)
{
Paint paint =newPaint();
paint.setTextSize(fontSize);
FontMetrics fm = paint.getFontMetrics();
return(int) Math.ceil(fm.descent - fm.top) +2;
}
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 代码Math.ceil(fm.descent - fm.ascent)
Math.ceil(fm.descent - fm.ascent)


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

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

Java 代码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);
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代码Paint textPaint =newPaint( Paint.ANTI_ALIAS_FLAG);
textPaint.setTextSize(35);
textPaint.setColor( Color.WHITE);

// FontMetrics对象
FontMetrics fontMetrics = textPaint.getFontMetrics();

String text ="abcdefghijklmnopqrstu";

// 计算每一个坐标
floatbaseX =0;
floatbaseY =100;
floattopY = baseY + fontMetrics.top;
floatascentY = baseY + fontMetrics.ascent;
floatdescentY = baseY + fontMetrics.descent;
floatbottomY = baseY + fontMetrics.bottom;

// 绘制文本
canvas.drawText( text, baseX, baseY, textPaint);

// BaseLine描画
Paint baseLinePaint =newPaint( 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 =newPaint( Paint.ANTI_ALIAS_FLAG);
topLinePaint.setColor( Color.LTGRAY);
canvas.drawLine(0, topY, getWidth(), topY, topLinePaint);

// AscentLine描画
Paint ascentLinePaint =newPaint( Paint.ANTI_ALIAS_FLAG);
ascentLinePaint.setColor( Color.GREEN);
canvas.drawLine(0, ascentY, getWidth(), ascentY, ascentLinePaint);

// DescentLine描画
Paint descentLinePaint =newPaint( Paint.ANTI_ALIAS_FLAG);
descentLinePaint.setColor( Color.YELLOW);
canvas.drawLine(0, descentY, getWidth(), descentY, descentLinePaint);

// ButtomLine描画
Paint bottomLinePaint =newPaint( Paint.ANTI_ALIAS_FLAG);
bottomLinePaint.setColor( Color.MAGENTA);
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); 

以上摘自[url]
http://hi.baidu.com/wzc520168/item/bacd8fff8131f37c3d198b22
[/url]

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);
    }  
分享到:
评论

相关推荐

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

    在Android开发中,理解并掌握dp、px、sp等单位之间的转换是非常重要的,因为它们直接影响到界面元素在...在设计和编码过程中,要充分利用这些单位和Android提供的工具,确保应用在各种屏幕尺寸和密度上都有良好的表现。

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

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

    dip, dp, px, sp区别 android

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

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

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

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

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

    Android像素转换dp转px或相反

    通过使用dp单位和适当的转换函数,我们可以确保用户在不同屏幕尺寸和密度的设备上都能获得良好的视觉体验。同时,Android还提供了sp(scaled pixel)单位,用于处理字体大小,它会根据用户的字体缩放设置自动调整...

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

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

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

    在处理不同屏幕密度时,Android系统会根据设备的density值来调整dp和sp单位。例如,对于一个480dip*800dip的WVGA屏幕(density=240),在120dpi的屏幕上,实际分辨率为240px*400px,而在240dpi的屏幕上,实际分辨率...

    Android中显示单位px和dip以及sp的区别.doc

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

    015集-dp、px和sp

    在Android开发中,屏幕适配是一项重要的任务,而dp、px和sp是理解这一过程的关键概念。本视频教程“015集-dp、px和sp”针对初学者,旨在帮助他们深入理解这些单位以及如何在实践中应用它们。 首先,我们要明白像素...

    Android中的长度单位详解(dp、sp、px、in、pt、mm).pdf

    然而,如果我们想要设置按钮内的文字大小,那么最好使用sp单位。这样即使用户的字体缩放设置发生了变化,文本的大小也会相应调整,确保在任何设备上都能保持良好的阅读体验。 ### 总结 了解并正确使用这些长度单位...

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

    每种密度都有一个相应的像素密度比,用来将像素值转换为相对独立于设备密度的dp或sp单位。 1. **像素(px)**:像素是屏幕上的物理点,其数量直接影响到屏幕的清晰度。像素值直接对应屏幕上的实际点,但在不同密度...

    比较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元素在不同分辨率的屏幕上看起来...

    px和dp转换

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

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

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

    Androd px转dip和sp

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

Global site tag (gtag.js) - Google Analytics