本文实例为大家分享了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;

}

}

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

android音频声调,Android自定义带拼音音调Textview相关推荐

  1. android view绘制中调用的函数,Android开发实践:自定义带动画的View

    前面两篇文章介绍了自定义View的onMeasure和onLayout原理,本文准备介绍自定义View的第三个关键部分,即onDraw()函数的重载. 对于一个自定义View来说,onMeasure只 ...

  2. android 音频设备类型,Android 音频

    Android 音频Android Audio 02/28/2018 本文内容 Android OS 为多媒体提供了广泛的支持,包括音频和视频.本指南重点介绍 Android 中的音频,并介绍如何使用 ...

  3. android 音频配置文件,Android音频系统

    1 分析思路 Thread如何创建? AudioPolicyService是策略的制定者,AudioFlinger是策略的执行者, 所以: AudioPolicyService根据配置文件使唤Audi ...

  4. android音频资源,android音频编辑之音频裁剪的示例代码

    前言 本篇开始讲解音频编辑的具体操作,从相对简单的音频裁剪开始.要进行音频裁剪,我的方案是开启一个Service服务用于音频裁剪的耗时操作,主界面发送裁剪命令,同时注册EventBus接受裁剪的消息( ...

  5. 车载导航android音频策略,Android车载导航全局声控装置及方法

    Android车载导航全局声控装置及方法 [技术领域] [0001]本发明涉及智能Android车载系统领域,尤其涉及一种Android车载导航全局声控装置及方法. [背景技术] [0002]在行车过 ...

  6. android音频测试方法,Android左右声道音频文件测试

    测试左右声道,其实主要步骤是制作一个 含有左右声道的音频文件. private MediaPlayer mMedieplayer; Button mButton = (Button)findViewB ...

  7. Android音频框架之一 详解audioPolicy流程及HAL驱动加载与配置

    前言 此音频架构梳理笔记.主要是因工作上需要在 Android8.1 以上版本中,增加 snd-aloop 虚拟声卡做前期准备工作, 本篇文章提纲挈领的把音频框架主线梳理清晰,通过这篇文章能够清晰如下 ...

  8. 在“提示”框中:管理Android音频配置文件,Android上的Google书签和电缆固定

    It's a Thursday afternoon and that tip-time-of-week again. This week we're looking at managing audio ...

  9. Android音频管理总结(个人笔记)

    Android音频管理 Android音频概述 media player接口 Android系统的播放器NuPlayer media extractor(高通的有自己的解封装模块mmparser) A ...

最新文章

  1. Linux 虚拟化网络技术 — KVM + Linux Bridge 的网络虚拟化解决方案
  2. android gridview item 大小,关于GridView item动态宽度的问题
  3. java io复用_学习Java编程-IO复用
  4. 区间第K大(划分树)
  5. 『数据库』你以为删库跑路就能让你老板内(lei)牛(liu)满面--数据库的恢复技术
  6. 华为手机记事本导出_深夜浅谈怎样用一部手机做电影解说?
  7. 计算机控制作业及答案,《微机系统与维护》课程作业及答案(二)
  8. python pipenv_为什么Python开发人员应该使用Pipenv
  9. Java集合 -- HashSet 和 HashMap
  10. 【flink】Flink 1.12.2 源码浅析 : yarn-per-job模式解析 从脚本到主类
  11. vb.net与FLASH的完美结合
  12. mfa助听器设备能否在android,助听器的蓝牙功能到底有什么用,购买的价格,以及购买时要注意什么等问题...
  13. mysql 插入数据后返回当前的自增ID方法
  14. 如何用Mac 自带的 Automator 进行图片格式转换?
  15. JetBrains:webstrom关闭重复代码校验
  16. Java程序员简历书写
  17. 航摄像片生成DSM(Pix4d)2021.5.21
  18. 机器学习算法------6.4 模型评估(误差平方和、肘方法、轮廓系数法、CH系数)
  19. OpenCV学习案例之车牌识别EasyPR
  20. 使用一个SQL查询出每门课程的成绩都大于80分的学生姓名

热门文章

  1. 信息系统项目管理师2021年下半年下午案例分析题及答案
  2. 我今年27.8岁了有感!
  3. 6.4.1.3 UE-requested PDU session establishment procedure accepted by the network
  4. 中英文颜色对照片(转载)
  5. oracle end proc,初学者Oracle数据库:Proc和Proc++的使用和示例
  6. 2018年第四期全国高校大数据核心技术应用实战师资研修班在在广东番禺开幕
  7. win10+python3.7环境下安装pydensecrf(实测有效!)
  8. 一招搞定Xcode错误日志显示use -v to see invocation的问题
  9. win10配置TensortRT7.2.1+opencv+多线程环境 (matlab2021a和VS2017混合mex编程)
  10. 分布式部署LNMP+WordPress