2013-07-29 21 views
9

tôi sử dụng ObjectAnimator phải thu hẹp một RelativeLayout:ObjectAnimator với tài sản quy mô làm cho màu đen bg?

  ObjectAnimator scaleDownX = ObjectAnimator.ofFloat(view, "scaleX", 0.5f); 
      ObjectAnimator scaleDownY = ObjectAnimator.ofFloat(view, "scaleY", 0.5f); 
      scaleDownY.setDuration(1000); 
      AnimatorSet scaleDown = new AnimatorSet(); 
      scaleDown.play(scaleDownX).with(scaleDownY); 
      scaleDown.start(); 

Nó quy mô xuống khá tốt như mong đợi, nhưng vấn đề là các khu vực xung quanh xem bây giờ nhỏ hơn là màu đen cho đến khi một hành động của người dùng, mà là không mong muốn. Tôi muốn nó để phù hợp với nền của cha mẹ của xem tỉ lệ. Bất kỳ ý tưởng làm thế nào để làm cho khu vực xung quanh hình vuông màu đỏ có màu sắc chính xác ngay lập tức?

enter image description here

xml của tôi:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:gui="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:id="@+id/bg" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    tools:context=".MainActivity$DummySectionFragment"> 
     <RelativeLayout 
     android:id="@+id/res1" 
     android:layout_width="50dp" 
     android:layout_height="50dp" 
     android:tag="res1" 
     android:background="@android:color/holo_red_dark" 
     android:layout_alignTop="@+id/res2" 
     android:layout_alignRight="@+id/include3" 
     android:layout_marginRight="11dp"> 
      <TextView 
       android:layout_marginLeft="15dp" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:text="res1" 
       android:id="@+id/res1T" 
       android:layout_centerVertical="true" 
       android:layout_centerHorizontal="true"/> 
     </RelativeLayout> 
    </RelativeLayout> 

Trả lời

21

Nó có thể không phải là giải pháp sạch, nhưng thêm cập nhật hình ảnh động người nghe và làm vô hiệu các phụ huynh có thể thực hiện công việc.

ObjectAnimator scaleDownX = ObjectAnimator.ofFloat(view, "scaleX", 0.5f); 
ObjectAnimator scaleDownY = ObjectAnimator.ofFloat(view, "scaleY", 0.5f); 
scaleDownX.setDuration(1000); 
scaleDownY.setDuration(1000); 

AnimatorSet scaleDown = new AnimatorSet(); 
scaleDown.play(scaleDownX).with(scaleDownY); 

scaleDownX.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 
    @Override 
    public void onAnimationUpdate(ValueAnimator valueAnimator) { 
     View p= (View) v.getParent(); 
     p.invalidate(); 
    }); 
scaleDown.start(); 
+0

Tôi nghĩ về điều đó, nhưng phụ huynh bị mất hiệu lực khoảng 20 lần, trong đó có thể là một khối lượng công việc không cần thiết. Vâng, cho đến khi tôi tìm thấy một số giải pháp tốt hơn tôi đoán tôi sẽ phải sống với this.thx – slezadav

+0

Câu trả lời khác là sạch hơn và tốt hơn – afollestad

+0

"scaleX" và "scaleY" có thể được thay thế bằng View.SCALE_X.getName() và View. SCALE_Y.getName() – dor506

30

Lý do tại sao câu trả lời trước đó là cần làm mất hiệu lực của cha mẹ là vì AnimatorSet scaleDown của bạn không có Target. Bạn nên đặt Target của ObjectAnimator thành null và đặt Target trên AnimatorSet. Hoặc một cách tốt hơn sẽ được sử dụng vào mã bên dưới:

ObjectAnimator scaleDown = ObjectAnimator.ofPropertyValuesHolder(view, 
    PropertyValuesHolder.ofFloat("scaleX", 0.5f), 
    PropertyValuesHolder.ofFloat("scaleY", 0.5f)); 
scaleDown.setDuration(1000); 
scaleDown.start(); 
+1

Cả hai giải pháp đều không hoạt động khi chế độ xem động là chế độ xem đầu tiên trong cấu trúc phân cấp, ví dụ: cha mẹ là FrameLayout được cung cấp bởi Android. Cả hai hoạt động hoàn toàn tốt khi tạo hoạt ảnh cho chế độ xem con với cha/mẹ trong ứng dụng hiện tại. –

0

Như đã trình bày trong các ý kiến, cách tiếp cận để tạo một ObjectAnimator là sử dụng của Xem đối tượng tĩnh Property thay vì đi qua các chuỗi từ bằng cách sử dụng chuỗi giá trị liên quan đến phản ánh cho setter và tùy chọn cho getter để lấy được giá trị bắt đầu của thuộc tính. Đây là có sẵn từ API 14

ObjectAnimator scaleDownX = ObjectAnimator.ofFloat(view, View.SCALE_X, 0.5f); 
ObjectAnimator scaleDownY = ObjectAnimator.ofFloat(view, View.SCALE_Y, 0.5f); 

Một giải thích đầy đủ có thể được tìm thấy trong DevBytes: Property Animations video bằng kỹ sư của Google Chet Haase

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