Android'de Görünüm için Opaklık (Alfa) Ayarlama


211

Aşağıdaki gibi bir düğme var:

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

Benim onCreate()olayımda, böyle Button01 çağırıyorum:

setContentView(R.layout.main);

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

Uygulamada bir arka plan var ve bu gönderme düğmesine bir opaklık ayarlamak istiyorum. Bu görünüm için nasıl opaklık ayarlayabilirim? Java tarafında ayarlayabileceğim bir şey mi yoksa main.xml dosyasında ayarlayabilir miyim?

Java tarafında denedim Button01.mutate().SetAlpha(100), ama bana bir hata verdi.

Yanıtlar:


64

Sorunuzu bir TextView ile benzer bir sorun yaşarken buldum. TextView'i genişleterek ve geçersiz kılma yoluyla çözebildim onSetAlpha. Belki düğmenizle benzer bir şey deneyebilirsiniz:

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
Teşekkürler, bu da bana yardımcı oldu. Ancak, TextView ve ImageView'un alfa ayarlamak için farklı yolları olması çok saçma.
Geraldo Nascimento

Bu da ikinci kaynak olmadan resim görünümünde tıklama efekti uygulamak için bana yardımcı oldu. Thanx !!
skygeek

568

Herkesin çok daha karmaşık cevapları beni şaşırttı .

XML

Alfa'yı xml'nizdeki düğmenin (veya başka bir görünümün) renk tanımında çok basit bir şekilde tanımlayabilirsiniz:

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

Yukarıdaki örnekte, renk kısmen şeffaf bir kırmızı olacaktır.

Bir görünümün rengini tanımlarken, biçim ya #RRGGBBda onaltılık alfa değeri #AARRGGBBnerede olabilir AA. FFtamamen opak ve 00tam şeffaf olurdu.

Dinamik

Kodunuzdaki opaklığı dinamik olarak değiştirmeniz gerekirse,

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

INT'nin 0(tamamen şeffaf) ile 255(tamamen opak) arasında olduğu yerlerde.


18
Çekilebilir bir bileşik varsa bu hala çözüm değildir
Michał K

6
Yarı saydam yeşil renk rengini ayarlayın: <RelativeLayout android: background = "# 8700FF00" />
Jonny

2
Görünümün android:colorözelliği yok.
Ronnie

6
@moshersan Android'de renk ayarlayabilirsiniz: background özelliğinin kendisi!
Dheeraj Bhaskar

1
Bu yanlış backgroundopaklık opaklık değil view. Birçok kullanım durumunda eşdeğer değil
Jocky Doe

215

Sanırım cevabı zaten bulmuş olabilirsiniz, ancak değilse (ve diğer geliştiriciler için), bunu şu şekilde yapabilirsiniz:

btnMybutton.getBackground().setAlpha(45);

Burada opaklığı 45'e ayarladım. Temel olarak 0 (tamamen şeffaf) ile 255 (tamamen opak) arasında bir şeyden ayarlayabilirsiniz.



8
@Graeme, View sınıfındaki setAlpha yöntemine bağladınız, ancak yazı Drawable sınıfındaki setAlpha'yı kullanıyor. GetBackground yöntemi bir Drawable döndürür. Bu yöntem API Seviye 1'den alınmıştır. Developer.android.com/reference/android/graphics/drawable/…
Geekygecko

Oh ilginç! Bunu görmedim. Bu, arka plan saydam olarak ayarlanmış olsa bile metnin tamamen görünür olduğu anlamına gelir mi?
Graeme

-1 Bu benim arka plan çizilebilir benim bir seçici olduğu benim durumumda çalışmıyor.
Mike S

