0

我有一个 android 应用程序,其布局包含一个 Listview,它被充气

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

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

有没有更好的在 ListViews 内绘制的策略(没有位图,只有一些线条)可能使用 Paint?模拟器系统它在活动中做了太多的工作。

提前致谢

附加类

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);
}

}

4

3 回答 3

2

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

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

于 2013-02-08T17:28:44.517 回答
2

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

如果你只是画一些没有任何动画或小动画的基本图形,你可以只继承 View 并覆盖onDraw(Canvas)方法。

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

于 2013-11-07T14:36:38.340 回答
0

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

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

我希望这有帮助!

谢谢

于 2014-12-24T14:55:24.530 回答