2012-05-04 39 views
12

Tôi biết có bài đăng tương tự nhưng tôi không thể tìm thấy câu trả lời của mình ở bất kỳ hình ảnh nào trong số đó. Vì vậy, tôi có XML drawable này:Bộ chọn Android có hình nền và độ dốc

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
<item android:state_enabled="true"> 
    <bitmap 
     android:src="@drawable/bm_btn_background" 
     android:tileMode="repeat" 
     android:gravity="center" /> 
</item> 
<item android:state_enabled="true"> 
    <shape android:shape="rectangle"> 
     <gradient 
      android:startColor="#a0e0b071" 
      android:endColor="#a0a67637" 
      android:angle="270" /> 
     <stroke 
      android:width="1dp" 
      android:color="#5c3708" /> 
     <corners 
      android:radius="5dp" /> 
     <padding 
      android:left="10dp" 
      android:top="10dp" 
      android:right="10dp" 
      android:bottom="10dp" /> 
    </shape> 
</item> 
<item android:state_pressed="true" > 
    <shape> 
     <gradient 
      android:startColor="#a0a67637" 
      android:endColor="#a0e0b071" 
      android:angle="270" /> 
     <stroke 
      android:width="1dp" 
      android:color="#5c3708" /> 
     <corners 
      android:radius="5dp" /> 
     <padding 
      android:left="10dp" 
      android:top="10dp" 
      android:right="10dp" 
      android:bottom="10dp" /> 
    </shape> 
</item> 

tôi đang cố gắng để tạo ra một nút với một hình ảnh lặp đi lặp lại làm nền và một gradient áp dụng cho nó. Với mã này, tôi chỉ nhìn thấy hình nền, không phải là độ dốc cũng như đường viền và các góc được làm tròn. Ngoài ra, khi tôi nhấp vào nút, nó không thay đổi (gradient là nghĩa vụ phải thay đổi). Tôi không biết điều gì sai với mã này? Nếu thay vì một bộ chọn tôi sử dụng một danh sách lớp, tôi nhận được kết quả mong muốn nhưng nó không thay đổi khi tôi nhấn nút. Cảm ơn bạn đã giúp đỡ!

+0

bạn có đặt tệp làm nền cho Nút hay không? – Akram

+0

Có: android: background = "@ drawable/button" – ali

Trả lời

41

Mã của bạn cho bộ chọn là sai vì:

  • Bạn có hai yếu tố cho tình trạng tương tự và như selector gặp tiểu bang đầu tiên (state_enabled) cho các phần tử Bitmap nó sẽ dừng lại ở đó và độ dốc của bạn sẽ không bao giờ xuất hiện (cho điều này, bạn nên sử dụng một số layer-list có các mục Bitmap và gradient trên đầu)

  • Bộ chọn sẽ khớp với các trạng thái theo thứ tự. Khi bạn nhấn Button, state_pressed sẽ không bao giờ được kích hoạt vì bộ chọn sẽ khớp trước tiên là state_enabled trên phần tử đầu tiên (vì điều này bạn nên di chuyển mã cho state_pressed phía trên các phần tử state_enabled).

Trong thực tế, bạn nên chỉ cần loại bỏ các state_enabled và để cho các Bitmap + gradient là giá trị mặc định cho Button. Dưới đây là bộ chọn của bạn (tôi cho rằng bạn chỉ muốn thay đổi độ dốc trên hình ảnh (nhưng hình ảnh sẽ xuất hiện ngay cả trong trạng thái nhấn, nếu đây không phải là hành vi mong muốn chỉ để lại độ dốc cho state_pressed)):

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 

    <item android:state_pressed="true"> 
     <layer-list> 
      <item> 
       <bitmap android:gravity="center" android:src="@drawable/bm_btn_background" android:tileMode="repeat" /> 
      </item> 
      <item> 
       <shape> 
        <gradient android:angle="270" android:endColor="#a0e0b071" android:startColor="#a0a67637" /> 
        <stroke android:width="1dp" android:color="#5c3708" /> 
        <corners android:radius="5dp" /> 
        <padding android:bottom="10dp" android:left="10dp" android:right="10dp" android:top="10dp" /> 
       </shape> 
      </item> 
     </layer-list> 
    </item> 

    <item android:state_enabled="true"> 
     <layer-list> 
      <item> 
       <bitmap android:gravity="center" android:src="@drawable/bm_btn_background" android:tileMode="repeat" /> 
      </item> 
      <item> 
       <shape android:shape="rectangle"> 
        <gradient android:angle="270" android:endColor="#a0a67637" android:startColor="#a0e0b071" /> 
        <stroke android:width="1dp" android:color="#5c3708" /> 
        <corners android:radius="5dp" /> 
        <padding android:bottom="10dp" android:left="10dp" android:right="10dp" android:top="10dp" /> 
       </shape> 
      </item> 
     </layer-list> 
    </item> 


