2013-07-29 10 views
9

używam ObjectAnimator skalowanie w dół RelativeLayout:ObjectAnimator z właściwością scale sprawia, że ​​bg jest czarny?

  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(); 

To skaluje w dół dość dobrze, jak oczekiwano, ale problemem jest to, że obszar wokół teraz mniejszy widzenia jest czarny aż innego działania użytkownika, co jest niepożądane. Chcę, aby pasował do tła rodzica skalowanego widoku. Każdy pomysł, jak sprawić, by obszar wokół czerwonego kwadratu miał natychmiast właściwy kolor?

enter image description here

Moje xml:

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

Odpowiedz

21

To nie może być najczystszym rozwiązanie, ale dodanie aktualizacji animacja słuchacza i unieważniania rodzica może wykonać zadanie.

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

myślałem o tym, ale rodzic zostaje unieważniona około 20 razy, co może stanowić niepotrzebne obciążenie. Cóż, dopóki nie znajdę lepszego rozwiązania, myślę, że będę musiał z tym żyć.thx – slezadav

+0

Inna odpowiedź jest czystsza i lepsza – afollestad

+0

"scaleX" i "scaleY" można zastąpić View.SCALE_X.getName() i View. SCALE_Y.getName() – dor506

30

Powodem poprzednia odpowiedź jest konieczności unieważnić rodzic ponieważ AnimatorSet scaleDown ma docelowy. Powinieneś ustawić Target twojego ObjectAnimatora na zerowy i ustawić Target na AnimatorSet. Lub lepszym sposobem byłoby użyć poniższy kod:

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

Oba rozwiązania nie działają, gdy animowany widok jest pierwszym widokiem w hierarchii, np. rodzicem jest FrameLayout dostarczony przez Androida. Oba działają idealnie dobrze podczas animowania widoku podrzędnego z rodzica w bieżącej aplikacji. –

0

Jak wspomniano w komentarzach, podejście do tworzenia ObjectAnimator jest użycie widoku za statyczną Property obiekt zamiast przechodzącą ciąg od użyciu wartość ciągu polega refleks dla settera i opcjonalnie dla gettera w celu wyprowadzenia wartości początkowej atrybutu. Jest dostępny od API 14

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

Pełne wyjaśnienie można znaleźć w DevBytes: Property Animations wideo przez inżyniera Google Chet Haase