2016-04-25 125 views
0

我在android中使用一些動畫創建了簡單的應用程序。在我的佈局中,我有一個帶有一個sourceImage和一個按鈕的ImageView。當我點擊按鈕時,我希望它在同一時間移動並調整大小。 我使用ObjectAnimator和ValueAnimator創建動畫,並與animatorSet一起播放它們。我的問題是,我的按鈕不能順利移動。 我查了幾個動畫庫,如Transitions Everywhere和APIDemos。在這些庫中,當我設置ImageBackground時,視圖無法平穩移動 並且它們都有我的問題。 任何人都可以幫我解決這個問題嗎?Android動畫在BackgroundImage上不流暢

我的佈局代碼:

<android.support.design.widget.CoordinatorLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:fitsSystemWindows="true" 
tools:context=".MainActivity"> 

<ImageView 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:id="@+id/imageview" 
    android:fitsSystemWindows="true" 
    android:src="@drawable/image" 
    android:scaleType="fitXY" /> 

<FrameLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:id="@+id/frame"> 

    <Button 
     android:layout_width="100dp" 
     android:layout_height="45dp" 
     android:id="@+id/btn_start" 
     android:layout_gravity="center_horizontal|bottom" 
     android:gravity="center_vertical|center_horizontal" 
     android:textAllCaps="false" 
     android:layout_alignParentBottom="true" 
     android:layout_centerHorizontal="true" 
     android:text="Start" /> 
// .................... 
</FrameLayout> 
</android.support.design.widget.CoordinatorLayout> 

我的動畫代碼:

btn_start.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      ButtonAnimation(); 
    } 
}); 

private void ButtonAnimation() { 
    Animator moveButtonAnimY = ObjectAnimator.ofFloat(btn_start, "translationY", 0, 200) 
      .setDuration(500); 
    final ValueAnimator valueAnimator = ValueAnimator.ofFloat(width_btn_start, width_btn_start * 2.0f); 
    valueAnimator.setDuration(500); 
    valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 
     public void onAnimationUpdate(ValueAnimator animation) { 
      Integer value = (Integer) animation.getAnimatedValue(); 
      btn_start.getLayoutParams().width = value.intValue(); 
      btn_start.requestLayout(); 
     } 
    }); 

    AnimatorSet animatorSet = new AnimatorSet(); 
    animatorSet.playTogether(moveButtonAnimY, valueAnimator); 
    animatorSet.start(); 
}  

回答

0

根據維基百科:

動畫是通過手段讓運動和變化的錯覺的過程快速顯示一系列彼此最小差異的靜態圖像。

因此,動畫是設備處理的一個相當繁重的任務,並且所引用的平滑度取決於設備配置。

因此,首先檢查設備是否有足夠的電力順利地執行該動畫。其次,每次單擊按鈕時,您的代碼都會初始化動畫,而您應該初始化一次動畫,並在每次需要啓動動畫時使用它們的實例。

一個更好版本的代碼是:

btn_start.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     ButtonAnimation(); 
    } 
}); 
Animator moveButtonAnimY = ObjectAnimator.ofFloat(btn_start,"translationY", 0, 200).setDuration(500); 
ValueAnimator valueAnimator = ValueAnimator.ofFloat(width_btn_start, width_btn_start * 2.0f); 
valueAnimator.setDuration(500); 
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 
    public void onAnimationUpdate(ValueAnimator animation) { 
     Integer value = (Integer) animation.getAnimatedValue(); 
     btn_start.getLayoutParams().width = value.intValue(); 
     btn_start.requestLayout(); 
    } 
}); 
AnimatorSet animatorSet = new AnimatorSet(); 
animatorSet.playTogether(moveButtonAnimY, valueAnimator); 

private void ButtonAnimation() { 
    animatorSet.start(); 
} 
+0

阿洛克,我測試你的代碼在我的LG G3,但不會看到動畫速度的任何變化! – MohsenTi