So stellen Sie die Deckkraft (Alpha) für die Ansicht in Android ein


211

Ich habe eine Schaltfläche wie folgt:

<Button 
     android:text="Submit" 
     android:id="@+id/Button01" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content">
</Button>

In meinem onCreate()Fall rufe ich Button01 folgendermaßen auf:

setContentView(R.layout.main);

View Button01 = this.findViewById(R.id.Button01);
Button01.setOnClickListener(this);

Die Anwendung enthält einen Hintergrund, und ich möchte für diese Schaltfläche zum Senden eine Deckkraft festlegen. Wie kann ich eine Deckkraft für diese Ansicht festlegen? Ist es etwas, das ich auf der Java-Seite festlegen kann, oder kann ich es in der Datei main.xml festlegen?

Auf der Java-Seite habe ich es versucht Button01.mutate().SetAlpha(100), aber es gab mir einen Fehler.

Antworten:


64

Ich habe gerade Ihre Frage gefunden, als ich ein ähnliches Problem mit einer Textansicht hatte. Ich konnte es lösen, indem ich TextView erweiterte und überschrieb onSetAlpha. Vielleicht könnten Sie mit Ihrem Button etwas Ähnliches ausprobieren:

import android.content.Context;
import android.util.AttributeSet;
import android.widget.TextView;

public class AlphaTextView extends TextView {

  public AlphaTextView(Context context) {
    super(context);
  }

  public AlphaTextView(Context context, AttributeSet attrs) {
    super(context, attrs);
  }

  public AlphaTextView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
  }

  @Override
  public boolean onSetAlpha(int alpha) {
    setTextColor(getTextColors().withAlpha(alpha));
    setHintTextColor(getHintTextColors().withAlpha(alpha));
    setLinkTextColor(getLinkTextColors().withAlpha(alpha));
    return true;
  }
}

12
Danke, das hat mir auch geholfen. Es ist jedoch lächerlich, dass eine Textansicht und eine Bildansicht unterschiedliche Möglichkeiten haben, Alpha festzulegen.
Geraldo Nascimento

Dies hat mir auch geholfen, den Klickeffekt auf die Bildansicht ohne zweite Ressource anzuwenden. Danke !!
Skygeek

568

Ich bin erstaunt über die VIEL komplizierteren Antworten aller anderen .

XML

Sie können das Alpha ganz einfach in der Farbdefinition der Schaltfläche (oder einer anderen Ansicht) in Ihrer XML definieren:

android:color="#66FF0000"    // Partially transparent red

Im obigen Beispiel wäre die Farbe ein teilweise transparentes Rot.

Bei der Definition der Farbe einer Ansicht kann das Format entweder #RRGGBBoder sein #AARRGGBB, wobei AAder hexadezimale Alpha-Wert ist. FFwäre völlig undurchsichtig und 00wäre völlig transparent.

Dynamisch

Wenn Sie die Deckkraft in Ihrem Code dynamisch ändern müssen, verwenden Sie

myButton.getBackground().setAlpha(128);  // 50% transparent

Wobei die INT von 0(vollständig transparent) bis 255(vollständig undurchsichtig) reicht.


18
Dies ist immer noch nicht die Lösung, wenn Sie eine Verbindung zeichnen können
Michał K

6
Stellen Sie die halbtransparente grüne Farbe der Ansicht ein: <RelativeLayout android: background = "# 8700FF00" />
Jonny

2
Ansicht hat kein android:colorAttribut.
Ronnie

6
@moshersan Sie können die Farbe in der android: background Eigenschaft selbst einstellen!
Dheeraj Bhaskar

1
Das ist eine falsche backgroundDeckkraft, keine viewDeckkraft. In vielen Anwendungsfällen nicht gleichwertig
Jocky Doe

214

Ich denke, Sie haben die Antwort möglicherweise bereits gefunden, aber wenn nicht (und für andere Entwickler), können Sie dies folgendermaßen tun:

btnMybutton.getBackground().setAlpha(45);

Hier habe ich die Deckkraft auf 45 eingestellt. Sie können sie grundsätzlich von 0 (vollständig transparent) bis 255 (vollständig undurchsichtig) einstellen.


5
Dies ist nur auf API 11+ verfügbar. Developer.android.com/reference/android/view/…
Graeme

8
@Graeme Sie haben eine Verknüpfung mit der setAlpha-Methode in der View-Klasse hergestellt, aber der Beitrag verwendet setAlpha in der Drawable-Klasse. Die Methode getBackground gibt ein Drawable zurück. Diese Methode stammt von API Level 1. developer.android.com/reference/android/graphics/drawable/…
Geekygecko

Oh, interessant! Das habe ich nicht gesehen. Würde dies bedeuten, dass der Text auch dann vollständig sichtbar war, wenn der Hintergrund auf transparent eingestellt war?
Graeme

-1 Dies funktioniert in meinem Fall nicht, wenn mein Hintergrund, der gezeichnet werden kann, ein Selektor ist.
Mike S

