2011-12-11 57 views
1

使用StaticLayout将HTML中的文本绘制到画布上。 我需要弄清楚的是,我可以如何在文本中点击链接。 我认为最简单的方法是获取文本中链接的坐标,并在视图上使 为自定义点击事件。获取静态布局中链接的位置

这是我的神至今:

Spanned mySpannedHTML = Html.fromHtml(html_text, null, null); 

StaticLayout sl = new StaticLayout(mySpannedHTML, mWhite, mWidth, Layout.Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false); 

sl.draw(canvas); 

//FINE SO FAR, but how to get the coorinates of the links? 


//GETTING THE LINKS 

URLSpan[] getUrls =((Spanned) sl.getText()).getSpans(0, sl.getText().length(), URLSpan.class); 

for (URLSpan urlSpan : getUrls) { 

       int start =((Spanned) sl.getText()).getSpanStart(urlSpan); 
       int end =((Spanned) sl.getText()).getSpanEnd(urlSpan); 

//LOG LINKS URL AND LINK TEXT 

       Log.i("spans", "url: "+urlSpan.getURL() + " Link text: "+ ((Spanned) sl.getText()).subSequence(start, end) + " "); 

      } 

所以,我在这里很坚持......我之所以需要在文本中的链接的坐标,是因为我加载到画布上一个用于渲染的openGL纹理。说得通?

回答

4

我创建了一个函数来传递调用者的MotionEvent和View。然后,我得到了urlSpan的路径,获取边界(参见rectF)并将该偏移量添加到矩形中(因为我的staticlayout没有覆盖整个屏幕,并且rectF显示了静态布局中的位置) rectF给出URLSpan的界限。

public boolean onTextTouched(View widget,MotionEvent event) 
{ 
    //If the text contains an url, we check its location and if it is touched: fire the click event. 
    Spanned spanned = (Spanned)text; 
    URLSpan[] urls = spanned.getSpans(0,spanned.length(),URLSpan.class); 
    for(int i=0;i<urls.length;i++) 
    { 
     //get the start and end points of url span 
     int start=spanned.getSpanStart(urls[i]); 
     int end=spanned.getSpanEnd(urls[i]); 

     Path dest = new Path(); 
     mStaticLayout.getSelectionPath(start, end, dest); 

     RectF rectF = new RectF(); 
     dest.computeBounds(rectF, true); 

     //Add the left and top margins of your staticLayout here. 
     rectF.offset(getContentLeft(),getContentTop()); 

     if(rectF.contains(event.getX(),event.getY())) 
     { 
      urls[i].onClick(widget); 
      return true; 
     } 
    } 
    return false; 
} 
+0

工程就像一个魅力!谢谢! –

0

使用paint并使用measureText来确定x坐标,然后使用行号和上升和下降来确定y's。