Cara Mengatur Opacity (Alpha) untuk Lihat di Android

211

Saya memiliki tombol sebagai berikut:

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

Dalam onCreate()acara saya , saya memanggil Button01 seperti ini:

setContentView(R.layout.main);

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

Ada latar belakang dalam aplikasi, dan saya ingin mengatur opacity pada tombol kirim ini. Bagaimana saya bisa mengatur opacity untuk tampilan ini? Apakah ini sesuatu yang bisa saya atur di sisi java, atau dapatkah saya atur di file main.xml?

Di sisi java saya mencoba Button01.mutate().SetAlpha(100), tetapi memberi saya kesalahan.

ncakmak
sumber

Jawaban:

64

Saya baru saja menemukan pertanyaan Anda sementara memiliki masalah yang sama dengan TextView. Saya bisa menyelesaikannya, dengan memperluas TextView dan mengesampingkan onSetAlpha. Mungkin Anda bisa mencoba sesuatu yang mirip dengan tombol Anda:

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;
  }
}
RoToRa
sumber
12
Terima kasih, ini juga membantu saya. Namun konyol bahwa TextView dan ImageView memiliki cara berbeda untuk mengatur alpha.
Geraldo Nascimento
Ini membantu saya juga untuk menerapkan efek klik pada tampilan gambar tanpa sumber kedua. Terima kasih !!
skygeek
568

Saya kagum dengan JAUH orang lain jawaban yang lebih rumit .

XML

Anda dapat dengan mudah mendefinisikan alfa dalam definisi warna tombol (atau tampilan lainnya) di xml Anda:

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

Pada contoh di atas, warnanya akan menjadi merah sebagian transparan.

Saat mendefinisikan warna tampilan, formatnya bisa berupa #RRGGBBatau #AARRGGBB, di mana AAadalah nilai hex alpha. FFakan sepenuhnya buram dan 00akan transparan penuh.

Secara dinamis

Jika Anda perlu mengubah opacity secara dinamis dalam kode Anda, gunakan

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

Di mana INT berkisar dari 0(sepenuhnya transparan) hingga 255(sepenuhnya buram).

Jake Wilson
sumber
18
Ini masih bukan solusi jika Anda memiliki drawable drawable
Michał K
6
Tetapkan setengah warna hijau transparan tampilan: <RelativeLayout android: background = "# 8700FF00" />
Jonny
2
Lihat tidak memiliki android:coloratribut.
Ronnie
6
@moshersan Anda dapat mengatur warna di android: properti background itu sendiri!
Dheeraj Bhaskar
1
Itu backgroundopacity salah bukan viewopacity. Tidak setara dalam banyak kasus penggunaan
Jocky Doe
215

Saya kira Anda mungkin sudah menemukan jawabannya, tetapi jika tidak (dan untuk pengembang lain), Anda dapat melakukannya seperti ini:

btnMybutton.getBackground().setAlpha(45);

Di sini saya telah mengatur opacity menjadi 45. Pada dasarnya Anda dapat mengaturnya dari apa pun antara 0 (sepenuhnya transparan) hingga 255 (sepenuhnya buram)

