我设计了一本互动儿童读物。我在surfaceview上使用画布,因为我需要我认为最适合surfaceview的动画
我想让每个单词都可以触摸并大声朗读那个单词。当我使用带有 textview 的常规视图时,这非常有用。然后我尝试用画布制作动画,但不知道该怎么做。
我在画布上使用了静态布局来保存可扩展的文本。我不知道如何激活 onTouchListener。
这里我设置了staticlayout
public class OurView extends SurfaceView implements Runnable, Callback {
public OurView(Context context, AttributeSet attribs) {
super(context, attribs);
init(context);
}
private void init(Context context) {
ball = BitmapFactory.decodeResource(getResources(), R.drawable.ball);
text = context.getString(R.string.para1);
tpaint = new TextPaint();
tpaint.setColor(Color.WHITE);
tpaint.setStyle(Style.FILL);
tpaint.setTextSize(40F);
TextView tv = splitWords(text);
staticLayout = new StaticLayout(??????????, tpaint, 1000F,
Layout.Alignment.ALIGN_NORMAL, 1, 0, false);
holder = getHolder();
holder.addCallback(this);
}
这是我将文本拆分为单词并为每个单词创建一个触摸监听器。它当前返回一个 Textview,我试图返回 spaanablestring 但我无法激活监听器。我想改变它以满足我的需要。我不知道如何在没有文本视图的情况下执行 tv.setMovementMethod(new LinkTouchMovementMethod())。
public TextView splitWords(final String text) {
TextView tv = new TextView(getContext());
final SpannableString ssText = new SpannableString(text);
Pattern pattern;
String regex = "\\w+";
pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(text);
while (matcher.find()) {
final int begin = matcher.start();
final int end = matcher.end();
ClickableSpan clickableSpan = new ClickableSpan() {
@Override
public void onClick(View widget) {
String word = (String) text.subSequence(begin, end)
.toString();
Toast.makeText(getContext(), word, Toast.LENGTH_SHORT)
.show();
return;
}
};
ssText.setSpan(clickableSpan, begin, end, 0);
}
tv.setMovementMethod(new LinkMovementMethod());
tv.setText(text, BufferType.SPANNABLE);
return tv;
}
为了完整性,我的 DoDraw
private void doDraw(Canvas canvas) {
canvas.drawBitmap(ball, x, 100, null);
incrementX();
canvas.save();
canvas.translate(100.0f, 350.0f);
staticLayout.draw(canvas);
canvas.restore();
}
我想向 staticlayout 添加一个 textview 或添加 spannableString 并激活侦听器。