簡體   English   中英

Android Listview中Surfaceview的性能不佳

[英]Android Poor performance of surfaceview in Listview

我有一個Android應用,其布局包含一個Listview,該列表膨脹了

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

“ R.layout.disc_row”包含一個繪制畫布的SurfaceView。 因此ListView中的每一行都包含一個Canvas。 在滾動列表時,畫布停留在原處,而該行的其他元素在滾動。 我認為這是該設備的不良行為。 在單擊ListItem之前,同一應用程序不會在模擬器上繪制任何內容。

有沒有更好的策略可以在ListViews(沒有位圖,只有幾行)中進行繪制? 模擬器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);
}

}

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

最后,我沒有使用SurfaceView,而是使用了ImageView:我使用Canvas創建位圖,然后在Listview中使用了位圖。 它工作正常,並且沒有性能損失。

如果您或其他人可能需要,請及時回復。

如果您只是在繪制一些基本圖形而沒有任何動畫或少量動畫,則可以僅子類化View並重寫onDraw(Canvas)方法。

雖然它仍然使用畫布來創建圖形,但是它比創建位圖並在ImageView中使用它要占用更少的內存。

我有一個同樣的問題“在滾動列表時,畫布將停留在其位置,而行的其他元素在滾動”,這也發生在VideoView中,即

解決方案只是將SurfaceView的背景設置為透明,例如android:background="#0000"

我希望這有幫助!

謝謝

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM