2013-04-10 34 views
7

Tôi muốn giới thiệu một phong cách 'xuống' trên một số nút. Tôi đã tạo kiểu và danh sách trạng thái.Android: Đặt nút alpha khi nhấp. Tốt hơn là chỉ xml

<selector xmlns:android="http://schemas.android.com/apk/res/android"> 

    <item android:drawable="@drawable/inactive_button_background" android:state_enabled="false"/> 
    <item android:drawable="@drawable/active_button_background" android:state_enabled="true"/> 
    <item android:drawable="@drawable/pressed_button_background" android:state_pressed="true"></item> 
</selector> 

Vấn đề là tôi muốn để có thể thay đổi chỉ là alpha của nền khi nút được click (Tôi sẽ có nền biến, do đó thiết lập một màu bán với kênh alpha không phải là một giải pháp).

Và tôi muốn thực hiện điều này từ chỉ xml khai báo (không muốn điều chỉnh mã của tôi bằng nội dung bố cục).

Vấn đề là tôi không biết cách áp dụng pha trộn alpha này cho nút từ một xml có thể vẽ được. Tôi khá chắc chắn có một cách mặc dù.

+0

Có cách từ mã sử dụng hoạt ảnh. Tôi đã làm nó nếu bạn muốn làm điều đó từ java tôi có thể đặt nó như là câu trả lời. – Ankit

Trả lời

0

Bạn sẽ phải đặt nội dung nào đó vào mã của mình.

XML

<Button 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="Text" 
    android:onClick="dialogClicked" /> 

Java

public void dialogClicked(final View view) 
{ 
    ... set the alpha programatically ... 
} 
+4

Không nhất thiết. Tôi biết tôi * có thể * đặt nó theo chương trình. Tôi cũng có thể thiết lập nó chỉ XML, nếu tôi đang sử dụng một nền màu rắn (thông qua #AARRGGBB drawable) và nó hoạt động. Nhiều thứ tương tự có thể được hoàn thành mà không cần viết một dòng mã java. Tại sao không có cách nào để đặt alpha thành một drawable từ xml vẫn còn là một bí ẩn đối với tôi. – George

+0

Tôi không nghĩ rằng có thể ... Có một thuộc tính android: alpha, nhưng nó chỉ áp dụng cho các chế độ xem, không thể vẽ được. Ngoài ra, nó chỉ có sẵn từ cấp API 11. –

+0

Để làm điều này trong XML, bạn cần một số loại tham số như android: foreground cho phép bạn chỉ định một đối tượng có thể kéo được ở trên đầu chế độ xem. Thật không may là không tồn tại ngay bây giờ, vì vậy AFAIK không có cách nào để chỉ làm điều này trong XML. – greg7gkb

-1

này sẽ khá nhiều làm điều đó. Vâng, nó làm việc cho tôi

<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:state_pressed="true"> 
    <shape> 
     <solid android:color="#5000ddff" /> 
    </shape> 
    </item> 
    <item android:drawable="@color/yourdefaultcolor"/> 
</selector> 
5

Tôi hơi muộn để trả lời câu hỏi này, nhưng tôi chỉ làm điều này bằng cách thay đổi giá trị alpha sử dụng View.onTouchListner

Bạn có thể làm điều này bằng cách thực hiện onTouch theo cách này

@Override 
public boolean onTouch(View v, MotionEvent event) { 

    switch (event.getAction()) 
    { 
     case MotionEvent.ACTION_DOWN: 
      v.setAlpha(0.5f); 
      break; 
     case MotionEvent.ACTION_UP: 
      v.setAlpha(1f); 
     default : 
     v.setAlpha(1f) 
    } 
    return false; 
} 

Tôi đoán bạn không thể thay đổi giá trị alpha từ có thể draw được nên bạn sẽ phải thực hiện việc này theo cách này.

+0

Bạn nên xử lý việc đặt lại alpha làm trường hợp mặc định. Ví dụ: nếu ACTION là CANCEL, nút sẽ ở lại một nửa mờ. – couceirof

+0

Ya bạn nói đúng. Tôi cũng đang đối mặt với cùng một vấn đề. Tôi đã thay đổi nó trong mã của tôi. Tôi đã cập nhật câu trả lời –

3

này hoạt động hoàn hảo


yourView.setOnTouchListener(new View.OnTouchListener() { 
    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     switch (event.getAction()) { 
      case MotionEvent.ACTION_DOWN: { 
       v.setAlpha(0.5f); 
       break; 
      } 
      case MotionEvent.ACTION_UP: 
      case MotionEvent.ACTION_CANCEL: { 
       v.setAlpha(1f); 
       break; 
      } 
     } 
     return false; 
    } 
}); 
0

Thêm mục nào đó để Michael trả lời, nếu bạn đang tìm kiếm một "mềm hơn" bấm hình ảnh động. Tôi thêm này:

btn.setOnTouchListener(new View.OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent motionEvent) { 
      switch (motionEvent.getAction()) 
      { 
       case MotionEvent.ACTION_DOWN: 
        v.animate().alpha(0.3f).setDuration(200).start(); 
        break; 
       case MotionEvent.ACTION_UP: 
        v.animate().alpha(1f).setDuration(200).start(); 
       default : 
        v.setAlpha(1f); 
      } 
      return false; 
     } 
    }); 
} 

với dối trá trên ý tưởng tương tự nhưng với một hình ảnh động

0

Tôi biết thats câu hỏi khá cũ, tuy nhiên tôi không thể nhìn thấy câu trả lời đúng theo câu hỏi mà là về sự thay đổi alpha sử dụng xml.
Để làm điều đó bạn cần phải tạo ra selector đó đã được thể hiện trong một câu hỏi và nó là:

<selector xmlns:android="http://schemas.android.com/apk/res/android"> 

    <item android:drawable="@drawable/inactive_button_background" android:state_enabled="false"/> 
    <item android:drawable="@drawable/active_button_background" android:state_enabled="true"/> 
    <item android:drawable="@drawable/pressed_button_background" android:state_pressed="true"></item> 
</selector> 

Vì vậy, nếu bạn có thể vẽ tiểu bang duy nhất bình thường (giả btn_background.png của nó) và bạn cần 50% alpha trong trạng thái ép tất cả những gì bạn phải làm là tạo ra xml-drawable tương ứng có tên là pressed_button_background.xml (trong thư mục drawable, no-dpi!). Vì vậy, đây nên được như sau:

<?xml version="1.0" encoding="utf-8"?> 
<bitmap xmlns:android="http://schemas.android.com/apk/res/android" 
    android:src="@drawable/btn_background" 
    android:alpha=".5" /> 

Cùng áp dụng cho tình trạng khuyết tật, sự khác biệt duy nhất, tôi đoán, là mức alpha mà cho trạng thái này có thể giống như 30% hoặc bất cứ nhà thiết kế cho biết/muốn). Vì vậy, phiên bản ngắn hơn sẽ giống như sau (cho nút với ic_edit drawable.png):

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item 
     android:state_enabled="true" 
     android:state_pressed="true"> 
     <bitmap 
      android:src="@drawable/ic_edit" 
      android:alpha=".5" /> 
    </item> 
    <item 
     android:state_enabled="false"> 
     <bitmap 
      android:src="@drawable/ic_edit" 
      android:alpha=".3" /> 
    </item> 
    <item 
     android:drawable="@drawable/ic_edit" /> 
</selector>