java - 单个 Textview 的多个渐变

标签 java android

将渐变引用到textview视为在android中可以实现正常 Action ,

如下:

 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>

我想问的是是在android中将多个渐变应用到单个textview由多个段落组成,所以每个段落都会有不同的渐变。

任何建议将不胜感激,

谢谢

最佳答案

您可能想考虑使用 WebView 而不是 TextView(如果您需要更高级的格式设置),但如果您想坚持使用 TextView,LineBackgroundSpan是你的 friend :)

虽然可能有一些更好的解决方案(很可能涉及自定义 Layout 派生类),但这里有一些示例代码,只需实现一个特殊的 LineBackgroundSpan 接口(interface)即可完成您想要的操作:

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

}

关于java - 单个 Textview 的多个渐变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11212587/

相关文章:

java - 测试这个的最佳方法是什么? 4位二进制数

android - 如何将字符串从一项 Activity 发送到另一项 Activity ?

android - 同一个 APK 中的多个应用

android - 在循环中动态添加 Spinner

java - 如何使位图背景透明?

java - 在 JOCL 中将 int 作为内核参数传递

Java + Oracle 连接 - 完成少量后被拒绝

java - 如何配置 liferay tomcat 服务器以从另一个 liferay tomcat 服务器读取文件?

java - 为什么这里抛出中断异常...原因?

android - 退出应用程序-android-后如何消除声音