</selector> 
+0

Bây giờ tôi hiểu cách các tiểu bang được giải thích. Cảm ơn. Những công việc này! Cảm ơn mọi người1 – ali

+0

câu trả lời tuyệt vời +1. – Akram

+0

Một vấn đề nhỏ. Các góc tròn không được áp dụng cho nền, chỉ cho hình dạng. – ali

0

trong trường hợp của tôi, tôi đang sử dụng tính năng này. thử nó

<item android:state_pressed="true"> 
    <shape> 
     <solid android:color="@color/mediumGray" /> 

     <stroke 
      android:width="1px" 
      android:color="@color/darkGray" /> 

     <padding 
      android:bottom="2dp" 
      android:left="1dp" 
      android:right="1dp" 
      android:top="2dp" /> 

     <corners 
      android:bottomLeftRadius="7sp" 
      android:bottomRightRadius="7sp" 
      android:topLeftRadius="7sp" 
      android:topRightRadius="7sp" /> 
    </shape> 
</item> 
<item android:state_focused="true"> 
    <shape> 
     <solid android:color="@color/mediumGray" /> 

     <stroke 
      android:width="1px" 
      android:color="@color/darkGray" /> 

     <padding 
      android:bottom="2dp" 
      android:left="1dp" 
      android:right="1dp" 
      android:top="2dp" /> 

     <corners 
      android:bottomLeftRadius="7sp" 
      android:bottomRightRadius="7sp" 
      android:topLeftRadius="7sp" 
      android:topRightRadius="7sp" /> 
    </shape> 
</item> 
<item> 
    <shape> 
     <solid android:color="@color/lightGray" /> 

     <stroke 
      android:width="1px" 
      android:color="@color/blackTransparent" /> 

     <padding 
      android:bottom="2dp" 
      android:left="1dp" 
      android:right="1dp" 
      android:top="2dp" /> 

     <corners 
      android:bottomLeftRadius="7sp" 
      android:bottomRightRadius="7sp" 
      android:topLeftRadius="7sp" 
      android:topRightRadius="7sp" /> 
    </shape> 
</item> 

0

Hãy xem trên trạng thái của bạn attrubute

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 

    <!-- Non focused states --> 
    <item android:drawable="@drawable/nicebuttonround" android:state_focused="false" android:state_pressed="false" android:state_selected="false"/> 
    <item android:drawable="@drawable/nicebuttonround" android:state_focused="false" android:state_pressed="false" android:state_selected="true"/> 

    <!-- Focused states --> 
    <item android:drawable="@drawable/nicebuttonroundi" android:state_focused="true" android:state_pressed="false" android:state_selected="false"/> 
    <item android:drawable="@drawable/nicebuttonroundi" android:state_focused="true" android:state_pressed="false" android:state_selected="true"/> 

    <!-- Pressed --> 
    <item android:drawable="@drawable/nicebuttonroundi" android:state_pressed="true" android:state_selected="true"/> 
    <item android:drawable="@drawable/nice22i" android:state_pressed="true"/> 

</selector> 

Đối lặp lại nền là hình ảnh mà bạn chỉ cần phải tạo ra 9 hình ảnh sân.

+0

Bạn có nghĩa là 'nine-patch'. –

0

Tôi đã thêm khoảng trống thừa vào bên phải của hình ảnh bằng cách sử dụng tùy chọn kích thước canvas của photoshop và nó hoạt động tốt cho tôi. tải xuống hình ảnh bên dưới để xem bản trình diễn. enter image description here

Các vấn đề liên quan