วิธีการตั้งค่าความทึบ (อัลฟา) สำหรับมุมมองใน Android


211

ฉันมีปุ่มดังต่อไปนี้:

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

ในonCreate()กิจกรรมของฉันฉันโทรหา Button01 เช่นนี้

setContentView(R.layout.main);

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

มีพื้นหลังในแอปพลิเคชันและฉันต้องการตั้งความทึบของปุ่มส่งนี้ ฉันจะตั้งค่าความทึบสำหรับมุมมองนี้ได้อย่างไร เป็นสิ่งที่ฉันสามารถตั้งค่าบนฝั่ง java หรือฉันสามารถตั้งค่าในไฟล์ main.xml?

ในด้าน java ฉันพยายามButton01.mutate().SetAlpha(100)แต่มันทำให้ฉันมีข้อผิดพลาด

คำตอบ:


64

ฉันเพิ่งพบคำถามของคุณในขณะที่มีปัญหาที่คล้ายกันกับ TextView ฉันก็สามารถที่จะแก้ปัญหาได้โดยการขยาย TextView onSetAlphaและเอาชนะ บางทีคุณอาจลองทำสิ่งที่คล้ายกับปุ่มของคุณ:

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
ขอบคุณสิ่งนี้ช่วยฉันด้วย อย่างไรก็ตามมันไร้สาระที่ TextView และ ImageView มีวิธีตั้งอัลฟาต่างกัน
Geraldo Nascimento

สิ่งนี้ช่วยฉันเช่นกันในการใช้เอฟเฟกต์การคลิกกับมุมมองภาพโดยไม่ต้องใช้ทรัพยากรชุดที่สอง Thanx !!
skygeek

568

ฉันประหลาดใจโดยคนอื่นอีกคำตอบที่ซับซ้อนมากขึ้น

XML

คุณสามารถกำหนดอัลฟาในนิยามสีของปุ่ม (หรือมุมมองอื่น ๆ ) ใน xml ของคุณ:

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

ในตัวอย่างข้างต้นสีจะเป็นสีแดงโปร่งใสบางส่วน

เมื่อกำหนดสีของมุมมองรูปแบบสามารถเป็นอย่างใดอย่างหนึ่ง#RRGGBBหรือ#AARRGGBBที่AAเป็นค่าฐานสิบหก FFจะทึบแสงเต็มที่และ00จะโปร่งใสเต็มที่

แบบไดนามิก

หากคุณต้องการแก้ไขความทึบในรหัสของคุณแบบไดนามิกให้ใช้

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

ที่ INT อยู่ในช่วง0(โปร่งใสทั้งหมด) ถึง255(ทึบแสงเต็มที่)


18
นี่ยังไม่ใช่วิธีแก้ปัญหาหากคุณมีสารประกอบที่สามารถวาดได้
Michał K

6
ตั้งค่ามุมมองสีเขียวโปร่งใสครึ่งหนึ่ง: <RelativeLayout android: background = "# 8700FF00" />
Jonny

2
มุมมองไม่มีandroid:colorแอตทริบิวต์
Ronnie

6
@moshersan คุณสามารถตั้งค่าสีใน android: คุณสมบัติพื้นหลังของตัวเอง!
Dheeraj Bhaskar

1
นั่นคือbackgroundความทึบที่ไม่ถูกต้องไม่ใช่viewความทึบ ไม่เทียบเท่ากับการใช้งานหลายกรณี
Jocky Doe

215

ฉันเดาว่าคุณอาจพบคำตอบแล้ว แต่ถ้าไม่ใช่ (และสำหรับนักพัฒนาคนอื่น) คุณสามารถทำสิ่งนี้ได้:

btnMybutton.getBackground().setAlpha(45);

ที่นี่ฉันได้ตั้งค่าความทึบเป็น 45 โดยทั่วไปคุณสามารถตั้งค่าจากอะไรก็ได้ระหว่าง0 (เต็มโปร่งใส) ถึง255 (ทึบอย่างสมบูรณ์)


5
มีให้เฉพาะใน API 11+ developer.android.com/reference/android/view/…
Graeme

8
@Graeme คุณได้เชื่อมโยงกับวิธี setAlpha ในคลาส View แต่โพสต์นั้นใช้ setAlpha ในคลาส Drawable เมธอด getBackground ส่งคืน Drawable วิธีนี้มาจาก API ระดับ 1 developer.android.com/reference/android/graphics/drawable/…
Geekygecko

โอ้น่าสนใจ! ฉันไม่เห็นสิ่งนั้น นี่หมายความว่าข้อความนั้นสามารถมองเห็นได้อย่างสมบูรณ์แม้ว่าพื้นหลังจะถูกตั้งค่าเป็นแบบโปร่งใส
แกรม

