Android自定义带拼音音调Textview

所属分类: 软件编程 / Android 阅读数: 51
收藏 0 赞 0 分享

本文实例为大家分享了Android自定义带拼音音调Textview的具体代码,供大家参考,具体内容如下

1.拼音textview,简单的为把拼音数组和汉字数组结合在一起多行显示

import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.text.TextPaint;
import android.util.AttributeSet;
import android.widget.TextView;
import com.cgtn.chineselearning.utils.ChineseCharacter2Spell;
import com.cgtn.common.utils.ConvertUtils;

@SuppressLint("AppCompatCustomView")
public class SpellTextView extends TextView {
  private String[] pinyin;
  private String[] chinese;

  private TextPaint textPaintSpell = new TextPaint(Paint.ANTI_ALIAS_FLAG);
  private TextPaint textPaintChinese = new TextPaint(Paint.ANTI_ALIAS_FLAG);

  private int fontSizeSpell = ConvertUtils.dp2px(12);
  private int fontSizeChinese = ConvertUtils.dp2px(12);

  private int colorSpell = Color.parseColor("#1b97d6");
  private int colorChinese = Color.parseColor("#000000");
  public SpellTextView(Context context) {
    super(context);
  }

  public SpellTextView(Context context, AttributeSet attrs) {
    super(context, attrs);
  }

  public SpellTextView(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    initTextPaint();
  }

  public void initTextPaint() {
    float denity = getResources().getDisplayMetrics().density;
    textPaintSpell.setStrokeWidth(denity);
    textPaintChinese.setStrokeWidth(denity);
    textPaintSpell.setTextAlign(Paint.Align.LEFT);
    textPaintChinese.setTextAlign(Paint.Align.LEFT);
    //设置字体大小
    textPaintSpell.setTextSize(fontSizeSpell);
    textPaintChinese.setTextSize(fontSizeChinese);
    textPaintSpell.setColor(colorSpell);
    textPaintChinese.setColor(colorChinese);
  }

  @Override
  protected void onDraw(Canvas canvas) {
    float widthMesure = 0f;
    int comlum = 1;
    float pinyinWidth;
    if (pinyin != null && pinyin.length > 0) {
      for (int index = 0; index < pinyin.length; index++) {
        pinyinWidth = widthMesure + textPaintSpell.measureText(pinyin[index]);
        if (pinyinWidth > getWidth()) {
          comlum++;
          widthMesure = 0;
        }
        canvas.drawText(pinyin[index], widthMesure, (comlum * 2 - 1) * (textPaintChinese.getFontSpacing()), textPaintSpell);
        canvas.drawText(chinese[index],
            widthMesure + (textPaintSpell.measureText(pinyin[index]) - textPaintChinese.measureText(chinese[index])) / 2,
            (comlum * 2) * (textPaintChinese.getFontSpacing()), textPaintChinese);
        if (index + 1 < pinyin.length) {
          widthMesure = widthMesure + textPaintSpell.measureText(pinyin[index] + 1);
        } else {
          widthMesure = widthMesure + textPaintSpell.measureText(pinyin[index]);
        }
      }
    }
  }

  //拼音和汉字的资源
  public void setSpellAndChinese(String[] pinYin, String[] chinese) {
    this.pinyin = pinYin;
    this.chinese = chinese;
  }

  //设置文字资源
  public void setStringResource(String string) {
    initTextPaint();
    String[] spellArray = ChineseCharacter2Spell.getPinyinString(string);
    StringBuilder stringBuilder = new StringBuilder();
    for (String s : spellArray){
      stringBuilder.append(s);
      stringBuilder.append(" ");
    }

    char[] chars = string.toCharArray();
    String[] chineseArray = new String[chars.length];
    for (int i = 0; i < chars.length;i++){
      chineseArray[i] = String.valueOf(chars[i]);
    }
    setSpellAndChinese(spellArray,chineseArray);
  }

