2016-03-17 3 views
10

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

с растровыми изображениями следующего 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

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

+2

не сразу, но вы может 'draw()' ваш 'VectorDrawable' несколько раз – pskink

+0

Поскольку векторные изображения масштабируемы, вам придется дополнительно указать ширину/высоту перед повторением. Также повторение вручную (просто отображение их несколько раз), безусловно, является опцией. – Trilarion

ответ

6

Благодаря @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); 
     } 
    } 
} 
Смежные вопросы