2015-04-10 2 views
0

Я создал простую анимацию в CustomView для перехода к видам деятельности. Все отлично, за исключением анимации. При увеличении радиуса круга появляются видимые лаги. Как я могу повысить производительность, чтобы избежать задержек?Android - актерская анимация на холсте

public class CircleAnimationView extends View { 

... 
public void startAnimation(int x, int y) { 
    startX = x; 
    startY = y; 

    baseAnimator = ObjectAnimator.ofFloat(this, "baseRadius", 0, maxRadius) 
      .setDuration(1000); 
    baseAnimator 
      .setInterpolator(new AccelerateDecelerateInterpolator()); 
    baseAnimator.start(); 

    finalAnimator = ObjectAnimator.ofFloat(this, "finalRadius", 0, maxRadius) 
      .setDuration(2000); 
    finalAnimator 
      .setInterpolator(new AccelerateDecelerateInterpolator()); 
    if(listener!=null) 
     finalAnimator.addListener(listener); 
    finalAnimator.start(); 
} 

public void setBaseRadius(final float radius) { 
    radiusBase = radius; 
    invalidate(); 
} 

public void setFinalRadius(final float radius) { 
    radiusFinal = radius; 
    invalidate(); 
} 

@Override 
protected void onDraw(Canvas canvas) { 
    super.onDraw(canvas); 
    if (isInEditMode()) { 
     return; 
    } 
    canvas.drawCircle(startX, startY, radiusBase, basePaint); 
    canvas.drawCircle(startX, startY, radiusFinal, finalPaint); 
} 
}; 

Я использовал представление в XML:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/main_layout" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <RelativeLayout 
     android:id="@+id/content_layout" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:gravity="center"> 

    </RelativeLayout> 

    <pl.org.ldi.challenge.views.CircleAnimationView 
     android:id="@+id/circle_animation" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     app:base_color="@color/blue" 
     app:final_color="@color/white"/> 

</RelativeLayout> 

Edit: я проверяю .trace файл с анимации, и это выглядит, что рисование большого круг занимает слишком много времени - метод GLES20Canvas.nDrawDisplayList

+0

попытался использовать AnimatorSet, чтобы воспроизвести их вместе? – pskink

+0

да, без разницы – koliczyna

+0

попробовал только одну анимацию? вы уверены, что startAnimation() не вызывается дважды или более раз? – pskink

ответ

-1

Вы можете использовать обработчик для вызова invalidate с помощью метода postDelayed(). Вызывайте эти методы через регулярные интервалы времени анимации. Вы можете рассчитать радиус в соответствии с соотношением current_time/total_time и умножить на максимальный радиус, который вы хотите.

0

После набора:

finalAnimator.setFrameDelay(0); 
baseAnimator.setFrameDelay(0); 

анимация выглядит плавно. Спасибо за совет!

Смежные вопросы