将多行文本值设置为imageview无法正常工作

时间:2016-07-07 05:30:30

标签: java android string textview imageview

 String dis = "";

            String itemName = pdtList.get(position).getItemName();
            if (itemName.contains("MG") || itemName.contains("GM") || itemName.contains("ML") || itemName.contains("MCG")) {
                String[] itemNameLength = itemName.split("\\s+");
                for (int i = 0; i < itemNameLength.length; i++) {
                    if (itemNameLength[i].contains("MG") || itemNameLength[i].contains("GM") || itemNameLength[i].contains("ML") || itemNameLength[i].contains("MCG")) {
                        if(itemName.contains(" ")){
                            int i1 = itemName.indexOf(" "); // 4
                            String word = itemName.substring(0, i1);
                            dis = word + "\n" + itemNameLength[i];
                            System.out.println(" itemName looping value is ---- " + dis);
                            break;
                        }

                    }
                }
            } else {
                char first = itemName.charAt(0);
                dis = first + "";
            }
            System.out.println(" itemName value ---- " + dis);
            System.out.println(" itemName value size---- " + dis.length());

            TextDrawable drawable = TextDrawable.builder()
                    .beginConfig()
                    .withBorder(4,"#19a4cf") /* thickness in px */
                    .fontSize((dis.contains("MG") || dis.contains("GM") || dis.contains("ML") || dis.contains("MCG") ? 30 : 75))
                    .textColor(getResources().getColor(R.color.text))
                    .endConfig()
                    .buildRoundRect(dis, getResources().getColor(R.color.tabname), 10);
            holder.image_view.setImageDrawable(drawable);

将多行文本值设置为imageview无效。上面是我的代码,文本值不是多行设置而是单行设置。

    import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.ColorFilter;
import android.graphics.Paint;
import android.graphics.PixelFormat;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.Typeface;
import android.graphics.drawable.ShapeDrawable;
import android.graphics.drawable.shapes.OvalShape;
import android.graphics.drawable.shapes.RectShape;
import android.graphics.drawable.shapes.RoundRectShape;

public class TextDrawable extends ShapeDrawable {

    private static final float SHADE_FACTOR = 0.9f;
    private final Paint textPaint;
    private final Paint borderPaint;
    private final String text;
    private final int color;
    private final int borderColor;
    private final RectShape shape;
    private final int height;
    private final int width;
    private final int fontSize;
    private final float radius;
    private final int borderThickness;

    private TextDrawable(Builder builder) {
        super(builder.shape);

        // shape properties
        shape = builder.shape;
        height = builder.height;
        width = builder.width;
        radius = builder.radius;

        // text and color
        text = builder.toUpperCase ? builder.text.toUpperCase() : builder.text;
        color = builder.color;
        borderColor = builder.borderColor;

        // text paint settings
        fontSize = builder.fontSize;
        textPaint = new Paint();
        textPaint.setColor(builder.textColor);
        textPaint.setAntiAlias(true);
        textPaint.setFakeBoldText(builder.isBold);
        textPaint.setStyle(Paint.Style.FILL);
        textPaint.setTypeface(builder.font);
        textPaint.setTextAlign(Paint.Align.CENTER);
        textPaint.setStrokeWidth(builder.borderThickness);

        // border paint settings
        borderThickness = builder.borderThickness;
        borderPaint = new Paint();
        //borderPaint.setColor(getDarkerShade(color));
        borderPaint.setColor(borderColor);
        borderPaint.setStyle(Paint.Style.STROKE);
        borderPaint.setStrokeWidth(borderThickness);
        //borderPaint.set

        // drawable paint color
        Paint paint = getPaint();
        paint.setColor(color);

    }

    public static IShapeBuilder builder() {
        return new Builder();
    }

    private int getDarkerShade(int color) {
        return Color.rgb((int) (SHADE_FACTOR * Color.red(color)),
                (int) (SHADE_FACTOR * Color.green(color)),
                (int) (SHADE_FACTOR * Color.blue(color)));
    }

    @Override
    public void draw(Canvas canvas) {
        super.draw(canvas);
        Rect r = getBounds();


        // draw border
        if (borderThickness > 0) {
            drawBorder(canvas);
        }

        int count = canvas.save();
        canvas.translate(r.left, r.top);

        // draw text
        int width = this.width < 0 ? r.width() : this.width;
        int height = this.height < 0 ? r.height() : this.height;
        int fontSize = this.fontSize < 0 ? (Math.min(width, height) / 2) : this.fontSize;
        textPaint.setTextSize(fontSize);
        canvas.drawText(text, width / 2, height / 2 - ((textPaint.descent() + textPaint.ascent()) / 2), textPaint);
        canvas.restoreToCount(count);

    }

    private void drawBorder(Canvas canvas) {
        RectF rect = new RectF(getBounds());
        rect.inset(borderThickness / 2, borderThickness / 2);
        //rect.inset(borderThickness, borderThickness);

        if (shape instanceof OvalShape) {
            canvas.drawOval(rect, borderPaint);
        } else if (shape instanceof RoundRectShape) {
            canvas.drawRoundRect(rect, radius, radius, borderPaint);
        } else {
            canvas.drawRect(rect, borderPaint);
        }
    }