3
Das funktioniert großartig, aber mit einem Nebeneffekt: Ich habe viele Schaltflächen mit demselben Hintergrund und sie werden alle transparent! :(
Mark

66

Ich würde vorschlagen, dass Sie eine benutzerdefinierte ARGB-Farbe in Ihrer Datei colours.xml erstellen, z.

<resources>
<color name="translucent_black">#80000000</color>
</resources>

Stellen Sie dann den Hintergrund Ihrer Schaltfläche auf diese Farbe ein:

android:background="@android:color/translucent_black"

Wenn Sie mit der Form der Schaltfläche herumspielen möchten, können Sie auch eine Form-Zeichenressource erstellen, in der Sie die Eigenschaften festlegen, wie die Schaltfläche aussehen soll:

Datei: res / drawable / round_corner_box.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <gradient
        android:startColor="#80000000"
        android:endColor="#80FFFFFF"
        android:angle="45"/>
    <padding android:left="7dp"
        android:top="7dp"
        android:right="7dp"
        android:bottom="7dp" />
    <corners android:radius="8dp" />
</shape>

Verwenden Sie dies dann als Hintergrund für die Schaltfläche:

    android:background="@drawable/rounded_corner_box"

6
Wenn Sie Schwierigkeiten haben, von 40% Deckkraft auf einen Hex-Wert zu verbergen, können Sie die Google-Suche verwenden. "40% von 255 auf Hex" gibt den Hex-Wert für 40% an
Scottyab

54

Laut der Android-Dokumentansicht ist Alpha ein Wert zwischen 0 und 1. Verwenden Sie zum Einstellen etwa Folgendes:

View v;
v.setAlpha(.5f);

Das hat bei mir nur für die gesamte Ansicht funktioniert ... Ich habe ein Listenansichtselement ausprobiert, das auch mehrere Textansichten enthält. Diese einzelne Zeile half dabei, Alpha und seine untergeordneten Elemente anzuzeigen. Danke @ cange1
Alyas

Das einzige, was auch bei mir funktioniert hat. Ich weiß, dass dies alt ist, aber danke @ cange1
masoftheund

50

Viel einfacher von oben. Das Standard-Alpha-Attribut ist für die Schaltfläche vorhanden

android:alpha="0.5"

Der Bereich liegt zwischen 0 für vollständige Transparenz und 1 für vollständige Deckkraft.


Dies ist genau das, wonach ich gesucht habe, fantastisch, getestet auf API 21
Fernando Torres

Perfekte Antwort!!
Harry .Naeem

18
android:background="@android:color/transparent"

Das Obige ist etwas, das ich weiß ... Ich denke, das Erstellen einer benutzerdefinierten Schaltflächenklasse ist die beste Idee

API Level 11
Vor kurzem bin ich auf dieses Android: Alpha XML-Attribut gestoßen, das einen Wert zwischen 0 und 1 annimmt . Die entsprechende Methode ist setAlpha (float) .


Hallo Josnidhin. Danke für Ihre Antwort. Aber es macht den ganzen Knopf völlig transparent. Was ich suche, ist etwas Deckkraft (möglicherweise über Alpha-Wert) auf die Schaltfläche zu setzen.
Ncakmak

Es ist ein Float, also können Sie beispielsweise die Werte ZWISCHEN 0 und 1, 0,5 verwenden.
StackOverflowed

@StackOverflowed - Ich glaube, ncakmak bedeutete die erste Lösung. Durch die Einstellung @android:color/transparentals Hintergrund wird die Ansicht tatsächlich vollständig transparent. Der @android:alpha- Teil scheint ein Nachtrag zu sein.
Katzenhut

17

Obwohl dies btnMybutton.getBackground().setAlpha(45);eine gute Idee ist, wird Alpha nur auf den Hintergrund und nicht auf die gesamte Ansicht angewendet.

Wenn Sie Alpha zum Anzeigen anwenden möchten, verwenden Sie btnMybutton.setAlpha(0.30f);stattdessen. Dadurch wird die Deckkraft auf die Ansicht angewendet. Es akzeptiert einen Wert zwischen 0 und 1.

Doc sagt:

Legt die Deckkraft der Ansicht fest. Dies ist ein Wert von 0 bis 1, wobei 0 bedeutet, dass die Ansicht vollständig transparent ist und 1 bedeutet, dass die Ansicht vollständig undurchsichtig ist. Wenn diese Ansicht onSetAlpha (int) überschreibt, um true zurückzugeben, ist diese Ansicht für das Anwenden der Deckkraft selbst verantwortlich. Andernfalls entspricht das Aufrufen dieser Methode dem Aufrufen von setLayerType (int, android.graphics.Paint) und dem Festlegen einer Hardwareschicht. Beachten Sie, dass das Setzen von Alpha auf einen durchscheinenden Wert (0 <Alpha <1) Auswirkungen auf die Leistung haben kann. Im Allgemeinen ist es am besten, die Alpha-Eigenschaft sparsam und vorübergehend zu verwenden, wie im Fall von verblassenden Animationen.


7

Ich bin auf dieses Problem mit ICS / JB gestoßen, weil die Standardschaltflächen für das Holo-Thema aus Bildern bestehen, die leicht transparent sind. Für den Hintergrund fällt dies besonders auf.

Lebkuchen vs. ICS +:

Lebkuchen ICS

Das Kopieren aller zeichnbaren Zustände und Bilder für jede Auflösung und das Festhalten der transparenten Bilder ist mühsam. Daher habe ich mich für eine schmutzigere Lösung entschieden: Wickeln Sie den Knopf in eine Halterung mit weißem Hintergrund. Hier ist ein grobes XML-Zeichenobjekt (ButtonHolder), das genau das tut:

Ihre XML-Datei

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              style="@style/Content">
  <RelativeLayout style="@style/ButtonHolder">
      <Button android:id="@+id/myButton"
              style="@style/Button"
              android:text="@string/proceed"/>
    </RelativeLayout>
</LinearLayout>

ButtonHolder.xml

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
  <item>
    <shape android:shape="rectangle">
      <solid android:color="@color/white"/>
    </shape>
  </item>

</layer-list>

styles.xml

.
.
.      
  <style name="ButtonHolder">
    <item name="android:layout_height">wrap_content</item>
    <item name="android:layout_width">wrap_content</item>
    <item name="android:background">@drawable/buttonholder</item>
  </style>

  <style name="Button" parent="@android:style/Widget.Button">
    <item name="android:layout_height">wrap_content</item>
    <item name="android:layout_width">wrap_content</item>
    <item name="android:textStyle">bold</item>
  </style>
.
.
.

Dies führt jedoch zu einem weißen Rand, da die Bilder der Holo-Schaltfläche Ränder enthalten, um den gedrückten Raum zu berücksichtigen:

Zu viel Weiß Zu viel Weiß gedrückt

Die Lösung besteht also darin, dem weißen Hintergrund einen Rand (4 dp hat bei mir funktioniert) und abgerundete Ecken (2 dp) zu geben, um das Weiß vollständig auszublenden und die Schaltfläche dennoch solide zu machen:

ButtonHolder.xml

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">

  <item>
    <shape android:shape="rectangle">
      <solid android:color="@android:color/transparent"/>
    </shape>
  </item>

  <item android:top="4dp" android:bottom="4dp" android:left="4dp" android:right="4dp">
    <shape android:shape="rectangle">
      <solid android:color="@color/white"/>
      <corners android:radius="2dp" />
    </shape>
  </item>

</layer-list>

Das Endergebnis sieht folgendermaßen aus:

Kein Weiß Kein Weiß gedrückt

Sie sollten diesen Stil für Version 14 + verwenden und ihn für Lebkuchen / Waben optimieren oder ausschließen, da sich die nativen Bildgrößen der Schaltflächen von denen von ICS und JB unterscheiden (z. B. führt dieser genaue Stil hinter einer Lebkuchenschaltfläche zu einem kleinen Weißanteil unter der Schaltfläche).


7

Für eine Ansicht können Sie die Deckkraft wie folgt einstellen.

view_name.setAlpha(float_value);

Die Eigenschaft view.setAlpha(int)ist für die API-Version größer als 11 veraltet. Von nun an wird Eigenschaft wie .setAlpha(0.5f)verwendet.


6

Für API <11 für textView color habe ich Folgendes getan:

int textViewColor = textView.getTextColors().getDefaultColor(); 
textView.setTextColor(Color.argb(128, Color.red(textViewColor), Color.green(textViewColor), Color.blue(textViewColor))); //50% transparent

Ein bisschen umständlich, aber hey, es funktioniert :-)


