2012-05-03 32 views
24

Tôi có một hình dạng rất đơn giản mà tôi muốn thiết lập độ rộng của:Shape Kích drawable không làm việc

<shape android:shape="rectangle"> 
    <solid android:color="@color/orange"/> 
    <size android:width="2dp"/> 
</shape> 

Tuy nhiên, khi tôi gán này để nền của một EditText nó chỉ cho thấy một nền màu cam thay vì một hình chữ nhật có chiều rộng 2dp. Tại sao không đặt kích thước hoạt động? Tôi muốn tạo ra một minh bạch drawable với một hình chữ nhật màu cam ở phía bên trái. Tôi cũng có gói này trong bộ chọn:

<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:state_focused="true"> 
     <shape android:shape="rectangle"> 
      <solid android:color="@color/orange"/> 
      <size android:width="2dp" android:height="6dp"/> 
     </shape> 
    </item> 
    <item> 
     <shape android:shape="rectangle"> 
      <solid android:color="@android:color/transparent"/> 
     </shape> 
    </item> 
</selector> 

Tôi đã thử thêm chiều cao để xem liệu nó có thay đổi kích thước không. Nó không. Nó giống như nó hoàn toàn bỏ qua kích thước. WTF?

+0

Làm thế nào nó không hoạt động cho bạn? Nó hoạt động như một say mê. có thể vấn đề nằm trong cài đặt Bố cục của bạn? Hãy xem, nếu Bố cục của bạn có wrap_content cho chiều cao và chiều rộng. – Daler

+0

Nó khá đơn giản. bị bỏ qua và sẽ luôn tạo hình dạng lấp đầy chế độ xem. – afk5min

+0

Không phải luôn luôn, chắc chắn không phải với thuộc tính drawableTop/Bottom/etc. –

Trả lời

1

Tôi gặp sự cố tương tự.

