上一篇介绍了完成Android输入法的最小化步骤,它只能将按键对应的字符上屏。一般的东亚语言都有一个转换的过程,比如汉语输入拼音,需要由拼音转成汉字再上屏。本文将在前文基础上加入完成转换过程所必需的候选窗。本文代码可参见https://github.com/palanceli/AndroidXXIME/tree/v2。
如下图所示,用红框框出来的窗体是候选窗,其内的字符创叫做候选串,点击候选窗使之进入输入控件叫做上屏。没有输入的时候隐藏候选窗,当输入字串还未上屏时显示候选窗:
引入候选窗需要完成两个步骤:
一、创建CandidateView,该窗口需要覆盖如下两个方法,已完成自绘:
- onDraw(Canvas canvas);
- onMeasure(int widthMeasureSpec, int heightMeasureSpec);
二、覆盖AndroidXXIME类的如下两个方法:
- onCreateCandidateView();
在该方法中创建CandidateView。
- onKey(int primaryCode, int [] keyCodes);
在该方法中响应按键消息,如:当按下字母键,则展现候选窗以及候选字串;当按下空格,则上屏候选字串,等等。
创建CandidateView
public CandidateView(Context context) { super(context); Log.d(this.getClass().toString(), "CandidateView: "); // 设置前景、背景色、字体、字号 Resources r = context.getResources(); setBackgroundColor(getResources().getColor(R.color.candidate_background, null)); mColorNormal = r.getColor(R.color.candidate_normal, null); mVerticalPadding = r.getDimensionPixelSize(R.dimen.candidate_vertical_padding); mPaint = new Paint(); mPaint.setColor(mColorNormal); mPaint.setAntiAlias(true); mPaint.setTextSize(r.getDimensionPixelSize(R.dimen.candidate_font_height)); mPaint.setStrokeWidth(0); setWillNotDraw(false);