2013-02-20 43 views
1

我設計了一個互動的孩子書。我在surfaceview上使用了一個畫布,因爲我需要的動畫我認爲最適合於surfaceview如何在staticlayout和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(新的LinkTouchMovementMethod())沒有textview。

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(); 
} 

我想要麼添加一個TextView到staticlayout或添加spannableString並激活聽衆。

+0

你用'staticlayout'解決了嗎? – user924 2017-10-27 19:38:20

回答

2

您需要在自定義視圖中重寫onTouch方法。請參閱以下代碼,其中大部分都是從LinkTouchMovementMethod.onTouchEvent()複製的。

private boolean updateSelection(MotionEvent event, Spannable buffer,Layout layout) { 
    int action = event.getAction(); 

    if (action == MotionEvent.ACTION_UP || 
     action == MotionEvent.ACTION_DOWN) { 
     int x = (int) event.getX(); 
     int y = (int) event.getY(); 

     x -= getPaddingLeft(); 
     y -= getPaddingTop(); 

     x += getScrollX(); 
     y += getScrollY(); 

     int line = layout.getLineForVertical(y); 
     int off = layout.getOffsetForHorizontal(line, x); 

     ClickableSpan[] link = buffer.getSpans(off, off, ClickableSpan.class); 

     if (link.length != 0) { 
     if (action == MotionEvent.ACTION_UP) { 
      link[0].onClick(this); 
     } else { 
      Selection.setSelection(buffer, 
           buffer.getSpanStart(link[0]), 
           buffer.getSpanEnd(link[0])); 
     } 

     return true; 
     } else { 
     Selection.removeSelection(buffer); 
     } 
    } 

    return false; 

在您的View.onTouchEvent()方法中調用updateSelection方法。

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    updateSelection(event, layout.getText(), layout); 
} 

請參閱Weex RichText看到一個真正的演示。

+0

我要標記這正確的ton誠意。我無法檢查這些,因爲這些日子沒有在Android上工作。然而,它看起來像一個很好的工作和研究的質量答案。 – 2016-12-20 13:32:43

+0

''staticlayout'沒有Spannable緩衝區 – user924 2017-10-27 19:37:16

+0

作者的意思是'staticlayout',但似乎你是'TextView'的例子,對嗎? – user924 2017-10-27 19:38:56

相關問題