我开发了一款益智游戏。在我的游戏中,我有几个自定义视图,它们嵌套在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或帧动画或其他东西?
答案 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();