Рисование фона в TextView (не во всю ширину)

Я хотел бы установить фоновое рисование (или ресурс) в TextView, не принимая во внимание его составную ширину рисования (и отступы).

Получение ширины составного элемента (левый, чтобы быть более точным) и его отступов не должно быть проблемой, но установка фона на ширину текстового представления минус ширина составного объекта рисования (описано выше).

Если у вас есть какие-либо советы, пожалуйста, дайте мне знать.

Вот необходимый результат: разделитель

PS. Я думал о том, чтобы иметь горизонтальный LinearLayout с ImageView и TextView в качестве его дочерних элементов и иметь заданный фон только для textview, но мне интересно иметь тот же результат с меньшим количеством представлений (в данном случае, ровно один), если это возможный.

1 ответ

Решение

Вы можете использовать LayerDrawable, который поддерживает вставки, например:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:left="dimension" android:right="dimension">
        <shape android:shape="rectangle">
            <solid android:color="color" />
        </shape>
    </item>
</layer-list>

Если вы хотите изменить свой Drawable динамически, вам лучше написать свой собственный класс Drawable. Например, следующий DividerDrawable рисует линию для данного отступа на белом фоне:

public class DividerDrawable extends Drawable {

    private Paint mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
    private float mDensity;
    private int mPaddingLeft = 0;

    public DividerDrawable(Context context) {
        mPaint.setColor(Color.BLACK);
        mDensity = context.getResources().getDisplayMetrics().density;
    }

    @Override
    public void draw(Canvas canvas) {
        int width = canvas.getWidth();
        int height = canvas.getHeight();
        canvas.drawColor(Color.WHITE);
        canvas.drawRect(mPaddingLeft, height - mDensity, width, height, mPaint);
    }

    @Override
    public void setAlpha(int alpha) {

    }

    @Override
    public void setColorFilter(ColorFilter colorFilter) {

    }

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

    public void setPaddingLeft(int paddingLeft) {
        if (mPaddingLeft != paddingLeft) {
            mPaddingLeft = paddingLeft;
            invalidateSelf();
        }
    }
}

Чтобы установить левый отступ на основе вашего левого CompoundDrawable, вы можете сделать что-то вроде этого:

private void setBackground(TextView textView, DividerDrawable background) {
    Drawable drawableLeft = textView.getCompoundDrawables()[0];
    int paddingLeft = drawableLeft != null ?
            textView.getPaddingLeft() + drawableLeft.getIntrinsicWidth() + textView.getCompoundDrawablePadding() :
            textView.getPaddingLeft();
    background.setPaddingLeft(paddingLeft);
    textView.setBackground(background);
}

Чтобы хорошо использовать все это, назовите это так:

    DividerDrawable dividerDrawable = new DividerDrawable(this);
    TextView textView = (TextView) findViewById(R.id.text);
    setBackground(textView, dividerDrawable);
Другие вопросы по тегам