Documentation (http://developer.android.com/guide/topics/resources/drawable-resource.html#Shape) nói:

< kích thước >

Kích thước của hình. (...)

Lưu ý: Hình dạng tỷ lệ với kích thước của vùng chứa Xem tỷ lệ với kích thước được xác định tại đây, theo mặc định. Khi bạn sử dụng hình dạng trong ImageView, bạn có thể hạn chế tỷ lệ bằng cách đặt android: scaleType thành "center".

Nếu tôi hiểu chính xác, điều đó có nghĩa là thẻ "kích thước" không dành cho kích thước cài đặt nhưng cho tỷ lệ cài đặt.

+4

Vì vậy, nó nói chiều rộng/chiều cao là số nguyên, nhưng những gì bạn đăng âm thanh như họ có thể là phần trăm (0..1) hoặc là lớn như kích thước của container (0..view.width) ?! Hay bạn đang nói nó có ý nghĩa và bạn biết cách nó hoạt động và có thể giải thích nó tốt hơn so với tài liệu? Tôi không hiểu rõ điểm của bạn. Dù bằng cách nào nó có thể đảm bảo một lỗi hoặc là xóa các tài liệu cực kỳ khủng khiếp hoặc sửa chữa mã vì vậy nó thực sự là chiều rộng và chiều cao. – chubbsondubs

5

Chỉ để chỉ định câu trả lời của người dùng983447 - thuộc tính kích thước thực sự có nghĩa là một tỷ lệ. Bạn nên đặt kích thước cho tất cả các hình dạng trong danh sách lớp của bạn và nó sẽ được sử dụng như một tỷ lệ khi chia tỷ lệ - như thuộc tính layout_weight của LinearLayout. Vì vậy, nó là tốt hơn để đặt tên cho nó không phải là một size nhưng một weight

Dưới đây là một công việc xung quanh như thế nào để thực hiện các vạch trắng trên và dưới mà không cần sử dụng thuộc tính size:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item> 
     <shape> 
      <solid android:color="#fff" /> 
     </shape> 
    </item> 
    <item android:top="1dp" android:bottom="1dp"> 
     <shape> 
      <solid android:color="#888" /> 
     </shape> 
    </item> 
</layer-list> 
+0

Điều này có hiệu suất xấu do quá tải gpu (hai hình dạng lấp đầy tất cả các pixel khi bạn muốn chỉ hai dòng pixel) – Gilian

+0

@Gilian sửa tôi nếu tôi sai, nhưng xml này được biên dịch vào một số lớp con của Drawable qua aapt, vì vậy sau biên dịch được thực hiện nó chỉ là một lớp java, và hiệu suất sẽ giống như đối với bất kỳ 9-patch hoặc bitmap từ quan điểm gpu. Vì vậy, nếu thiết kế yêu cầu nó, không có cách nào xung quanh –

0

sử dụng này.

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

<stroke 
    android:color="@color/lgray" 
    android:width="1dip" /> 

<corners 
    android:bottomLeftRadius="0dip" 
    android:bottomRightRadius="0.1dip" 
    android:topLeftRadius="0dip" 
    android:topRightRadius="0.1dip" /> 

<solid android:color="@color/White" /> 

</shape> 

đặt này rectangle.xml để drawable.and thiết lập nền nhìn của bạn.

3

Tôi đã tìm thấy danh sách lớp rất sai lệch cho Androider lần đầu tiên vì những điều sau đây. Thoạt nhìn, hầu hết mọi người sẽ nghĩ rằng các thuộc tính trên cùng, dưới cùng, bên phải, bên trái là TỪ trên cùng, dưới cùng, bên phải, bên trái. Trong trường hợp giá trị sau đây:

<item android:top="10dp"> 

Bạn sẽ bắt đầu một điểm bắt đầu 10dp từ đầu thùng chứa tương ứng. Đây không phải là trường hợp. Hãy nghĩ về nó như là OFF của phần trên, dưới, phải, trái. <item android:top="10dp"> vẫn sẽ net bạn một điểm bắt đầu 10dp OFF của đầu, nhưng những gì sẽ xảy ra khi bạn muốn thiết lập phía dưới?

<item android:bottom="20dp"> 

Điều này sẽ không giúp bạn đạt được mức 20dp từ TOP, chứ không phải dưới 20dp TẮT BOTTOM của vùng chứa.

Vì vậy, ví dụ với một container 100dp, nếu bạn muốn có một hình chữ nhật với một cạnh trên bắt đầu từ 20dp và cạnh đáy tại 40dp: attribute kích thước

<item android:top="20" android:bottom="60dp"> 
+0

Điều này tôi thực sự hiểu rằng khi tôi đăng câu hỏi. Sẽ có ít điểm để làm cho tất cả các giá trị trên cùng, trái tương đối với tất cả các giá trị (ví dụ trên cùng, bên trái, dưới cùng, bên phải) vì bạn không bao giờ có thể định nghĩa một hình mở rộng để khớp với vùng chứa chính mà không biết kích thước của vùng chứa. Trong trường hợp cụ thể này, tôi có hình dạng cần thiết để có kích thước cố định vì vậy tôi muốn sử dụng chiều rộng/chiều cao để đặt thứ nguyên nhưng tài liệu không giải thích hệ tọa độ chiều rộng/chiều cao để bạn được đoán. – chubbsondubs

+0

Cảm ơn người đàn ông này đã là một lời giải thích tuyệt vời! làm cho tôi hiểu nơi tôi đã sai và sửa chữa cuối cùng sau giờ làm việc! nhưng thích bạn! +1 – Alexiscanny

1

hình sẽ cung cấp giá trị cho drawable.getIntrinsicWidth & getIntrinsicHeight.

nếu vùng chứa có thể vẽ (ví dụ: ImageView, TextView) có tham số bố cục WRAP_CONTENT, thì thứ nguyên vùng chứa sẽ thay đổi nếu thay đổi drawState có thể vẽ được.

nhưng có một lỗi trong khuôn khổ android trong việc thực hiện ImageView drawingState

ImageView chỉ cập nhật/thay đổi kích thước kích thước của nó bởi kích thước drawable trên state_selected nhưng không vào state_activated

4

Nó có thể làm việc với một foreground. Có vẻ như bạn không thể đặt trọng tâm của nền. Nhưng bạn có thể trên một nền trước. Tôi đã kiểm tra API 21, 23 và 24 (tốt, với bản xem trước thiết kế của Studio) và những nơi sau đây đặt một chấm tròn vững chắc trên ImageView.

<shape android:shape="oval" xmlns:android="http://schemas.android.com/apk/res/android"> 
    <solid android:color="@color/colorPrimary" /> 
    <size android:height="8dp" android:width="8dp" /> 
</shape> 

Với cách bố trí đoạn mã

<ImageView 
      android:foreground="@drawable/list_new_dot" 
      android:foregroundGravity="right|center_vertical" 
      tools:src="@drawable/model_1_sm" 
      /> 

CẬP NHẬT: Trong khi nó xuất hiện để làm việc trong các công cụ thiết kế bố trí, nó không giống nhau trong giả lập. CẬP NHẬT 2: Vì câu trả lời này có một vài phiếu bầu, bạn có thể muốn kiểm tra những gì tôi thực sự sử dụng để hiển thị dấu chỉ mới: https://gist.github.com/CapnSpellcheck/4d4638aefd085c703b9d990a21ddc1eb

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