Tôi đang cố gắng sử dụng vector có thể kéo được trong ứng dụng Android của mình. Từ http://developer.android.com/training/material/drawables.html (tôi nhấn mạnh):
Trong Android 5.0 (API cấp 21) trở lên, bạn có thể xác định các tệp có thể vẽ vectơ, chia tỷ lệ mà không làm mất định nghĩa.
Sử dụng có thể vẽ này:
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:height="24dp"
android:width="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path android:fillColor="@color/colorPrimary" android:pathData="M14,20A2,2 0 0,1 12,22A2,2 0 0,1 10,20H14M12,2A1,1 0 0,1 13,3V4.08C15.84,4.56 18,7.03 18,10V16L21,19H3L6,16V10C6,7.03 8.16,4.56 11,4.08V3A1,1 0 0,1 12,2Z" />
và ImageView này:
<ImageView
android:layout_width="400dp"
android:layout_height="400dp"
android:src="@drawable/icon_bell"/>
tạo ra hình ảnh mờ này khi cố gắng hiển thị biểu tượng ở 400dp (trên một thiết bị di động khá lớn chạy kẹo mút vào khoảng năm 2015 có độ phân giải cao):
Thay đổi chiều rộng và chiều cao trong định nghĩa của vectơ có thể vẽ thành 200dp cải thiện đáng kể tình hình ở kích thước kết xuất 400dp. Tuy nhiên, việc đặt điều này làm phần tử TextView (tức là biểu tượng ở bên trái văn bản) có thể vẽ được bây giờ sẽ tạo ra một biểu tượng lớn.
Những câu hỏi của tôi:
1) Tại sao lại có thông số chiều rộng / chiều cao trong vector có thể vẽ được? Tôi nghĩ rằng toàn bộ điểm của những điều này là chúng tăng và giảm một cách dễ dàng làm cho chiều rộng và chiều cao trở nên vô nghĩa trong định nghĩa của nó?
2) Có thể sử dụng một vectơ có thể vẽ hoạt động như một tệp có thể vẽ 24dp trên TextView nhưng mở rộng quy mô tốt để sử dụng nhiều hình ảnh lớn hơn không? Ví dụ: làm cách nào để tránh tạo nhiều tệp có thể kéo vectơ với các kích thước khác nhau và thay vào đó sử dụng một bảng có tỷ lệ phù hợp với yêu cầu hiển thị của tôi?
3) Làm cách nào để sử dụng hiệu quả các thuộc tính width / height và sự khác biệt với viewportWidth / Height là gì?
Chi tiết bổ sung:
- Thiết bị đang chạy API 22
- Sử dụng Android Studio v1.5.1 với phiên bản Gradle 1.5.0
- Manifest là biên dịch và mục tiêu cấp 23, cấp tối thiểu 15. Tôi cũng đã thử chuyển cấp tối thiểu lên 21, nhưng điều này không có gì khác biệt.
- Việc biên dịch APK (với mức tối thiểu được đặt thành 21) hiển thị một tài nguyên XML duy nhất trong thư mục có thể vẽ. Không có hình ảnh nào được tạo ra.
drawable
thư mục. Chiều rộng / chiều cao trong tệp xml có thể vẽ vector là 24dp. Việc chỉ định ImageView có chiều cao / chiều rộng 400dp chắc chắn tạo ra hình ảnh có tỷ lệ kém.
drawable-anydpi-v21
là vì tôi minSdkVersion
nhỏ hơn 21. Có thay đổi hành vi nào nếu bạn đặt thành minSdkVersion
nhỏ hơn 21 không? Còn việc chuyển XML sang drawable-anydpi
thì sao? Tôi sẽ không mong đợi có được một sự thay đổi nhưng tôi cũng mong chờ hình ảnh vector của bạn được mở rộng quy mô một cách chính xác ...
drawable-anydpi-v21
với nhiều hình ảnh được phân loại khác nhau trong mdi / hdpi / etc. thư mục. Không có thay đổi đối với kết quả hiển thị cuối cùng.
New -> Vector Asset
nó sẽ thả XML hình ảnh vectơ vào thư mục có thể vẽ của tôi. Tuy nhiên, nếu tôi sử dụng apktool để giải nén APK đã được tạo, tôi thấy rằng các tệp XML đã ở trongdrawable-anydpi-v21
và chia tỷ lệ chính xác trên các thiết bị API 21+. Các tập tin raster được đặt trongdrawable-<mdpi/hdpi/etc>-v4
thư mục và không được sử dụng trên API trên 21 thiết bị (dựa trên thực tế là họ mở rộng quy mô một cách chính xác)