1

在我的應用程序中,我需要更改某個按鈕的背景顏色以響應某些事件。該工程通過設置創建繪製,並設置其油漆和使用作爲繪製按鈕背景罰款:如何將alpha蒙版應用於Android可繪製?

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

現在,我想覆蓋阿爾法遮掩到該繪製,創造了「條紋」按鈕。下面是它看起來應該像一個藍色和黑色按鈕(假設白色作爲背景色,但這些部分應該真的是100%透明):

enter image description here

我在Inkscape中做這個alpha遮罩,以及成功將其導入爲矢量資產。我可能需要將它轉換爲各種位圖,但我不確定。

我讀過一堆文章,提到PorterDuff矩陣應用的SO問題,但還沒有能夠將這些問題轉化爲解決我目前的問題。

任何人都知道如何做到這一點?


這是另一種可視化,希望能讓事情更清楚。按鈕的父視圖的背景顏色爲淡粉色這裏,按鈕邊框輪廓變成紅色(但確實應該在最終產品中不可見的):

enter image description here

+0

我不太明白你的解釋。爲了清楚起見,您可以生成一個按鈕的圖像,因爲它會出現在設備上? – Karakuri

+0

@Karakuri,我已經添加了另一個示例,概述了按鈕邊框並使背景變爲非白色。這有助於解釋理想的結果嗎?它仍然在Inkscape中被嘲笑,因爲我還沒有弄清楚在Android中如何做到這一點:) – Alice

+0

只是一個想法,但它可能更容易創建自己的視圖子類,它需要一個顏色並繪製6條本身一個'Paint'對象。關於Android視圖的一個骯髒的小祕密:任何視圖都可以點擊(所以你實際上不需要「Button」......除非你想要那裏的文本,那麼你可能需要一個Button)。 – Karakuri

回答

0

所以,我想通了,如何做到這一點,儘管不使用SVG - 太多的問題在那裏。

首先,我從使用Button切換到ImageButton。然後我採用以下方式:

<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只是在原來的問題出阿爾法遮掩的PNG版本。顏色可以使用XML或以編程方式使用tint屬性進行設置。我不太明白爲什麼我需要將背景設置爲null,但它看起來很奇怪。最後,需要將scaleType設置爲適合XY,以便顯示所有條紋,而不管特定顯示器上按鈕的大小。

這裏是什麼樣子:

enter image description here

1

//這將幫助。

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

img.setAlpha(100); 

//透明度介於0和255之間; //如果你想使用位圖

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

img.setImageBitmap(b); 

img.setAlpha(100); 
+0

謝謝史蒂文。我找到了達到預期效果的方法,只是發佈了我的答案。恐怕我不太能效仿你的榜樣。 – Alice

+0

沒關係。有很多方法可以做到這一點。所以,抓住對你有幫助的代碼。 – Steven