【问题标题】:Android drawing on surfaceview and canvasAndroid在surfaceview和canvas上绘图
【发布时间】:2012-06-11 11:37:25
【问题描述】:

我有一个“简单”的问题。我试着在surfaceview上画画。布局-XML:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:keepScreenOn="true"
    android:orientation="vertical" >

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/hello" />

    <SurfaceView
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/imagesurface"
        android:layout_height="fill_parent"
        android:layout_width="fill_parent"
        android:background="#00ff00">
    </SurfaceView>

</LinearLayout>

Activity 是一个 SurfaceHolder.Callback:

public class OpenCvonAndroidGTDforHOGActivity extends Activity implements SurfaceHolder.Callback{

    private SurfaceHolder _surfaceHolder;
    private SurfaceView _surfaceView;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        _surfaceView = (SurfaceView)findViewById(R.id.imagesurface);
        _surfaceHolder = _surfaceView.getHolder();
        _surfaceHolder.addCallback(this);
        _surfaceView.setWillNotDraw(false);

    }

    protected void onDraw(Canvas canvas) {
        canvas.drawRGB(255, 0, 255);            
    }

    public void surfaceCreated(SurfaceHolder holder) {
        Canvas canvas = null;
        try {
            canvas = holder.lockCanvas();
            synchronized(holder) {
                onDraw(canvas);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (canvas != null) {
                holder.unlockCanvasAndPost(canvas);
            }
        }
    }


    public void showToast(String msg) {
        Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_SHORT).show();
    }
}

如果我打电话

_surfaceview.setBackground(Color.RED) 在 onDraw(...) 它工作。但是

canvas.drawRGB(255, 0, 255) 不工作:(

【问题讨论】:

    标签: android drawing


    【解决方案1】:

    SurfaceView 由当前布局中的 View 和布局下的表面组成。如果您为视图设置背景,您将看不到表面上发生的任何事情。

    【讨论】:

      【解决方案2】:

      你试过了吗

      yourHolder.unlockCanvassAndPost(your_canvas);
      

      【讨论】:

        【解决方案3】:

        以下代码段将对您有所帮助。

        public class SurfaceDemo extends Activity implements SurfaceHolder.Callback {
        
            private static final String TAG = "Svetlin SurfaceView";
        
            /** Called when the activity is first created. */
            @Override
            public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
        
                SurfaceView view = new SurfaceView(this);
                setContentView(view);
                view.getHolder().addCallback(this);
            }
        
            @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);
            }
        }
        

        【讨论】:

        • 它有效。但是为什么不能使用 xml-layout 中的surfaceview?
        • 它是因为您提到了 android:background="#00ff00"。如果您删除它,那么您的代码将起作用。虽然我不知道是什么原因。
        • 谢谢。它可以在没有 android:background="#00ff00" 的情况下工作。不管为什么。
        • 稍后添加到帖子中,因为您只是在颜色的背景上添加颜色
        • 为什么在 void drawMyStuff(final Canvas canvas) 中需要字符串 Random random = new Random();?)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多