1

In meiner Anwendung muss ich die Hintergrundfarbe einer Schaltfläche als Reaktion auf bestimmte Ereignisse ändern. Das funktioniert gut, indem eine ziehbar zu schaffen, das Setzen von seiner Farbe und die Verwendung dieser ziehbar wie die Schaltfläche Hintergrund:Wie kann ich eine Alpha-Maske auf ein Android-Zeichen anwenden?

ShapeDrawable drawable = new ShapeDrawable(roundRectShape); 
    drawable.getPaint().setColor(color); 
    b.setBackground(drawable); 

Nun, ich mag eine Alpha-Maske auf diesen ziehbar zu überlagern, einen „gestreiften“ Knopf zu schaffen. Hier ist, wie es aus wie für eine blaue und eine schwarze Taste aussehen sollte (vorausgesetzt, Weiß als Hintergrundfarbe, aber diese Abschnitte sollten wirklich 100% transparent sein):

enter image description here

Ich habe diese Alpha-Maske in Inkscape und erfolgreich als Vektor-Asset importiert. Ich muss es vielleicht in eine Bitmap umwandeln, aber ich bin mir nicht sicher.

Ich habe eine Reihe von Artikeln und SO-Fragen gelesen, die PorterDuff-Matrizen erwähnen, die ich anwenden konnte, aber ich konnte sie nicht in mein aktuelles Problem übersetzen.

Wer weiß, wie man das macht?


Hier ist eine weitere Visualisierung, die die Dinge hoffentlich klarer macht. Die Hintergrundfarbe von der übergeordneten Ansicht des Knopfes ist blassrosa hier, und die Knopfleiste ist rot umrandet (aber eigentlich sollte im Endprodukt nicht sichtbar sein):

enter image description here

+0

ich nicht ganz Ihre Erklärung folgen. Können Sie zur besseren Übersichtlichkeit ein Bild einer Schaltfläche so erstellen, wie es auf einem Gerät aussehen würde? – Karakuri

+0

@Karakuri, ich habe ein weiteres Beispiel hinzugefügt, das den Rahmen der Schaltfläche umreißt und den Hintergrund nicht weiß macht. Kann das das gewünschte Ergebnis erklären? Es ist immer noch in Inkscape gespottet, da ich noch herausfinden muss, wie man das in Android macht :) – Alice

+0

Nur ein Gedanke, aber es könnte einfacher sein, eine eigene View-Unterklasse zu erstellen, die eine Farbe annimmt und die 6 Balken selbst mit zeichnet ein 'Paint'-Objekt.Ein schmutziges kleines Geheimnis über Android Views: Jede Ansicht kann anklickbar gemacht werden (so dass du eigentlich keinen 'Button' benötigst ... außer du willst den Text auch dort, dann brauchst du vielleicht einen' Button'). – Karakuri

Antwort

0

Also, habe ich herausgefunden, wie dies zu tun, wenn auch nicht ein SVG - zu viele Probleme gibt.

Zuerst habe ich von Button zu ImageButton gewechselt. Dann habe ich für die folgende Art:

<style name="stripedButton"> 
    <item name="android:layout_gravity">left</item> 
    <item name="android:layout_height">match_parent</item> 
    <item name="android:stateListAnimator">@null</item> 
    <item name="android:clickable">true</item> 
    <item name="android:elevation">0dp</item> 
    <item name="android:longClickable">true</item> 
    <item name="layout_widthPercent">70%</item> 
    <item name="android:src">@drawable/fade_in_bars</item> 
    <item name="android:tint">@color/RED</item> 
    <item name="android:background">@null</item> 
    <!-- Stretch image to fill entire button. --> 
    <item name="android:scaleType">fitXY</item> 
</style> 

fade_in_bars ist nur die png-Version der Alpha-Maske in der ursprünglichen Frage gezeigt. Die Farbe kann in XML oder programmgesteuert mithilfe des Attributs tint festgelegt werden. Ich verstehe nicht ganz, warum ich den Hintergrund auf Null setzen muss, aber ansonsten sieht es komisch aus. Schließlich wird die Einstellung scaleType auf fitXY benötigt, damit alle Streifen angezeigt werden, unabhängig von der Größe der Schaltfläche auf einem bestimmten Bildschirm.

Hier ist, wie es aussieht:

enter image description here

1

// Dies wird helfen.

ImageView img = (ImageView) findViewById(R.drawable.yourimage); 

img.setAlpha(100); 

// Transparent ist zwischen 0 und 255; // Wenn Sie Bitmap verwenden möchten

Bitmap b = BitmapFactory.decodeResources(getResources(), R.drawable.yourimage); 

img.setImageBitmap(b); 

img.setAlpha(100); 
+0

Danke Steven. Ich habe einen Weg gefunden, den gewünschten Effekt zu erzielen, habe gerade meine Antwort gepostet. Ich fürchte, ich konnte deinem Beispiel nicht ganz folgen. – Alice

+0

Es ist in Ordnung. Es gibt viele Möglichkeiten, dies zu tun. Also, greifen Sie den Code, der für Sie hilfreich ist. – Steven