(文章来自网络)

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);

更多相关文章

  1. Android(安卓)获取屏幕尺寸与密度
  2. android studio 如何修改app名字、修改app图标
  3. Android(安卓)系统字体规范与应用探索
  4. 关于android分辨率和使用iphone版切图
  5. android 布局 px or dip
  6. Android有用代码(二)
  7. Android有用代码片段2
  8. android之屏幕适配之一理论知识
  9. 安卓APP开发中的屏幕适配问题如何解决?

随机推荐

  1. Android camera系统开发之IPC (一)
  2. Android(安卓)SD卡 路径问题
  3. [置顶] Android捕获Back键事件
  4. Android中Styles、Themes、attrs介绍和他
  5. 安卓学习必备开发板-Rayeager PX2
  6. 解决eclipse中android添加重载函数时参数
  7. 一位一年android开发者的瓶颈
  8. Android 四大组件之Activity
  9. android 调试
  10. 招聘正在进行时,315晚会使用的高科技产品,