[英]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.