    @Override
    public void setAlpha(int alpha) {
        textPaint.setAlpha(alpha);
    }

    @Override
    public void setColorFilter(ColorFilter cf) {
        textPaint.setColorFilter(cf);
    }

    @Override
    public int getOpacity() {
        return PixelFormat.TRANSLUCENT;
    }

    @Override
    public int getIntrinsicWidth() {
        return width;
    }

    @Override
    public int getIntrinsicHeight() {
        return height;
    }

    public interface IConfigBuilder {
        public IConfigBuilder width(int width);

        public IConfigBuilder height(int height);

        public IConfigBuilder textColor(int color);

        public IConfigBuilder withBorder(int thickness, int borderColor);

        public IConfigBuilder withBorder(int thickness, String borderColor);

        public IConfigBuilder useFont(Typeface font);

        public IConfigBuilder fontSize(int size);

        public IConfigBuilder bold();

        public IConfigBuilder toUpperCase();

        public IShapeBuilder endConfig();
    }

    public static interface IBuilder {

        public TextDrawable build(String text, int color);
    }

    public static interface IShapeBuilder {

        public IConfigBuilder beginConfig();

        public IBuilder rect();

        public IBuilder round();

        public IBuilder roundRect(int radius);

        public TextDrawable buildRect(String text, int color);

        public TextDrawable buildRoundRect(String text, int color, int radius);

        public TextDrawable buildRound(String text, int color);
    }

    public static class Builder implements IConfigBuilder, IShapeBuilder, IBuilder {

        public int textColor;
        public float radius;
        private String text;
        private int color;
        private int borderColor;
        private int borderThickness;
        private int width;
        private int height;
        private Typeface font;
        private RectShape shape;
        private int fontSize;
        private boolean isBold;
        private boolean toUpperCase;

        private Builder() {
            text = "";
            color = Color.GRAY;
            borderColor = Color.RED;
            textColor = Color.WHITE;
            borderThickness = 0;
            width = -1;
            height = -1;
            shape = new RectShape();
            font = Typeface.create("sans-serif-light", Typeface.NORMAL);
            fontSize = -1;
            isBold = false;
            toUpperCase = false;
        }

        public IConfigBuilder width(int width) {
            this.width = width;
            return this;
        }

        public IConfigBuilder height(int height) {
            this.height = height;
            return this;
        }

        public IConfigBuilder textColor(int color) {
            this.textColor = color;
            return this;
        }

        public IConfigBuilder withBorder(int thickness, int borderColor) {
            this.borderThickness = thickness;
            this.borderColor = borderColor;
            return this;
        }

        public IConfigBuilder withBorder(int thickness, String borderColor) {
            this.borderThickness = thickness;
            this.borderColor = Color.parseColor(borderColor);
            return this;
        }

        public IConfigBuilder useFont(Typeface font) {
            this.font = font;
            return this;
        }

        public IConfigBuilder fontSize(int size) {
            this.fontSize = size;
            return this;
        }

        public IConfigBuilder bold() {
            this.isBold = true;
            return this;
        }

        public IConfigBuilder toUpperCase() {
            this.toUpperCase = true;
            return this;
        }

        @Override
        public IConfigBuilder beginConfig() {
            return this;
        }

        @Override
        public IShapeBuilder endConfig() {
            return this;
        }


        @Override
        public IBuilder rect() {
            this.shape = new RectShape();
            return this;
        }

        @Override
        public IBuilder round() {
            this.shape = new OvalShape();
            return this;
        }

        @Override
        public IBuilder roundRect(int radius) {
            this.radius = radius;
            float[] radii = {radius, radius, radius, radius, radius, radius, radius, radius};
            this.shape = new RoundRectShape(radii, null, null);
            return this;
        }

        @Override
        public TextDrawable buildRect(String text, int color) {
            rect();
            return build(text, color);
        }

        @Override
        public TextDrawable buildRoundRect(String text, int color, int radius) {
            roundRect(radius);
            return build(text, color);
        }

        @Override
        public TextDrawable buildRound(String text, int color) {
            round();
            return build(text, color);
        }

        @Override
        public TextDrawable build(String text, int color) {
            this.color = color;
            this.text = text;
            return new TextDrawable(this);
        }
    }
}

这是textdrawable类。请帮我解决这个问题。 提前谢谢。

1 个答案:

答案 0 :(得分:1)

我自己只解决了。你需要添加这个逻辑来设置多行文本。在draw()中需要更新如下。

 int count = canvas.save();
    canvas.translate(r.left, r.top);
    int width = this.width < 0 ? r.width() : this.width;
    int height = this.height < 0 ? r.height() : this.height;
    int fontSize = this.fontSize < 0 ? (Math.min(width, height) / 2) : this.fontSize;
    textPaint.setTextSize(fontSize);
    String[] lines = text.split("\n");
    int yoff = 0;
    for (int i = 0; i < lines.length; ++i) {
        canvas.drawText(lines[i], width / 2, (height / 2 - ((textPaint.descent() + textPaint.ascent()) / 2)) + yoff, textPaint);
        textPaint.getTextBounds(lines[i], 0, lines[i].length(), r);
        yoff += r.height();
    }
    canvas.restoreToCount(count);