Android自定义带拼音音调Textview
更新时间:2019年01月03日 08:34:28 作者:maoamade
这篇文章主要介绍了Android自定义带拼音音调的Textview,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
本文实例为大家分享了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; } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
相关文章
详解RecyclerView设置背景图片长宽一样(以GridLayoutManager为例)
这篇文章主要介绍了详解RecyclerView设置背景图片长宽一样(以GridLayoutManager为例),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧2017-12-12Android手机通过rtp发送aac数据给vlc播放的实现步骤
这篇文章主要介绍了Android手机通过rtp发送aac数据给vlc播放的实现步骤,帮助大家更好的理解和学习使用Android,感兴趣的朋友可以了解下2021-04-04Android用Scroller实现一个可向上滑动的底部导航栏
本篇文章主要介绍了Android用Scroller实现一个可上滑的底部导航栏,具有一定的参考价值,有兴趣的小伙伴们可以参考一下2017-07-07Android Universal ImageLoader 缓存图片
Universal Image Loader for Android的目的是为了实现异步的网络图片加载、缓存及显示,支持多线程异步加载,通过本文给大家介绍Android Universal ImageLoader缓存图片相关资料,涉及到imageloader缓存图片相关知识,对imageloader缓存图片相关知识感兴趣的朋友一起学习2016-01-01Android UI组件LinearLayout线性布局详解
这篇文章主要为大家详细介绍了AndroidUI组件LinearLayout线性布局,具有一定的实用性,感兴趣的小伙伴们可以参考一下2016-08-08
最新评论