Android View动画 - 在大屏幕上表现不佳

时间:2011-12-26 03:37:50

标签: android performance animation

我开发了一款益智游戏。在我的游戏中,我有几个自定义视图,它们嵌套在FrameLayout中,就像图层一样。每个视图都显示一个位图。最大的位图是游戏板,大约占屏幕尺寸的2/3。 FrameLayout下还有背景图像。

当用户触摸屏幕时,使用此游戏板视图执行简单的视图动画 - 可以旋转或翻转。

这一切在小屏幕上运行良好,但是用户在Galaxy Tab上报告了性能问题 - 在动画开始之前有一个明显的滞后,动画本身并不平滑。 (这些屏幕上的游戏板位图大小约为600 * 600px)

这是我的布局:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/rootFrame"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <ImageView
        android:id="@+id/backgroundImageLayer"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:src="@drawable/background"
        android:scaleType="fitXY"/>

    <FrameLayout android:id="@+id/gameFrame"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

            <com.mygame.BoardView
            android:id="@+id/boardLayer"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"/>

            <com.mygame.SomeObjectView
            android:id="@+id/someObjectLayer"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"/>

            <com.mygame.SomeOtherObjectView
            android:id="@+id/someOtherObjectLayer"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"/>

        </FrameLayout>    

</FrameLayout>

这是我的BoardView课程。

public class BoardView extends View {

Bitmap b;
int x;
int y;

public BoardView(Context context, AttributeSet attrs) {
    super(context, attrs);
    // calculate size of the bitmap
    b = Bitmap.createBitmap(sizeX, sizeY, Bitmap.Config.ARGB_4444);
    createMyBitmap();
}

private void createMyBitmap() {
    Canvas c;
    c = new Canvas(b);
    // lots of c.drawRect() and c.drawLine() , using opaque and semi-transparent colors
}

@Override
public void onDraw(Canvas canvas) {
    canvas.drawBitmap(b, x, y, null);
}
}

我做动画的片段,很简单:

AnimationRotate anim1=new AnimationRotate(startAngle,endAngle,centerX,centerY);
anim1.setDuration(500);
anim1.setInterpolator(newDecelerateInterpolator());
startAnimation(anim1);

那么是什么导致视图动画滞后,我该如何解决? 我的方法是正确的还是我应该使用SurfaceView或帧动画或其他东西?

4 个答案:

答案 0 :(得分:11)

启用硬件加速(如果尚未启用)。布局渲染系统在3.0+中进行了修改,通过将大多数软件渲染转移到硬件中来提高这些大屏幕的性能。您关心的更多信息here

有些东西不适用于硬件加速,但从你所展示的内容来看,你没事。启用它的最简单方法是将其添加到应用程序的清单和目标3.0或更高版本(如在构建中,您仍然可以支持较低的api级别)

<application android:hardwareAccelerated="true"
...
>

答案 1 :(得分:3)

我已经知道设置以下属性有助于提高性能:

this.setAnimationCacheEnabled(true);
this.setDrawingCacheEnabled(true);

答案 2 :(得分:1)

据我所知,当屏幕变大时,所有2D-Graphic命令都非常慢,并且继续减速。我建议设置一个3D-Surfaceview将图像作为纹理放在四边形上并渲染它。这比使用2D-Gfx要快得多。

答案 3 :(得分:0)

您从here

读取
View.setLayerType(View.LAYER_TYPE_HARDWARE, null);
ObjectAnimator animator = ObjectAnimator.ofFloat(view, "rotationY", 180);
animator.addListener(new AnimatorListenerAdapter() {
    @Override
    public void onAnimationEnd(Animator animation) {
        view.setLayerType(View.LAYER_TYPE_NONE, null);
    }
});
animator.start();