-1 สิ่งนี้ไม่ทำงานในกรณีของฉันที่พื้นหลังของฉันวาดได้เป็นตัวเลือก
Mike S

3
มันใช้งานได้ดี แต่มีผลข้างเดียว: ฉันมีปุ่มหลายปุ่มที่ใช้พื้นหลังร่วมกันและมันโปร่งใสทั้งหมด! :(
ทำเครื่องหมาย

66

สิ่งที่ฉันอยากจะแนะนำให้คุณทำคือสร้างสี ARGB ที่กำหนดเองในไฟล์ colors.xml ของคุณเช่น:

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

จากนั้นตั้งค่าพื้นหลังปุ่มของคุณเป็นสี:

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

อีกสิ่งหนึ่งที่คุณสามารถทำได้ถ้าคุณต้องการที่จะเล่นกับรูปร่างของปุ่มคือการสร้างทรัพยากรรูปวาดที่คุณสามารถตั้งค่าคุณสมบัติที่ปุ่มควรมีลักษณะ:

ไฟล์: 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>

จากนั้นใช้สิ่งนั้นเป็นพื้นหลังปุ่ม:

    android:background="@drawable/rounded_corner_box"

6
หากคุณกำลังพยายามที่จะแปลงจากความทึบ 40% เป็นค่าฐานสิบหกคุณสามารถใช้การค้นหาของ Google "40% ของ 255 ถึงฐานสิบหก" ให้ค่าฐานสิบหกสำหรับ 40%
scottyab

54

ตามมุมมอง android docs alpha เป็นค่าระหว่าง 0 และ 1 ดังนั้นเมื่อต้องการตั้งค่าให้ใช้สิ่งนี้:

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

นั่นเป็นสิ่งที่ใช้งานได้สำหรับฉันเท่านั้นสำหรับการดูทั้งหมด ... ฉันได้ลองใช้รายการ listview แล้วซึ่งมีตัวอย่างข้อความหลายรายการด้วย บรรทัดเดียวนี้ช่วยในการตั้งค่ามุมมองและลูก ๆ ของมัน ขอบคุณ @ cange1
Alyas

สิ่งเดียวที่ทำงานสำหรับฉันเช่นกัน ฉันรู้ว่ามันเก่า แต่ขอบคุณ @ cange1
masoftheund

50

ง่ายขึ้นจากด้านบน แอตทริบิวต์ alpha เริ่มต้นจะมีไว้สำหรับปุ่ม

android:alpha="0.5"

ช่วงอยู่ระหว่าง 0 เพื่อความโปร่งใสสมบูรณ์และ 1 สำหรับความทึบสมบูรณ์


ตรงนี้เป็นสิ่งที่ฉันกำลังมองหาน่ากลัวทดสอบบน api 21
Fernando Torres

คำตอบที่สมบูรณ์แบบ !!
แฮร์รี่. หนีบ

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

ด้านบนเป็นสิ่งที่ฉันรู้ ... ฉันคิดว่าการสร้างคลาสปุ่มแบบกำหนดเองเป็นความคิดที่ดีที่สุด

API ระดับ 11
เมื่อเร็ว ๆ นี้ผมมาในนี้หุ่นยนต์: อัลฟาแอตทริบิวต์ XML ซึ่งจะมีค่าระหว่าง 0 และ 1 วิธีการที่สอดคล้องกันคือsetAlpha (float)


สวัสดี Josnidhin ขอบคุณสำหรับการตอบกลับของคุณ. แต่มันทำให้ปุ่มทั้งหมดโปร่งใสอย่างสมบูรณ์ สิ่งที่ฉันกำลังมองหาคือการเพิ่มความทึบ (อาจผ่านค่าอัลฟ่า) บนปุ่ม
ncakmak

มันเป็นแบบลอยดังนั้นคุณสามารถใช้ค่าระหว่าง 0 และ 1, 0.5 เช่น
StackOverflow

@ StackOverflowed - ฉันเชื่อว่า ncakmak หมายถึงโซลูชั่นแรก การตั้งค่า@android:color/transparentเป็นพื้นหลังจะทำให้มุมมองนั้นโปร่งใสอย่างแท้จริง @android:alpha- ส่วนหนึ่งน่าจะเป็นภาคผนวก
katzenhut

17

แม้ว่าจะbtnMybutton.getBackground().setAlpha(45);เป็นความคิดที่ดี แต่ก็ใช้อัลฟ่ากับพื้นหลังไม่ใช่มุมมองทั้งหมด

หากคุณต้องการใช้อัลฟาเพื่อดูการใช้งาน btnMybutton.setAlpha(0.30f);แทน สิ่งนี้ใช้กับความทึบในการดู ยอมรับค่าระหว่าง 0 ถึง 1

หมอพูดว่า:

ตั้งค่าความทึบของมุมมอง นี่คือค่าตั้งแต่ 0 ถึง 1 โดยที่ 0 หมายถึงมุมมองนั้นโปร่งใสอย่างสมบูรณ์และ 1 หมายถึงมุมมองนั้นทึบแสงสมบูรณ์ หากมุมมองนี้แทนที่ onSetAlpha (int) เพื่อคืนค่าจริงมุมมองนี้จะรับผิดชอบในการใช้ความทึบเอง มิฉะนั้นการเรียกใช้เมธอดนี้เทียบเท่ากับการเรียก setLayerType (int, android.graphics.Paint) และการตั้งค่าเลเยอร์ฮาร์ดแวร์ โปรดทราบว่าการตั้งค่าอัลฟ่าเป็นค่าโปร่งแสง (0 <alpha <1) อาจมีผลกระทบต่อประสิทธิภาพ เป็นการดีที่สุดที่จะใช้คุณสมบัติอัลฟาเท่าที่จำเป็นและชั่วคราวเช่นในกรณีของภาพเคลื่อนไหวที่ซีดจาง


7

ฉันพบปัญหานี้กับ ICS / JB เพราะปุ่มเริ่มต้นสำหรับธีม Holo ประกอบด้วยภาพที่โปร่งใสเล็กน้อย สำหรับพื้นหลังจะเห็นได้ชัดเจนเป็นพิเศษ

Gingerbread กับ ICS +:

ขนมปังขิง ICS

การคัดลอกภาพและภาพที่วาดได้ทั้งหมดสำหรับแต่ละความละเอียดและทำให้ภาพที่เป็นของแข็งนั้นเป็นความเจ็บปวดดังนั้นฉันจึงเลือกใช้วิธีที่สกปรกกว่า: ปิดปุ่มในที่ยึดที่มีพื้นหลังสีขาว นี่คือ XML ดิบที่สามารถดึงได้ (ButtonHolder) ซึ่งทำสิ่งนั้นทุกประการ:

ไฟล์ XML ของคุณ

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

อย่างไรก็ตามผลลัพธ์นี้เป็นเส้นขอบสีขาวเนื่องจากรูปปุ่ม Holo รวมระยะห่างจากบัญชีสำหรับพื้นที่ที่ถูกกด:

ขาวมากเกินไป กดสีขาวมากเกินไป

ดังนั้นวิธีแก้ปัญหาคือให้ขอบพื้นหลังสีขาว (4dp ทำงานสำหรับฉัน) และมุมโค้งมน (2dp) เพื่อซ่อนสีขาวอย่างสมบูรณ์ แต่ทำให้ปุ่มแข็ง:

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>

ผลลัพธ์สุดท้ายมีลักษณะดังนี้:

ไม่มีสีขาว ไม่มีการกดสีขาว

คุณควรกำหนดเป้าหมายสไตล์นี้สำหรับ v14 + และปรับแต่งหรือแยกออกสำหรับ Gingerbread / Honeycomb เนื่องจากขนาดรูปปุ่มดั้งเดิมนั้นแตกต่างจาก ICS และ JB (เช่นรูปแบบที่แน่นอนนี้ด้านหลังปุ่ม Gingerbread ทำให้มีสีขาวเล็กน้อยด้านล่างปุ่ม)


7

สำหรับมุมมองที่คุณสามารถตั้งค่าความทึบโดยต่อไปนี้

view_name.setAlpha(float_value);

คุณสมบัติview.setAlpha(int)เลิกใช้แล้วสำหรับเวอร์ชัน API ที่สูงกว่า 11 ต่อจากนี้เป็นต้นไปคุณสมบัติเช่น.setAlpha(0.5f)นั้นจะถูกใช้


6

สำหรับ API <11 สำหรับสีมุมมองข้อความฉันทำสิ่งต่อไปนี้:

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

ยุ่งยากนิดหน่อย แต่เฮ้มันใช้งานได้ :-)


1

ฉันรู้ว่ามันมีคำตอบมากมาย แต่ฉันพบว่าสำหรับปุ่มมันเป็นวิธีที่ง่ายที่สุดในการสร้างตัวเลือก. xml ของคุณเองและตั้งเป็นพื้นหลังของปุ่มดังกล่าว ด้วยวิธีนี้คุณสามารถเปลี่ยนสถานะเมื่อกดหรือเปิดใช้งานและอื่น ๆ นี่เป็นตัวอย่างข้อมูลสั้น ๆ ของข้อมูลที่ฉันใช้ หากคุณต้องการเพิ่มความโปร่งใสให้กับสีใด ๆ ให้เพิ่มค่าเลขฐานสิบหกนำหน้า (#XXcccccc) (XX == "อัลฟาของสี")

<?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>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.