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