0

私はリストビューを含むレイアウトを持つアンドロイドアプリを持っています。

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

「R.layout.disc_row」には、キャンバスを描画する SurfaceView が含まれています。そのため、ListView 内の各行には Canvas が含まれています。リストをスクロールしている間、行の他の要素がスクロールしている間、キャンバスはその場所にとどまります。デバイスの動作が悪いと思います。ListItem をクリックするまで、同じアプリはエミュレーターで何も描画しません。

おそらくペイントを使用して、ListViews (ビットマップではなく、いくつかの行のみ) 内で描画するためのより良い戦略はありますか? emulator sys アクティビティで作業が多すぎます。

前もって感謝します

付属クラス

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 を使用しました。キャンバスを使用してビットマップを作成し、リストビューでビットマップを使用しました。パフォーマンスを損なうことなく、正常に動作します。

于 2013-02-08T17:28:44.517 に答える
2

あなたまたは他の誰かが必要とする場合に備えて、遅い応答。

アニメーションやアニメーションをほとんど使用せずにいくつかの基本的な図形を描画するだけの場合は、View をサブクラス化し、onDraw(Canvas)メソッドをオーバーライドするだけです。

ただし、キャンバスを使用して図を作成しますが、ビットマップを作成して ImageView で使用するよりもメモリが少なくて済みます。

于 2013-11-07T14:36:38.340 に答える
0

「リストをスクロールしている間、行の他の要素がスクロールしている間、キャンバスはその場所にとどまっています」という同じ問題がありました。これは、VideoView ie でも発生します。

解決策は、SurfaceView の背景を透明に設定するだけです。android:background="#0000"

これが役立つことを願っています!

ありがとう

于 2014-12-24T14:55:24.530 に答える