2016-03-17 8 views
10

Mit der Support-Bibliothek, die nun vollständig Vektorbilder unterstützt, versuche ich, in meiner App so viel wie möglich zu Vektorbildern zu wechseln. Ein Problem, auf das ich gestoßen bin, ist, dass es unmöglich scheint, sie zu wiederholen.Wie können wir ein Vektorbild kacheln?

Mit Bitmap-Bildern die folgenden XML verwendet werden könnten:

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

Dies funktioniert nicht, als Vektor-Bilder nicht in Bitmaps verwendet werden können: https://code.google.com/p/android/issues/detail?id=187566

Gibt es eine andere Art und Weise zu Fliesen/Vektorbilder wiederholen?

+2

nicht direkt, aber Sie kann '' Drawable'' mehrfach zeichnen ( – pskink

+0

) Da Vektorbilder skalierbar sind, müssten Sie zusätzlich die Breite/Höhe vor dem Wiederholen angeben. Auch manuell zu wiederholen (nur mehrere Male anzeigen) ist sicherlich eine Option. – Trilarion

Antwort

6

Dank @pskink ich einen ziehbar gemacht, dass eine andere ziehbar Fliesen: https://gist.github.com/9ffbdf01478e36194f8f

Dieser im Code festgelegt werden, ist es nicht von XML verwendet werden können:

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); 
     } 
    } 
} 
Verwandte Themen