单个Textview的多个渐变

时间:2012-06-26 17:14:32

标签: java android

将agradient引用为textview,可以在android中实现正常动作,

如下:

 android:background="@drawable/gredient"

和渐变XML将如下代码:

<?xml version="1.0" encoding="utf-8"?>
 <shape xmlns:android="http://schemas.android.com/apk/res/android"
        android:shape="rectangle">
  <gradient android:startColor="#B22222" android:centerColor="#000000"
          android:endColor="#B22222" android:angle="0" /> 
    <corners android:radius="15dp"  /> 
 </shape>

我想问的是什么是否有机会以将多个渐变应用于单个textview 组成的可能段落,因此每个段落都会有不同的渐变。

任何建议都将受到赞赏,

感谢

3 个答案:

答案 0 :(得分:1)

您可能需要考虑使用WebView代替TextView(如果您需要更高级的格式设置),但如果您想坚持使用TextView,那么LineBackgroundSpan就是您的朋友: )

虽然可能有一些更好的解决方案(很可能涉及自定义Layout - 派生类),但这里有一些示例代码可以通过实现一个特殊的LineBackgroundSpan接口来执行您想要的任务:

public class MyActivity extends Activity {

    private Editable mEditable;

    private class MySpan implements LineBackgroundSpan {
        private final Rect rect = new Rect();
        private final Drawable drawable;
        private int next = 0;

        public MySpan(Drawable drawable) {
            this.drawable = drawable;
        }

        @Override
        public void drawBackground(Canvas c, Paint p, int left, int right, int top, int baseline,
                int bottom, CharSequence text, int start, int end, int lnum) {
            if (start == end) return;
            if (next == 0) {
                next = mEditable.nextSpanTransition(start, Integer.MAX_VALUE, MySpan.class);
                rect.left = left;
                rect.top = top;
            }
            if (next == end) {
                rect.right = right;
                rect.bottom = bottom;
                c.save();
                drawable.setBounds(rect);
                drawable.draw(c);
                c.restore();
            }
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        final Resources res = getResources();
        final Drawable gd1 = res.getDrawable(R.drawable.gd1);
        final Drawable gd2 = res.getDrawable(R.drawable.gd2);
        final Drawable gd3 = res.getDrawable(R.drawable.gd3);
        final Drawable gd4 = res.getDrawable(R.drawable.gd4);

        final TextView tv = new TextView(this);
        setContentView(tv);

        tv.setText("Paragraphs with drawable background:\n", BufferType.EDITABLE);
        mEditable = tv.getEditableText();

        final String text = "paragraph text ";
        appendPara("###\n".replaceAll("#", text), gd1);
        appendPara("##############\n".replaceAll("#", text), gd2);
        appendPara("#######\n".replaceAll("#", text), gd3);
        appendPara("###########\n".replaceAll("#", text), gd4);
    }

    private void appendPara(String string, Drawable gd) {
        final int start = mEditable.length();
        mEditable.append(string);
        final int end = mEditable.length();
        mEditable.setSpan(new MySpan(gd), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    }

}

答案 1 :(得分:0)

我不认为使用android的默认TextView是可能的。

您可以通过使用View扩展课程来创建自己的视图,并在视图的Canvas.drawText(...)方法中使用Canvas.drawBitmap(...)onDraw()等方法来创建每个段落用不同的渐变。

这也可以帮助您控制行高和段落间距。

答案 2 :(得分:0)

因为,您的多个Paragraphs需要多个渐变,那么为什么不为每个TextView设置一个Paragraph并为每个TextView设置唯一渐变。

如果你不知道你会有多少段,

您必须创建LinearLayoutheightwrap-content的{​​{1}},并在每个段落的运行时创建TextView fill_parent widthwrap_context height并将TextView添加到您的父(LinearLayout)视图中。并在代码集backgrounds中添加到TextViews