Android Custom with Pinyin Tone Textview
- 2021-10-27 08:59:19
- OfStack
In this paper, we share the specific code of Android custom with pinyin tone Textview for your reference. The specific contents are as follows
1. Pinyin textview, which is simply to combine Pinyin array and Chinese character array in one multi-line display
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);
// Set the font size
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]);
}
}
}
}
// Resources of Pinyin and Chinese Characters
public void setSpellAndChinese(String[] pinYin, String[] chinese) {
this.pinyin = pinYin;
this.chinese = chinese;
}
// Set up text resources
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);
}
// Set the text color
public void setStringColor(int spellColor,int chineseColor) {
textPaintSpell.setColor(spellColor);
textPaintChinese.setColor(chineseColor);
}
// Set the text size
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;
}
}