2015-03-01 19 views
22

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

+3

bạn có ans không? – Shreeshesh

+0

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? –

+0

đăng bản vẽ tùy chỉnh của bạn. điều đó sẽ giúp chúng ta. –

Trả lời

17

Nói tóm lại:

  1. Bạn không có một truy cập trực tiếp đến các yếu tố bên trong VectorDrawable.
  2. AnimatedVectorDrawable chỉ có quyền truy cập vào các yếu tố bên trong.
  3. 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êngetTargetByName, 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ảo mutate đối tượng.
+0

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? –

+1

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. –

+0

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/ –

0

Sử dụng số library này để truy cập trực tiếp vào các yếu tố bên trong. Công cụ này đang triển khai answer

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