Android在Listview中的Surfaceview性能不佳

时间:2013-02-08 13:07:18

标签: android listview surfaceview

我有一个Android应用程序,其布局包含Listview,用

夸大
      LayoutInflater inflater = getLayoutInflater();
      row = inflater.inflate(R.layout.disc_row, parent, false);

“R.layout.disc_row”包含绘制画布的SurfaceView。所以ListView中的每一行都包含一个Canvas。滚动列表时,画布停留在其位置,而行的其他元素滚动。我认为它的设备性能很差。在点击ListItem之前,相同的应用程序不会在模拟器上绘制任何内容。

有没有更好的策略来绘制ListViews(没有位图,只是一些行)可能与Paint? 模拟器系统在活动中做了太多工作。

提前致谢

附上CLASS

public class DrawDiscInListView extends SurfaceView implements
    SurfaceHolder.Callback {

private static final String TAG = "DISCONT SurfaceView";

public DrawDiscInListView(Context context, AttributeSet attrs) {
    super(context, attrs);
    // TODO Auto-generated constructor stub
}

@Override
public void surfaceCreated(SurfaceHolder holder) {
    tryDrawing(holder);
}

@Override
public void surfaceChanged(SurfaceHolder holder, int frmt, int w, int h) {
    tryDrawing(holder);
}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
}

private void tryDrawing(SurfaceHolder holder) {
    Log.i(TAG, "Trying to draw...");

    Canvas canvas = holder.lockCanvas();
    if (canvas == null) {
        Log.e(TAG, "Cannot draw onto the canvas as it's null");
    } else {
        drawMyStuff(canvas);
        holder.unlockCanvasAndPost(canvas);
    }
}

private void drawMyStuff(final Canvas canvas) {
    Random random = new Random();
    Log.i(TAG, "Drawing...");
    canvas.drawRGB(255, 128, 128);
}

}

3 个答案:

答案 0 :(得分:2)

我做了一些研究,我想在这里分享一下:

而不是使用SurfaceView我最终使用ImageView: 我使用Canvas创建了一个Bitmap,然后在Listview中使用了位图。它工作正常,不会损失性能。

答案 1 :(得分:2)

迟到的回复,以防您或其他人可能需要。

如果您只是在没有任何动画或动画的情况下绘制一些基本数字,您可以只是继承View并覆盖 onDraw(Canvas)方法。

它仍然使用画布来创建图形,但它比创建Bitmap所需的内存更少,并在ImageView中使用它。

答案 2 :(得分:0)

我遇到了同样的问题“当滚动列表时画布停留在其位置而行的其他元素正在滚动”,这也发生在VideoView上。

解决方案只是将SurfaceView的背景设置为透明,例如android:background="#0000"

我希望这有帮助!

由于