abhi
sumber
5
Ini hanya tersedia di API 11+ developer.android.com/reference/android/view/…
Graeme
8
@Graeme Anda telah menautkan ke metode setAlpha pada kelas View, tetapi postingan tersebut menggunakan setAlpha pada kelas Drawable. Metode getBackground mengembalikan Drawable. Metode ini dari API Level 1. developer.android.com/reference/android/graphics/drawable/…
Geekygecko
Oh Menarik! Saya tidak melihat itu. Apakah ini berarti bahwa teks itu sepenuhnya terlihat bahkan jika latar belakang diatur ke transparan.
Graeme
-1 ini tidak berfungsi dalam kasus saya di mana latar belakang saya dapat ditarik adalah pemilih.
Mike S
3
ini berfungsi dengan baik tetapi dengan satu efek samping: saya memiliki banyak tombol yang berbagi latar belakang yang sama dan semuanya menjadi transparan! :(
Tandai
66

Apa yang saya sarankan Anda lakukan adalah membuat warna ARGB khusus di file colors.xml Anda seperti:

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

lalu atur latar belakang tombol Anda ke warna itu:

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

Hal lain yang dapat Anda lakukan jika ingin bermain-main dengan bentuk tombol adalah membuat sumber daya Bentuk yang dapat digambar mana Anda mengatur properti seperti apa bentuk tombol itu:

file: 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>

Kemudian gunakan itu sebagai latar belakang tombol:

    android:background="@drawable/rounded_corner_box"
Akos Cz
sumber
6
Jika Anda kesulitan untuk
menutup
54

Menurut android docs view alpha adalah nilai antara 0 dan 1. Jadi untuk mengaturnya gunakan sesuatu seperti ini:

View v;
v.setAlpha(.5f);
cange1
sumber
Itulah yang hanya berfungsi untuk saya untuk seluruh tampilan ... Saya telah mencoba pada item tampilan daftar, yang juga memiliki beberapa tampilan teks. baris tunggal ini membantu mengatur alpha pada tampilan dan anak-anaknya. Terima kasih @ cange1
Alyas
Satu-satunya hal yang berhasil untuk saya juga. Saya tahu ini sudah tua, tapi terima kasih @ cange1
masoftheund
50

Jauh lebih mudah dari yang di atas. Atribut alpha default ada untuk tombol

android:alpha="0.5"

Kisarannya antara 0 untuk transparan lengkap dan 1 untuk opacity lengkap.

Raja Jawahar
sumber
Ini persis apa yang saya cari, luar biasa, diuji pada api 21
Fernando Torres
Jawaban sempurna !!
Harry .Naeem
18
android:background="@android:color/transparent"

Di atas adalah sesuatu yang saya tahu ... Saya pikir membuat kelas tombol kustom adalah ide terbaik

API Level 11
Baru-baru ini saya menemukan atribut android: alpha xml yang mengambil nilai antara 0 dan 1. Metode yang sesuai adalah setAlpha (float) .

Josnidhin
sumber
Hai Josnidhin. Terimakasih atas balasan anda. Tetapi itu membuat seluruh tombol benar-benar transparan. Apa yang saya cari adalah meletakkan opacity (mungkin melalui nilai alpha) pada tombol.
ncakmak
Ini float, jadi Anda bisa menggunakan nilai ANTARA 0 dan 1, 0,5 misalnya.
StackOverflowed
@StackOverflowed - saya percaya ncakmak berarti solusi pertama. pengaturan @android:color/transparentsebagai Latar Belakang memang akan membuat tampilan sepenuhnya transparan. Bagian @android:alpha- tampaknya menjadi sebuah tambahan.
katzenhut
17

Meskipun btnMybutton.getBackground().setAlpha(45); ide yang bagus, itu hanya menerapkan alpha ke latar belakang dan bukan seluruh tampilan.

Jika Anda ingin menerapkan alfa untuk melihat gunakan btnMybutton.setAlpha(0.30f);saja. Ini berlaku opacity to View. Ini menerima nilai antara 0 dan 1.

Doc mengatakan:

Mengatur opacity tampilan. Ini adalah nilai dari 0 hingga 1, di mana 0 berarti tampilan sepenuhnya transparan dan 1 berarti tampilan sepenuhnya buram. Jika tampilan ini mengabaikan onSetAlpha (int) untuk mengembalikan true, maka tampilan ini bertanggung jawab untuk menerapkan opacity itu sendiri. Kalau tidak, memanggil metode ini setara dengan memanggil setLayerType (int, android.graphics.Paint) dan mengatur lapisan perangkat keras. Perhatikan bahwa pengaturan alpha ke nilai yang tembus cahaya (0 <alpha <1) dapat memiliki implikasi kinerja. Biasanya yang terbaik adalah menggunakan properti alfa dengan hemat dan sementara, seperti dalam kasus animasi memudar.

Hesam
sumber
7

Saya mengalami masalah dengan ICS / JB ini karena tombol default untuk tema Holo terdiri dari gambar yang sedikit transparan. Untuk latar belakang, ini terutama terlihat.

Roti jahe vs ICS +:

roti jahe ICS

Menyalin semua status dan gambar yang dapat digambar untuk setiap resolusi dan membuat gambar transparan menjadi padat, jadi saya memilih solusi yang lebih kotor: bungkus tombol di dudukan yang memiliki latar belakang putih. Inilah drawable XML mentah (ButtonHolder) yang melakukan hal itu:

File XML Anda

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

Namun, ini menghasilkan batas putih karena gambar tombol Holo menyertakan margin untuk memperhitungkan ruang yang ditekan:

Terlalu banyak putih Terlalu banyak menekan putih

Jadi solusinya adalah memberikan latar belakang putih margin (4dp bekerja untuk saya) dan sudut bulat (2dp) untuk benar-benar menyembunyikan putih namun membuat tombol solid:

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>

Hasil akhirnya terlihat seperti ini:

Tidak putih Tidak ditekan putih

Anda harus menargetkan gaya ini untuk v14 +, dan men-tweak atau mengecualikannya untuk Gingerbread / Honeycomb karena ukuran gambar tombol asli mereka berbeda dari ICS dan JB's (misalnya gaya yang tepat di belakang tombol Gingerbread ini menghasilkan sedikit putih di bawah tombol).

annie
sumber
7

Untuk tampilan, Anda dapat mengatur opacity dengan yang berikut ini.

view_name.setAlpha(float_value);

Properti view.setAlpha(int)ini ditinggalkan untuk versi API lebih besar dari 11. Selanjutnya, properti seperti .setAlpha(0.5f)digunakan.

Palash Dange
sumber
6

Untuk API <11 untuk warna textView, saya melakukan hal berikut:

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

Sedikit rumit, tapi hei, itu bekerja :-)

EZDsIt
sumber
1

Saya tahu ini sudah memiliki banyak jawaban, tetapi saya menemukan bahwa untuk tombol, lebih mudah untuk membuat pemilih .xml Anda sendiri dan mengaturnya ke latar belakang tombol tersebut. Dengan begitu Anda juga bisa mengubahnya saat ditekan atau diaktifkan dan sebagainya. Berikut ini cuplikan singkat yang saya gunakan. Jika Anda ingin menambahkan transparansi ke salah satu warna, tambahkan nilai hex terkemuka (#XXcccccc). (XX == "alfa warna")

<?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>
Konrad Winkowski
sumber