1

Ich weiß, dass dies bereits eine Reihe von Antworten enthält, aber ich habe festgestellt, dass es für Schaltflächen am einfachsten ist, eigene XML-Selektoren zu erstellen und diese auf den Hintergrund dieser Schaltfläche zu setzen. Auf diese Weise können Sie den Status auch ändern, wenn Sie ihn drücken oder aktivieren usw. Hier ist ein kurzer Ausschnitt von einem, den ich benutze. Wenn Sie einer der Farben Transparenz hinzufügen möchten, fügen Sie einen führenden Hex-Wert (#XXcccccc) hinzu. (XX == "Alpha der Farbe")

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" >
        <shape>
            <solid
                android:color="#70c656" />
            <stroke
                android:width="1dp"
                android:color="#53933f" />
            <corners
                android:radius="4dp" />
            <padding
                android:left="10dp"
                android:top="10dp"
                android:right="10dp"
                android:bottom="10dp" />
        </shape>
    </item>
    <item>
        <shape>
            <gradient
                android:startColor="#70c656"
                android:endColor="#53933f"
                android:angle="270" />
            <stroke
                android:width="1dp"
                android:color="#53933f" />
            <corners
                android:radius="4dp" />
            <padding
                android:left="10dp"
                android:top="10dp"
                android:right="10dp"
                android:bottom="10dp" />
        </shape>
    </item>
</selector>
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.