`

Android的绘制文本对象FontMetrics的介绍及绘制文本

阅读更多
一。Android绘制文本对象FontMetrics介绍

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

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



   实例JAVA代码如下:
   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.TextUtil 類



package com.wistron.test.DrawText;

import java.util.Vector;

import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.FontMetrics;
import android.view.KeyEvent;

public class TextUtil {
 private int mTextPosx = 0;// x坐标
 private int mTextPosy = 0;// y坐标
 private int mTextWidth = 0;// 绘制宽度
 private int mTextHeight = 0;// 绘制高度
 private int mFontHeight = 0;// 绘制字体高度
 private int mPageLineNum = 0;// 每一页显示的行数
 private int mCanvasBGColor = 0;// 背景颜色
 private int mFontColor = 0;// 字体颜色
 private int mAlpha = 0;// Alpha值
 private int mRealLine = 0;// 字符串真实的行数
 private int mCurrentLine = 0;// 当前行
 private int mTextSize = 0;// 字体大小
 private String mStrText = "";
 private Vector mString = null;
 private Paint mPaint = null;

 public TextUtil(String StrText, int x, int y, int w, int h, int bgcolor,
   int textcolor, int alpha, int textsize) {
  mPaint = new Paint();
  mString = new Vector();
  this.mStrText = StrText;
  this.mTextPosx = x;
  this.mTextPosy = y;
  this.mTextWidth = w;
  this.mTextHeight = h;
  this.mCanvasBGColor = bgcolor;
  this.mFontColor = textcolor;
  this.mAlpha = alpha;
  this.mTextSize = textsize;
 }

 public void InitText() {
  mString.clear();// 清空Vector
  // 对画笔属性的设置
  // mPaint.setARGB(this.mAlpha, Color.red(this.mFontColor), Color
  // .green(this.mFontColor), Color.blue(this.mFontColor));
  mPaint.setTextSize(this.mTextSize);
  mPaint.setColor(Color.BLUE);
  this.GetTextIfon();
 }

 /**
  * 得到字符串信息包括行数,页数等信息
  */
 public void GetTextIfon() {
  char ch;
  int w = 0;
  int istart = 0;
  FontMetrics fm = mPaint.getFontMetrics();// 得到系统默认字体属性
  mFontHeight = (int) (Math.ceil(fm.descent - fm.top) + 2);// 获得字体高度
  mPageLineNum = mTextHeight / mFontHeight;// 获得行数
  int count = this.mStrText.length();
  for (int i = 0; i < count; i++) {
   ch = this.mStrText.charAt(i);
   float[] widths = new float[1];
   String str = String.valueOf(ch);
   mPaint.getTextWidths(str, widths);
   if (ch == '\n') {
    mRealLine++;// 真实的行数加一
    mString.addElement(this.mStrText.substring(istart, i));
    istart = i + 1;
    w = 0;
   } else {
    w += (int) Math.ceil(widths[0]);
    if (w > this.mTextWidth) {
     mRealLine++;// 真实的行数加一
     mString.addElement(this.mStrText.substring(istart, i));
     istart = i;
     i--;
     w = 0;
    } else {
     if (i == count - 1) {
      mRealLine++;// 真实的行数加一
      mString.addElement(this.mStrText.substring(istart,
        count));
     }
    }
   }
  }
 }

 /**
  * 绘制字符串
  * 
  * @param canvas
  */
 public void DrawText(Canvas canvas) {
  for (int i = this.mCurrentLine, j = 0; i < this.mRealLine; i++, j++) {
   if (j > this.mPageLineNum) {
    break;
   }
   canvas.drawText((String) (mString.elementAt(i)), this.mTextPosx,
     this.mTextPosy + this.mFontHeight * j, mPaint);
  }
 }

 /**
  * 翻页等按键处理
  * 
  * @param keyCode
  * @param event
  * @return
  */
 public boolean KeyDown(int keyCode, KeyEvent event) {
  if (keyCode == KeyEvent.KEYCODE_DPAD_UP) {
   if (this.mCurrentLine > 0) {
    this.mCurrentLine--;
   }
  } else if (keyCode == KeyEvent.KEYCODE_DPAD_DOWN) {
   if ((this.mCurrentLine + this.mPageLineNum) < (this.mRealLine - 1)) {
    this.mCurrentLine++;
   }
  }
  return false;
 }

}



2. MyView 類

package com.wistron.test.DrawText;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.KeyEvent;
import android.view.View;

public class MyView extends View implements Runnable {
 private final Paint mPaint;
 private int mICount = 0;
 private final TextUtil mTextUtil;

 public MyView(Context context) {
  super(context);
  mPaint = new Paint();
  String string = "测试自动换行(第1行)\n\n测试自动换行(第2行)\n测试自动换行(第3行)\n测试自动换行(第4行)\n测试自动换行(第5行)\n测试自动换行(第6行)\n测试自动换行(第7行)"
    + "生活教會了我們什麼,自己的感覺現在已經徹底的隕滅,生命中彷彿是蒸發了為自己幸福而爭的念頭,一切就這樣的循規蹈矩!";
  mTextUtil = new TextUtil(string, 15, 150, 300, 80, Color.LTGRAY,
    0xff00ff, 255, 16);
  mTextUtil.InitText();
  new Thread(this).start();
 }

 @Override
 protected void onDraw(Canvas canvas) {
  super.onDraw(canvas);
  canvas.drawColor(Color.LTGRAY);
  mPaint.setAntiAlias(true);
  if (mICount < 100) {
   mICount++;
  }
  mPaint.setColor(Color.RED);
  canvas.drawText("裝載進度:" + mICount + "%......", 10, 20, mPaint);
  mTextUtil.DrawText(canvas);
 }

 @Override
 public void run() {
  Thread.currentThread();
  while (!Thread.interrupted()) {
   try {
    Thread.sleep(10);
   } catch (Exception ex) {
    ex.printStackTrace();
    Thread.currentThread().interrupt();
   }
   this.postInvalidate();
  }
 }

 @Override
 public boolean onKeyDown(int keyCode, KeyEvent event) {

  return mTextUtil.KeyDown(keyCode, event);
 }

}



3. DrawText  Activity.

package com.wistron.test.DrawText;

import android.app.Activity;
import android.os.Bundle;
import android.view.KeyEvent;

public class DrawText extends Activity {
    /** Called when the activity is first created. */
 private MyView mv;

 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  mv = new MyView(this);
  setContentView(mv);
 }

 @Override
 public boolean onKeyDown(int keyCode, KeyEvent event) {
  mv.onKeyDown(keyCode, event);
  return super.onKeyDown(keyCode, event);
 }

}
  • 大小: 5.2 KB
分享到:
评论

相关推荐

    Android编程之绘制文本(FontMetrics)实现方法

    本文实例讲述了Android编程之绘制文本(FontMetrics)实现方法。分享给大家供大家参考,具体如下: Canvas 作为绘制文本时,使用FontMetrics对象,计算位置的坐标。 它的思路和java.awt.FontMetrics的基本相同。 ...

    Android FontMetrics测试

    4. **绘制文本**: 在自定义View的`onDraw()`方法中,使用`Canvas.drawText()`函数绘制文本,同时应用之前计算的位置信息。 5. **验证效果**: 运行应用程序并查看文本的显示效果,确保文本在View中的布局正确无误。 6...

    Android代码-FontMetrics Viewer

    `FontMetrics Viewer`是一个实用工具,它可以帮助开发者深入了解Android字体的尺寸和特性,以便更好地控制文本的显示效果。本项目主要涉及以下几个Android代码相关的知识点: 1. **自定义View**: `FontMetrics ...

    Android 自定义View绘制居中文本

    3. **绘制文本**:在`onDraw()`方法中,使用`canvas.drawText()`方法来绘制文本。传入计算好的坐标和要显示的文本,即可实现居中效果。 ```java @Override protected void onDraw(Canvas canvas) { super.onDraw...

    Android使用FontMetrics对象计算位置坐标

    在Android开发中,当涉及到在Canvas上绘制文本时,精确地定位文本的位置是至关重要的。`FontMetrics`对象就是这样一个工具,它提供了有关字体在特定大小下各部分位置的信息,帮助开发者准确计算文本的坐标。本文将...

    Android字体宽高的获取

    在Android开发中,有时我们需要对字体的宽高进行精确的控制,例如在自定义View或者绘制文本时。本文将详细讲解如何在Android中获取字体的宽度和高度。 首先,我们来理解一下Android中的字体概念。在Android系统中,...

    Android中FontMetrics的几个属性全面讲解

    在Android开发中,当涉及到文字绘制时,了解`FontMetrics`是非常重要的。`FontMetrics`对象提供了关于字体在屏幕上如何布局的关键信息。本文将详细解析`FontMetrics`的几个核心属性,帮助开发者更好地理解和运用它们...

    Android精确测量文本宽高及基线位置的方法

    首先,我们要了解Android中用于绘制文本的基本组件:Canvas、Paint以及它们如何相互作用。Canvas提供了在屏幕上绘制图形和文本的接口,而Paint则是定义这些元素样式的关键,包括字体大小、颜色、样式等。 1. **测量...

    Android文字基线Baseline算法的使用讲解

    在Android开发中,当涉及到自定义视图或者图形绘制时,文字的精准定位变得尤为重要。本文主要探讨的是Android中的文字基线(Baseline)算法及其在实际应用中的使用方法。 首先,Baseline是绘制文字时的一个关键概念...

    android canvas drawText()文字居中效果

    `drawText()`方法是Canvas的一个关键函数,用于在指定位置绘制文本。本篇文章将深入探讨如何利用`drawText()`实现文字居中效果。 首先,`drawText(String text, float x, float y, Paint paint)`方法的参数含义如下...

    android自定义View实现跑马灯效果

    自定义View的核心是重写`onDraw()`方法,其中使用`Canvas`对象的`drawText()`方法绘制文本。同时,借助Handler来定时刷新界面,改变文字绘制的X轴位置,从而模拟出滚动效果。 以下是实现跑马灯效果的关键步骤: 1....

    Android自定义漂亮的圆形进度条

    本文将详细介绍如何在Android中自定义一个漂亮的圆形进度条,这个自定义组件名为TasksCompletedView。通过以下步骤,我们可以创建一个带有圆心进度显示的圆形进度条。 首先,我们需要创建一个新的Java类...

    Android字符滚动控件Ticker的实现

    在Android应用开发中,字符滚动控件(Ticker)通常用于显示滚动消息或标题,它能够以动态的效果展示一串文字,比如电视底部的新闻滚动条。Ticker控件可以帮助开发者创建吸引用户注意力的交互式界面。本文将深入探讨...

    Android Canvas drawText文字居中的一些事(图解)

    在绘制文字时,需要了解 FontMetrics 类,这个类是 Paint的一个内部类,主要定义了绘制文本时的一些关键坐标位置。FontMetrics 类有五个成员变量:top、ascent、baseline、descent、bottom 和 leading。这些变量的值...

    Android Canvas的drawText()与文字居中方案详解

    在Android开发中,Canvas是用于在屏幕上绘制图形和文本的核心...理解`FontMetrics`类的属性和`drawText()`的用法,是自定义View时绘制文本的关键。通过实践和实验,开发者可以熟练掌握这些技巧,创造出丰富的用户界面。

    Android 解决TextView排版参差不齐的问题

    // 调整并绘制文本 private void drawScaledText(Canvas canvas, int lineStart, String line, float lineWidth) { // 实现文字的两端对齐算法,这里需要计算每个空格的宽度,然后按比例分配 // ... } } ``` ...

    Android实现用文字生成图片的示例代码

    本文将详细介绍如何在Android平台上实现这个功能,通过一个示例代码来阐述整个过程。 首先,我们要理解这个算法的核心思想。其主要分为三个步骤: 1. **创建空白图片**:根据原始图片的大小和设定的文字字体大小,...

Global site tag (gtag.js) - Google Analytics