  //设置文字颜色
  public void setStringColor(int spellColor,int chineseColor) {
    textPaintSpell.setColor(spellColor);
    textPaintChinese.setColor(chineseColor);
  }

  //设置文字大小
  public void setFontSize(float spellFontSize,float chineseFontSize) {
    textPaintSpell.setTextSize(ConvertUtils.dp2px(spellFontSize));
    textPaintChinese.setTextSize(ConvertUtils.dp2px(chineseFontSize));
  }
}

2.汉字转拼音使用 implementation ‘com.belerweb:pinyin4j:2.5.0'

public static String[] getPinyinString(String character) {
  if (character != null && character.length() > 0) {
    String[] pinyin = new String[character.length()];
    HanyuPinyinOutputFormat format = new HanyuPinyinOutputFormat();
    format.setCaseType(HanyuPinyinCaseType.LOWERCASE);
    format.setToneType(HanyuPinyinToneType.WITH_TONE_MARK);
    format.setVCharType(HanyuPinyinVCharType.WITH_U_UNICODE);
    for (int index = 0; index < character.length(); index++) {
      char c = character.charAt(index);
      try {
        String[] pinyinUnit = PinyinHelper.toHanyuPinyinStringArray(c, format);
        if (pinyinUnit == null) {
          pinyin[index] = " ";
        } else {
          pinyin[index] = pinyinUnit[0];
        }
      } catch (BadHanyuPinyinOutputFormatCombination badHanyuPinyinOutputFormatCombination) {
        badHanyuPinyinOutputFormatCombination.printStackTrace();
      }

    }
    return pinyin;
  } else {
    return null;
  }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

更多精彩内容其他人还在看

使用ViewPager实现android软件使用向导功能实现步骤

现在的大部分android软件,都是使用说明,就是第一次使用该软件时,会出现向导,可以左右滑动,然后就进入应用的主界面了,下面我们就实现这个功能
收藏 0 赞 0 分享

android在异步任务中关闭Cursor的代码方法

android在异步任务中如何关闭Cursor?在我们开发应用的时候,很多时候会遇到这种问题,下面我们就看看代码如何实现
收藏 0 赞 0 分享

Android自定义桌面功能代码实现

android自定义桌面其实很简单,看一个例子就明白了
收藏 0 赞 0 分享

android将图片转换存到数据库再从数据库读取转换成图片实现代码

有时候我们想把图片存入到数据库中,尽管这不是一种明智的选择,但有时候还是不得以会用到,下面说说将图片转换成byte[]数组存入到数据库中去,并从数据库中取出来转换成图像显示出来
收藏 0 赞 0 分享

TextView显示系统时间(时钟功能带秒针变化

用System.currentTimeMillis()可以获取系统当前的时间,我们可以开启一个线程,然后通过handler发消息,来实时的更新TextView上显示的系统时间,可以做一个时钟的功能
收藏 0 赞 0 分享

Android用ListView显示SDCard文件列表的小例子

本文简单实现了用ListView显示SDCard文件列表,目录的回退等功能暂不讨论,获取文件列表,files即为所选择目录下的所有文件列表
收藏 0 赞 0 分享

Android拦截外拨电话程序示例

这篇文章主要介绍了Android拦截外拨电话的示例,大家参考使用吧
收藏 0 赞 0 分享

通过Html网页调用本地安卓(android)app程序代码

如何使用html网页和本地app进行传递数据呢?经过研究,发现还是有方法的,总结了一下,大致有一下几种方式
收藏 0 赞 0 分享

android Textview文字监控(Textview使用方法)

以手机号充值为例,当用户输入最后一位数时候,进行汇率的变换,本文就实现类似这样的功能
收藏 0 赞 0 分享

Android ListView长按弹出菜单二种实现方式示例

这篇文章主要介绍了Android ListView长按弹出菜单的方法,大家参考实现
收藏 0 赞 0 分享
查看更多