2013-07-29 5 views
9

Bir RelativeLayout küçültün ObjectAnimator kullanın: Oldukça iyi beklendiği gibi aşağı ölçekler, ancak sorun artık daha küçük görünüm çevresi istenmeyen başka bir kullanıcı eylemi kadar siyah olmasıdırÖlçek özelliği ile ObjectAnimator bg siyah yapar?

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

. Ölçeklendirilmiş görünümün ebeveyni ile eşleşmesini istiyorum. Kırmızı karenin etrafındaki alanı nasıl yapacağınıza dair herhangi bir fikir hemen doğru renklere sahip mi?

enter image description here

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

cevap

21

En temiz çözüm olmayabilir, ama animasyon güncelleme dinleyicisi ekleme ve işi yapabilecek ebeveyn geçersiz.

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

Google'ın mühendisi Chet Haase tarafından DevBytes: Property Animations videoda bulunabilir edinilebilir, ancak ebeveyn gereksiz bir iş yükü olabilir yaklaşık 20 kez, geçersiz olur. Eh, daha iyi bir çözüm bulana kadar sanırım this.thx ile yaşamak zorunda kalacağım. – slezadav

+0

Diğer cevap daha temiz ve daha iyi – afollestad

+0

"scaleX" ve "scaleY" View.SCALE_X.getName() ve View ile değiştirilebilir. SCALE_Y.getName() – dor506

30

Önceki yanıtın ana bilgisayarı geçersiz kılması gerekliliğinin nedeni, AnimatorSet ürününüzün Hedefinin hiçbir Hedefi olmamasıdır. ObjectAnimator'ınızın Hedefini null değerine getirmeli ve Hedefi AnimatorSet'e ayarlamalısınız.

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

Animasyonlu görünüm hiyerarşideki ilk görünüm olduğunda, her iki çözüm de çalışmaz. ebeveyn, Android tarafından sağlanan FrameLayout'tur. Her ikisi de mevcut uygulamada bir ebeveyn ile çocuk görünümünde animasyon yaparken mükemmel bir şekilde çalışır. –

0

açıklamalarda belirtildiği gibi, bir ObjectAnimator görünümün durağan Property nesne kullanmaktır yaratma yerine dize değeri içerir kullanan beri dize geçirilmesi için bir yaklaşım: Ya da daha iyi bir yolu aşağıdaki kodu kullanmak olacaktır özniteliğin başlangıç ​​değerini elde etmek için ayarlayıcı ve isteğe bağlı olarak alıcı için yansıma. Bu API 14

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

tam açıklaması Bunu da düşündüm