Android中的文本高亮视图

3

尝试参考这个问题,它应该能回答你的问题:https://dev59.com/unI95IYBdhLWcg3w2h56 - Abx
3个回答

4

这是您想要的内容:

package org.pskink.shape;

import android.app.Activity;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.graphics.Region;
import android.graphics.Picture;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.PictureDrawable;
import android.os.Bundle;
import android.text.Spannable;
import android.text.SpannableStringBuilder;
import android.text.TextPaint;
import android.text.style.DynamicDrawableSpan;
import android.text.style.ForegroundColorSpan;
import android.util.Log;
import android.widget.TextView;

public class DrawableSpanTest extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.drawable_span_test);
        TextView tv = (TextView) findViewById(R.id.text);
        Spannable text = new SpannableStringBuilder("This is liric of the song");
        setSpans(tv, text);
        tv.setText(text);
    }

    private void setSpans(TextView tv, Spannable text) {
        int blueColor = 0xff0000ff;
        int redColor = 0xffff0000;
        ForegroundColorSpan blue = new ForegroundColorSpan(blueColor);
        ForegroundColorSpan red = new ForegroundColorSpan(redColor);
        HalfColorSpan o = new HalfColorSpan("o", tv, blueColor, redColor);
        text.setSpan(blue, 0, 14, 0);
        text.setSpan(o, 14, 15, 0);
        text.setSpan(red, 15, text.length(), 0);
    }

    class HalfColorSpan extends DynamicDrawableSpan {
        private final static String TAG = "DrawableSpanTest.HalfColorSpan";
        Picture mPicture;
        public HalfColorSpan(String text, TextView tv, int c0, int c1) {
            super(ALIGN_BASELINE);
            mPicture = new Picture();
            TextPaint p = tv.getPaint();
            Rect bounds = new Rect();
            p.getTextBounds(text, 0, text.length(), bounds);
            float width = p.measureText(text);
            float height = bounds.height();
            float y = height;
            Canvas c = mPicture.beginRecording((int) width, (int) height);
            c.save(Canvas.CLIP_SAVE_FLAG);
//          c.drawColor(0x22000000);
            p = new TextPaint(p);
            p.setColor(c0);
            c.clipRect(0, 0, width / 2, height, Region.Op.REPLACE);
            c.drawText(text, 0, y, p);
            p.setColor(c1);
            c.clipRect(width / 2, 0, width, height, Region.Op.REPLACE);
            c.drawText(text, 0, y, p);
            c.restore();
            mPicture.endRecording();
        }
        @Override
        public Drawable getDrawable() {
            PictureDrawable d = new PictureDrawable(mPicture);
            d.setBounds(0, 0, mPicture.getWidth(), mPicture.getHeight());
            return d;
        }
    }
}

并且在 layout/drawable_span_test.xml 中:

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/text"
    android:textSize="50dip"
    android:gravity="center"
    android:background="#eee"
/>

结果是:

如下图所示:

enter image description here

使用canvas.drawText两次:分别使用两种不同的前景色。 - pskink
使用Handler和其中一个*Delayed方法。 - pskink
我想要“进度条”高亮文本而不是“块”高亮,就像卡拉OK效果一样。这就是我想要的所有东西。 - Du Huynh
块?什么块?我不知道你在说什么。 - pskink
1
所以我解释了:使用canvas.drawText两次,每次都使用不同的前景色。 - pskink
显示剩余10条评论

1

试试这个,虽然不完全符合您的要求,但应该能够胜任:

String text = "<font color=#cc0030>This is layrics o</font> <font color=#ffff00>f the song</font>";
textview.setText(Html.fromHtml(text));

我想要突出显示图像中“o”字符的一部分。每个人都注意到“o”字符的颜色。谢谢。 - Du Huynh
我认为解决方案是使用带有一些剪辑的“Canvas”。 - M-Wajeeh

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接