3
Bu harika çalışıyor ama bir yan etkisi ile: ben aynı arka plan paylaşımı birçok düğme var ve hepsi şeffaf olur! :(
Mark

66

Ne önerirsiniz , colors.xml dosyasında gibi özel bir ARGB rengi oluşturmaktır :

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

ardından düğme arka planınızı bu renge ayarlayın:

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

Düğmenin şekli ile oynamak istiyorsanız yapabileceğiniz başka bir şey , düğmenin nasıl olması gerektiğini belirlediğiniz özellikleri ayarlayabileceğiniz bir Şekil çekilebilir kaynak oluşturmaktır :

dosya: res / drawable / rounded_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>

Sonra bunu düğme arka planı olarak kullanın:

    android:background="@drawable/rounded_corner_box"

6
Eğer% 40
opaklıktan

54

Android belgelerine göre alfa 0 ve 1 arasında bir değerdir. Yani ayarlamak için böyle bir şey kullanın:

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

Tüm görünüm için benim için işe yarayan şey buydu ... Birden fazla metin görünümü olan liste görünümü öğesini denedim. bu tek satır alfa görünümüne ve çocuklarına yardımcı oldu. Teşekkürler @ cange1
Alyas

Benim için de işe yarayan tek şey. Biliyorum bu eski, ama teşekkürler @ cange1
masoftheund

50

Yukarıdakilerden çok daha kolay. Düğme için varsayılan alfa özelliği var

android:alpha="0.5"

Aralık, tam şeffaflık için 0 ile tam opaklık için 1 arasındadır.


Bu tam olarak aradığım şey, harika, api 21'de test edildi
Fernando Torres

Mükemmel cevap!!
Harry.

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

Yukarıda bildiğim bir şey var ... Sanırım özel bir düğme sınıfı oluşturmak en iyi fikir

API Seviye 11
Son zamanlarda 0 ve 1 arasında bir değer alan bu android: alpha xml özniteliğiyle karşılaştım. İlgili yöntem setAlpha (float) .


Merhaba Josnidhin. Cevabın için teşekkürler. Ancak tüm düğmeyi tamamen şeffaf hale getirir. Ne aradığım bazı opaklık (belki de alfa değeri aracılığıyla) düğmeye koyuyor.
ncakmak

Bu bir kayan noktadır, bu nedenle örneğin 0 ve 1, 0,5 arasındaki değerleri kullanabilirsiniz.
StackOverflowed

@StackOverflowed - ncakmak'ın ilk çözüm anlamına geldiğine inanıyorum. @android:color/transparentArkaplan olarak ayarlamak görünümü gerçekten şeffaf hale getirecektir. @android:alpha- kısım Zeyilname gibi görünüyor.
katzenhut

17

btnMybutton.getBackground().setAlpha(45);Güzel bir fikir olsa da, tüm görünüme değil, arka plana alfa uygular.

Bunu görüntülemek için alfa uygulamak istiyorsanız btnMybutton.setAlpha(0.30f);kullanın. Bu, Görünüme opaklık uygular. 0 ile 1 arasında bir değer kabul eder.

Doc diyor ki:

Görünümün opaklığını ayarlar. Bu, 0 ile 1 arasında bir değerdir; burada 0, görünümün tamamen saydam olduğu ve 1, görünümün tamamen opak olduğu anlamına gelir. Bu görünüm, true döndürmek için onSetAlpha (int) değerini geçersiz kılarsa, bu görünüm opaklığın kendisinin uygulanmasından sorumludur. Aksi takdirde, bu yöntemin çağrılması setLayerType (int, android.graphics.Paint) öğesinin çağrılmasına ve bir donanım katmanının ayarlanmasına eşdeğerdir. Alfa'nın yarı saydam bir değere (0 <alfa <1) ayarlanmasının performans sonuçları olabileceğini unutmayın. Genellikle, solma animasyonlarında olduğu gibi alfa özelliğini idareli ve geçici olarak kullanmak en iyisidir.


7

Holo temasının varsayılan düğmeleri biraz şeffaf görüntülerden oluştuğu için ICS / JB ile bu problemle karşılaştım. Bir arka plan için bu özellikle dikkat çekicidir.

Gingerbread vs. ICS +:

zencefilli çörek ICS

Her çözünürlük için tüm çekilebilir durumların ve görüntülerin üzerine kopyalamak ve saydam görüntüleri sağlamlaştırmak bir acıdır, bu yüzden daha kirli bir çözüm seçtim: düğmeyi beyaz bir arka plana sahip bir tutucuya sarın. İşte tam olarak bunu yapan kaba bir XML çekilebilir (ButtonHolder):

XML dosyanız

<?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>
.
.
.

Ancak, Holo düğmesi görüntüleri basılan alanı hesaba katmak için kenar boşlukları içerdiğinden, bu beyaz bir kenarlıkla sonuçlanır:

Çok fazla beyaz Çok fazla beyaz preslenmiş

Bu nedenle çözüm, beyaz arka plana bir kenar boşluğu (benim için 4dp çalıştı) ve beyazı tamamen gizlemek için düğmeyi yuvarlamak (2dp) ve düğmeyi sağlam hale getirmektir:

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>

Nihai sonuç şöyle:

Beyaz yok Beyaz preslenmedi

Bu stili v14 + için hedeflemeli ve Gingerbread / Honeycomb için ince ayar yapmalı veya hariç tutmalısınız çünkü yerel düğme görüntü boyutları ICS ve JB'lerden farklıdır (örneğin, Gingerbread düğmesinin arkasındaki bu tam stil düğmenin altında küçük bir beyazla sonuçlanır).


7

Bir görünüm için opaklığı aşağıdakilerle ayarlayabilirsiniz.

view_name.setAlpha(float_value);

Özellik view.setAlpha(int)11'den büyük API sürümü için kullanımdan kaldırılmıştır. Bundan böyle, benzer .setAlpha(0.5f)özellik kullanılır.


6

TextView rengi için API <11 için aşağıdakileri yaptım:

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

Biraz hantal, ama hey, işe yarıyor :-)


1

Bunun zaten bir sürü cevabı olduğunu biliyorum, ancak düğmeler için kendi .xml seçicilerinizi oluşturmanın ve bunu söz konusu düğmenin arka planına ayarlamanın en kolay yol olduğunu buldum. Bu şekilde, basıldığında veya etkinleştirildiğinde durumunu da değiştirebilirsiniz. İşte kullandığım bir hızlı snippet. Renklerden birine saydamlık eklemek istiyorsanız, önde gelen onaltılı bir değer (#XXcccccc) ekleyin. (XX == "renkli alfa")

<?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>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.