Могу ли я использовать дочерний вид или группу просмотра в XML-макете Android для подкрашивания части фона родителя? - PullRequest
0 голосов
/ 07 января 2019

В настоящее время у меня есть следующий макет как часть моего файла XML:

LinearLayout (orientation: vertical)
+---TextView (title)
+---LinearLayout (orientation: horizontal)
    +---ConstraintLayout
        +---...
    +---ConstraintLayout
        +---...
    +---ConstraintLayout
        +---...

Родитель LinearLayout имеет фон, который можно нарисовать.

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

Я пробовал атрибуты backgroundTint и foregroundTint в обоих дочерних макетах, но ни один из них не изменил ничья родительского LinearLayout.

Итак, есть ли способ сделать то, что я просил в названии, или я застрял в подклассе LinearLayout и переопределил функцию onDraw?

1 Ответ

0 голосов
/ 08 января 2019

Да, я застрял с использованием функции ViewGroup onDraw:

public class PartialTintedRoundedRectLinearLayout extends LinearLayout {

    Context ctx;
    RectF topPartitionRect, botPartitionRect;
    RectF topBandAidRect, botBandAidRect;
    Paint bgTopPaint, bgBotPaint;

    int defaultCornerRadius;
    float material30sdp;

    public PartialTintedRoundedRectLinearLayout(Context c) {
        super(c);
        init(c);
    }

    public PartialTintedRoundedRectLinearLayout(Context c, AttributeSet a) {
        super(c, a);
        init(c);
    }

    public PartialTintedRoundedRectLinearLayout(Context c, AttributeSet a, int dsAttr) {
        super(c, a, dsAttr);
        init(c);
    }

    private void init(Context c) {
        setWillNotDraw(false);
        ctx = c;
        defaultCornerRadius = (int)(20 * ctx.getResources().getDisplayMetrics().density);
        material30sdp = ctx.getResources().getDimension(R.dimen._30sdp);
        bgTopPaint = new Paint(); bgTopPaint.setColor(ContextCompat.getColor(ctx, R.color.blue_700));
        bgBotPaint = new Paint(); bgBotPaint.setColor(ContextCompat.getColor(ctx, R.color.blue_500));
        getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                topPartitionRect = new RectF(0, 0, getWidth(), material30sdp);
                topBandAidRect = new RectF(0, defaultCornerRadius, getWidth(), material30sdp);
                botPartitionRect = new RectF(0, material30sdp, getWidth(), getHeight());
                botBandAidRect = new RectF(0, material30sdp, getWidth(), getHeight() - defaultCornerRadius);
                invalidate();
                getViewTreeObserver().removeOnGlobalLayoutListener(this);
            }
        });
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.drawRoundRect(topPartitionRect, defaultCornerRadius, defaultCornerRadius, bgTopPaint);
        canvas.drawRoundRect(botPartitionRect, defaultCornerRadius, defaultCornerRadius, bgBotPaint);
        canvas.drawRect(topBandAidRect, bgTopPaint);
        canvas.drawRect(botBandAidRect, bgBotPaint);
    }
}

Мне нужно выяснить, как сделать его более общим, поскольку это было сделано для одного конкретного варианта использования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...