Подтвердить что ты не робот

Как мы можем нарисовать векторное изображение?

Когда библиотека поддержки теперь полностью поддерживает векторные изображения, я пытаюсь переключиться на векторные изображения столько, сколько смогу в своем приложении. Проблема, с которой я сталкиваюсь, заключается в невозможности повторить их.

С растровыми изображениями можно использовать следующий xml:

<bitmap
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:src="@drawable/repeat_me"
    android:tileMode="repeat"
    />

Это не работает, поскольку векторные изображения не могут использоваться в растровых изображениях: https://code.google.com/p/android/issues/detail?id=187566

Есть ли другой способ чередования/повторения векторных изображений?

4b9b3361

Ответ 1

Благодаря @pskink я сделал все возможное, чтобы плитки рисовали еще одно: https://gist.github.com/9ffbdf01478e36194f8f

Это должно быть установлено в коде, оно не может использоваться из XML:

public class TilingDrawable extends android.support.v7.graphics.drawable.DrawableWrapper {

    private boolean callbackEnabled = true;

    public TilingDrawable(Drawable drawable) {
        super(drawable);
    }

    @Override
    public void draw(Canvas canvas) {
        callbackEnabled = false;
        Rect bounds = getBounds();
        Drawable wrappedDrawable = getWrappedDrawable();

        int width = wrappedDrawable.getIntrinsicWidth();
        int height = wrappedDrawable.getIntrinsicHeight();
        for (int x = bounds.left; x < bounds.right + width - 1; x+= width) {
            for (int y = bounds.top; y < bounds.bottom + height - 1; y += height) {
                wrappedDrawable.setBounds(x, y, x + width, y + height);
                wrappedDrawable.draw(canvas);
            }
        }
        callbackEnabled = true;
    }

    @Override
    protected void onBoundsChange(Rect bounds) {
    }

    /**
     * {@inheritDoc}
     */
    public void invalidateDrawable(Drawable who) {
        if (callbackEnabled) {
            super.invalidateDrawable(who);
        }
    }

    /**
     * {@inheritDoc}
     */
    public void scheduleDrawable(Drawable who, Runnable what, long when) {
        if (callbackEnabled) {
            super.scheduleDrawable(who, what, when);
        }
    }

    /**
     * {@inheritDoc}
     */
    public void unscheduleDrawable(Drawable who, Runnable what) {
        if (callbackEnabled) {
            super.unscheduleDrawable(who, what);
        }
    }
}