2016-04-20 5 views
4

Ich brauche ein Muster zu erstellen, die als Hintergrund in einem gewissen Blick zu setzen, und was das Muster i brauchen so etwas wie folgt aus:Android - Drawable wiederholen Form zu erstellen Muster

pattern

ich nicht Ich möchte jedes Bild importieren, aber ich möchte meine eigenen Formen, Ebenenlisten und das ultimative Zielmuster als Hintergrund erstellen.

Ist es möglich, dies zu erreichen, ohne ein externes Bild importieren zu müssen?

+0

Mögliches Duplikat [Android: wie ein Hintergrund von Mustern erstellen] (http://stackoverflow.com/questions/1700099/android-how-to-create-a-background-from-pattern) – 0X0nosugar

+0

Diese Lösung, die Sie vorschlagen, verwendet und externes Bild. Ich möchte meine jetzt Rechtecke erstellen, wie Sie sie zusammen verwenden, um ein Muster zu erstellen. – Bugdr0id

+0

Die andere Lösung benötigt einen Zeichensatz, ich denke, Sie können Ihren eigenen Zeichensatz (z. B. eine Layer-Liste, die mit einem kleinen Rechteck pro Layer gezeichnet werden kann) aus XML erstellen und dann mit der oben genannten Lösung fortfahren. IMO das größere Problem war, das Muster zu wiederholen. – 0X0nosugar

Antwort

5

Sie können ein Muster von sich wiederholenden Kacheln basierend auf Form-Zeichenvorlagen erstellen, indem Sie eine benutzerdefinierte View erstellen und onDraw() überschreiben.

Start Lassen Sie sich durch die Fliese als Schicht Liste erstellen Form Drawables gemacht, in diesem Fall Quadrate von Schwarz und Weiß im Wechsel:

my_background.xml

<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
<item> 
    <layer-list> 
     <item > 
      <shape > 
       <solid android:color="#ffffff"/> 
       <size 
        android:height="8dp" 
        android:width="8dp" 
        /> 
      </shape> 
     </item> 
     <item android:left="4dp" android:top="4dp" android:bottom="0dp" android:right="0dp" > 
      <shape > 
       <solid android:color="#ff000000"/> 
       <size 
        android:height="4dp" 
        android:width="4dp" 
        /> 

      </shape> 
     </item> 
     <item android:left="0dp" android:top="0dp" android:bottom="4dp" android:right="4dp"> 
      <shape> 
       <solid android:color="#ff000000"/> 
       <size 
        android:height="4dp" 
        android:width="4dp" 
        /> 
      </shape> 
     </item> 
    </layer-list> 
</item> 

Sie brauche eine Methode drawableToBitmap(), um die Kachel in eine Bitmap wie here umzuwandeln.

Aufschalten onDraw():

@Override 
protected void onDraw(Canvas canvas) 
{ 
    super.onDraw(canvas); 
    Drawable d = getResources().getDrawable(R.drawable.my_background); 
    if (d != null) 
    { 
     Bitmap b = drawableToBitmap(d); 
     BitmapDrawable bm = new BitmapDrawable(getResources(), b); 
     bm.setTileModeXY(Shader.TileMode.REPEAT, Shader.TileMode.REPEAT); 

     bm.setBounds(canvas.getClipBounds()); 
     bm.draw(canvas); 
    } 
} 

nach Art der View Je, können Sie zusätzliche Schritte unternehmen müssen.

  • Für eine individuelle View eine Art von Layout, setzen Sie das android:background Attribut auf eine beliebige Farbe erstreckt, um den Anruf zu onDraw()
  • Für viele View auslösen s kann es einfacher sein, besser zu implementieren und zugleich für die Leistung, um Ihre benutzerdefinierte View unter der anderen View (z. B. als zwei Kinder in einem RelativeLayout) positionieren und die Größen übereinstimmen.
  • Wenn Sie von ImageView erweitern möchten, müssen Sie den Vordergrund drawable über das Hintergrundmuster zeichnen. In diesem Fall können Sie onDraw() wie folgt ändern:

OnDraw() Erhaltung Vordergrund ziehbar:

@Override 
protected void onDraw(Canvas canvas) 
{ 
    super.onDraw(canvas); 

    // preserve foreground drawable if there is one: 
    Drawable fd = getDrawable(); 

    Drawable d = getResources().getDrawable(R.drawable.my_background); 
    if (d != null) 
    { 
     Bitmap b = drawableToBitmap(d); 
     BitmapDrawable bm = new BitmapDrawable(getResources(), b); 
     bm.setTileModeXY(Shader.TileMode.REPEAT, Shader.TileMode.REPEAT); 

     bm.setBounds(canvas.getClipBounds()); 
     bm.draw(canvas); 
    } 

    if (fd == null) 
     return; 

    // set bounds as needed 
    fd.setBounds(0, 0, 100, 100); 
    fd.draw(canvas); 
} 

EDIT

Wie oben erwähnt, in einigen Fällen (zB TextView , ProgressBar) möchten Sie möglicherweise eine Problemumgehung verwenden:

  • Machen Sie Ihren View Hintergrund transparent.
  • Erstellen Sie ein benutzerdefiniertes Layout mit dem Muster als Hintergrund.
  • Wickeln Sie die View in das benutzerdefinierte Layout (legen Sie die Breite und Höhe des Layouts auf wrap_content).
+0

große Antwort! Noch eine Frage. Ich versuche, diesen benutzerdefinierten Hintergrund als Fortschrittsbalken festzulegen. Ich kann den Vordergrund nicht bewahren, so dass ich den Fortschritt nicht sehen kann, nur den Hintergrund selbst. Können Sie mir einen Hinweis auf die Methode onDraw() geben? – Bugdr0id

+0

Ich habe eine neue Frage erstellt, die sich auf den nächsten Schritt meiner Frage bezieht. Bitte überprüfen Sie http://StackOverflow.com/questions/36765444/android-progressbar-with-custom-background-foreground – Bugdr0id

+1

@ Bugdr0id - das ist einer der Fälle, in denen ich denke, es ist tatsächlich einfacher, eine Workaround zu verwenden. Sie könnten beispielsweise das Hintergrundmuster mit einem FrameLayout oder RelativeLayout (Breite und Höhe, die der ProgressBar-Größe entspricht) verwenden und dann Ihre Fortschrittsleiste (mit einem transparenten Hintergrund) als einziges untergeordnetes Element dieses Layouts platzieren. – 0X0nosugar