Tôi có VectorDrawable bao gồm 9 hình chữ nhật. Điều này được định nghĩa là một XML trong thư mục drawables. Tôi có thiết lập này làm nền cho một ImageView mà tôi đã khai báo trong xml. android:src="@drawable/squares00"
Tôi muốn thay đổi màu của một hoặc nhiều ô vuông theo chương trình tại thời gian chạy. Tôi biết có cách để làm điều này bằng cách sử dụng hình ảnh động VectorDrawable. Nhưng tôi đã tự hỏi nếu có cách đơn giản hơn để truy cập vectorDrawable của tôi trong java, cập nhật các thuộc tính của nó (thiết lập một hoặc nhiều màu tô cho hình chữ nhật) và sau đó có nền hình ảnh được cập nhật với VectoDrawable đã cập nhật. mục tiêu của tôi là Android API 21 (kẹo)cập nhật theo chương trình Android Vector Drawable
Trả lời
Nói tóm lại:
- Bạn không có một truy cập trực tiếp đến các yếu tố bên trong VectorDrawable.
- AnimatedVectorDrawable chỉ có quyền truy cập vào các yếu tố bên trong.
- Sử dụng AnimatedVectorDrawable để mô phỏng những gì bạn cần.
Long:
1. Bạn không có quyền truy cập
Nhìn vào source code cho VectorDrawable sẽ cho thấy rằng các yếu tố thông tin bên trong được lưu trữ trong một nội tin lớp nhà nước VectorDrawableState
. Phương pháp duy nhất để hiển thị phần tử bên trong bằng tên là getTargetByName
, nhưng tiếc là nó là gói riêng tư (mặc định) - bạn không thể sử dụng nó (trừ khi bạn sử dụng phản chiếu).
2. AnimatedVectorDrawable chỉ có quyền truy cập
getTargetByName
chỉ được sử dụng bởi AnimatedVectorDrawable, như chúng ta có thể tìm thấy bằng searching for usages của phương pháp.
3. Sử dụng AnimatedVectorDrawable
Vì vậy, bây giờ mà chúng ta thấy rằng đây là lựa chọn có sẵn mà thôi, ví dụ, chúng ta có thể thử cách sau để thay đổi màu sắc của yếu tố "rect2" từ màu trắng sang màu đen:
change_color.xml:
<set xmlns:android="http://schemas.android.com/apk/res/android">
<objectAnimator
android:duration="0"
android:propertyName="fillColor"
android:valueFrom="@color/white"
android:valueTo="@color/black"/>
</set>
animation.xml:
<animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/vectordrawable" >
<target
android:name="rect2"
android:animation="@anim/change_color" />
</animated-vector>
và sử dụng phương pháp được mô tả here.
Note
Nếu ở trên vẫn không phải là một lựa chọn cho bạn, bạn có thể thử như sau:
- Sao chép toàn bộ VectorDrawable và tinh chỉnh nó (không kiểm tra)
- Sử dụng phản chiếu cho
getTargetByName
để lấy yếu tố bên trong. Trước tiên, bạn cần đảm bảomutate
đối tượng.
tôi thấy gói phương pháp riêng bạn đề cập đến trong VectorDrawable: 'Object getTargetByName (String name) { trở mVectorState.mVPathRenderer.mVGTargetsMap.get (tên); } ' Có vẻ như bạn đang nói nếu tôi sử dụng phương pháp này, sau đó tôi về mặt lý thuyết có thể thực hiện hoạt ảnh đối tượng trên đối tượng đó (" target ") để thay đổi màu? Ý của bạn là gì khi bạn nói tôi sẽ cần 'biến đổi' đối tượng trước? –
Nếu bạn sử dụng phản chiếu cho getTargetByName, bạn sẽ có thể nhận được một phần tử được xác định trong XML theo tên. Một ví dụ sẽ có kiểu VFullPath - đó cũng là một lớp riêng. Bạn sẽ cần phải thao tác nó bằng cách sử dụng phản xạ một lần nữa trên trường mFillColor (để thay đổi màu). Về đột biến, bạn phải gọi mutate() trên bản vẽ có thể vẽ được - điều này sẽ tạo ra một bản sao cục bộ của trạng thái bên trong. Trước khi bạn làm điều đó tất cả các drawables cùng chia sẻ cùng một dữ liệu sao lưu để cải thiện hiệu suất. –
Cảm ơn @Eyal. Điều đó có ý nghĩa. Nhìn về phía trước khi họ phơi bày một API công khai cho việc này. Tôi có thể thử bản hack này ngay bây giờ, nhưng bây giờ tôi đang sử dụng Webview với RapahelJS để giải quyết vấn đề này. Bạn đã nhầm lẫn với thư viện hỗ trợ mà họ đang phát triển cho VectorDrawable để xem liệu điều này sẽ làm việc trên đó là tốt? https://android.googlesource.com/platform/frameworks/support/+/master/v7/vectordrawable/ –
- 1. triển khai android: button = "@ drawable/checkbox" theo chương trình
- 2. Cập nhật Android OS theo lập trình
- 3. Cập nhật sản phẩm theo chương trình trong Magento
- 4. Cập nhật bảng {node_counter} theo chương trình trong drupal
- 5. Tạm thời tắt tự động cập nhật theo chương trình
- 6. Magento: Cập nhật số lượng giỏ hàng theo chương trình
- 7. Trường RxSwift - UILabel không được cập nhật khi UITextField cập nhật theo chương trình
- 8. Các tệp thẻ SD được cập nhật theo chương trình không được cập nhật trong windows explorer
- 9. Truy cập iSight theo chương trình?
- 10. Cập nhật mới nhất về bật và tắt dữ liệu di động theo chương trình
- 11. XmlPullParserException: không hợp lệ drawable thẻ vector
- 12. Android chụp màn hình theo chương trình
- 13. Android: Bật thiết bị theo chương trình
- 14. Drawable-hdpi, Drawable-mdpi, Drawable-ldpi Android
- 15. Làm thế nào để cập nhật nội dung theo chương trình trong Phần Web SharePoint?
- 16. Không thể cập nhật InfluenceScore trên Tiểu sử trên mạng xã hội theo chương trình
- 17. Keycloak: cách thêm/cập nhật người dùng với vai trò theo chương trình?
- 18. Cập nhật thời gian đã lên lịch cho webjob của azure theo chương trình
- 19. android lập trình mờ ảo tưởng drawable
- 20. android: chọn trình khởi chạy mặc định theo chương trình
- 21. Cách đặt điều khiển lấy nét tiếp theo của Android ActionBar theo chương trình
- 22. Cập nhật tiến trình AnimateBar trong Android
- 23. Cách đọc thư thoại theo chương trình trong Android
- 24. Xóa thanh cuộn khỏi ScrollView theo chương trình trong Android
- 25. Android vector drawable cho biểu tượng trình khởi chạy và các hình ảnh khác trên Android N
- 26. Thay đổi hình ảnh theo chương trình?
- 27. Truy cập tài nguyênDịch vụ từ điển theo chương trình
- 28. Tạo ListView theo chương trình
- 29. Cách truy cập màn hình chính mặc định của Android theo chương trình?
- 30. Android: thay đổi chương trình nhãn ứng dụng theo chương trình?
bạn có ans không? – Shreeshesh
Bạn cần phải sử dụng nhiều bản vẽ hoặc có thể vẽ được dễ dàng. Tại sao bạn không muốn sử dụng AnimatedVectorDrawable? –
đăng bản vẽ tùy chỉnh của bạn. điều đó sẽ giúp chúng ta. –