2012-05-02 33 views
7

Tôi muốn sử dụng Canvas.drawText() để hiển thị văn bản nhiều màu. Cụ thể hơn, tôi muốn làm nổi bật một chuỗi con của văn bản được truyền vào phương thức drawText().Có thể hiển thị văn bản nhiều màu với một cuộc gọi tới Canvas.drawText() không?

Văn bản ở dạng một SpannableString với 0 hoặc nhiều đối tượng ForegroundColorSpan.

Nhìn vào mã Canvas, có vẻ như một cuộc gọi .toString() trên CharSequence đã qua, có nghĩa là điều này là không thể.

Có cách nào khác không?

EDIT: Văn bản đôi khi có thể thay đổi (tổng thay đổi, không gia tăng). Ngoài ra, có nhiều văn bản tiềm năng được định vị ở các vị trí không liên quan khác nhau trong chế độ xem tùy chỉnh.

+0

Sử dụng Shader cho văn bản nhiều màu –

+0

Cảm ơn nhưng tôi không thể thấy cách đạt được điều này. Lớp Shader nào đặc biệt? –

Trả lời

25

Có nó có thể bằng cách sử dụng một trong những Layout lớp học. Đây là những lớp trợ giúp để vẽ văn bản vào một khung vẽ và chúng hỗ trợ Spannables. Nếu văn bản của bạn không thay đổi, hãy sử dụng StaticLayout.

Ví dụ

Thêm này để tùy chỉnh của bạn xem lớp

private StaticLayout layout; 

đặt mã này vào bạn onLayout hoặc onSizeChanged

Spannable wordtoSpan = new SpannableString("I know just how to whisper, And I know just how to cry,I know just where to find the answers"); 

wordtoSpan.setSpan(new ForegroundColorSpan(Color.BLUE), 15, 30, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 

TextPaint paint = new TextPaint(); 
paint.setTextSize(20f); 
paint.setColor(Color.RED); 
layout = new StaticLayout(wordtoSpan, paint, getWidth(), Alignment.ALIGN_NORMAL, 1, 0, false); 

Sau đó, trong phương pháp vẽ của bạn chỉ cần gọi

layout.draw(canvas); 

Trong trường hợp văn bản của bạn thay đổi thường xuyên, bạn có thể sử dụng số DynamicLayout.

Editable.Factory fac = Editable.Factory.getInstance(); 
Editable edit = fac.newEditable(wordtoSpan); 
DynamicLayout layout = new DynamicLayout(edit,paint,getWidth(),Alignment.ALIGN_CENTER,1,0,false); 

thay đổi văn bản bằng cách sử dụng các chỉnh sửa đối tượng

edit.append("hello"); 
+0

Tuyệt vời, cảm ơn. Điều này có vẻ rất hứa hẹn. Trong trường hợp của tôi, văn bản thay đổi. Trong trường hợp này, có thể một số loại gọi invalid() được sử dụng để đạt được những gì tôi muốn? –

+0

Trong trường hợp đó, bạn chỉ cần sử dụng [DynamicLayout] (http://developer.android.com/reference/android/text/DynamicLayout.html) hoặc tạo bố cục mới mỗi khi văn bản thay đổi. – Renard

+0

ok, tôi sẽ xem xét điều này. Trong thực tế, tôi đang hiển thị nhiều chuỗi vì vậy tôi giả sử một DynamicLayout cho mỗi chuỗi? Ngoài ra, khi văn bản thay đổi, toàn bộ văn bản sẽ thay đổi (nghĩa là văn bản KHÔNG giống văn bản được chỉnh sửa trong EditText). Điều này có ảnh hưởng đến giải pháp mong muốn không? –

0

Hãy thử một cái gì đó như thế này, nếu bạn sử dụng TextView

String multiColorText = "<font color=0xff0000>Multi</font><font color=0x000000>Color</font><font color=0xccffff>Text</font>"; 

textView.setText(Html.fromHtml(multiColorText)); 

Edit: Đối SpannableString, kiểm tra xem dưới đây giúp bạn

Spannable WordtoSpan = new SpannableString("partial colored text"); 

WordtoSpan.setSpan(new ForegroundColorSpan(Color.BLUE), 2, 4, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
+0

Xin lỗi, tôi không sử dụng TextView. –

+0

Trả lời chỉnh sửa .. Hy vọng nó sẽ giúp –

0

Bất cứ khi nào bạn viết rằng văn bản cho quan điểm cho rằng bạn có thể đặt thatView.setBackgroundResource (R.drawable.multicolor);

Trong multicolor.xml ghi

<?xml version="1.0" encoding="utf-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android" 
android:shape="rectangle"> 
    <gradient 
      android:startColor="@color/tabBgStart" 
      android:endColor="@color/tabBgEnd" 
      android:angle="270"/> 
</shape> 

Hy vọng nó sẽ hoạt động chắc chắn

Để thay đổi màu sắc văn bản mà bạn có thể sử dụng yourView.setTextColor (R.drawable.multicolor);

1

i hv không được sử dụng trong bằng Canvas. xem dưới đây mã như thế nào tôi sử dụng nó trong textview.

public TextView getTextClipArt1(){ 
    TextView textView = new TextView(context); 
    Typeface tf = new MyTypeface(context, 0).getTypeface(); 

    Shader textShader=new LinearGradient(0, 0, 0, 30, 
      new int[]{Color.GREEN,Color.BLUE}, 
      new float[]{0, 1}, TileMode.CLAMP); 

    textView.setTypeface(tf); 
    textView.getPaint().setShader(textShader); 
    textView.getPaint().setStyle(Paint.Style.STROKE); 
    textView.getPaint().setStrokeWidth(2); 
    textView.setText("ABC"); 
    textView.setTextSize(30); 
    textView.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); 

    return textView; 
} 

bây giờ bạn có thể vẽ textview dưới dạng bitmap trên canvas, Mặc dù tôi nghĩ rằng các phương pháp này cũng tồn tại trong lớp sơn. Hy vọng hữu ích cho bạn.

Các vấn đề liên quan