Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/217.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 扩展表面视图';从未调用s onDraw()方法_Android - Fatal编程技术网

Android 扩展表面视图';从未调用s onDraw()方法

Android 扩展表面视图';从未调用s onDraw()方法,android,Android,我正在尝试修改用于进行相机预览的SurfaceView,以便显示叠加的正方形。但是,从未调用扩展的SurfaceView的onDraw方法 资料来源如下: public class CameraPreviewView extends SurfaceView { protected final Paint rectanglePaint = new Paint(); public CameraPreviewView(Context context, AttributeSet at

我正在尝试修改用于进行相机预览的SurfaceView,以便显示叠加的正方形。但是,从未调用扩展的SurfaceView的onDraw方法

资料来源如下:

public class CameraPreviewView extends SurfaceView {

    protected final Paint rectanglePaint = new Paint();

    public CameraPreviewView(Context context, AttributeSet attrs) {
        super(context, attrs);
        rectanglePaint.setARGB(255, 200, 0, 0);
        rectanglePaint.setStyle(Paint.Style.FILL);
        rectanglePaint.setStrokeWidth(2);
    }

    @Override
    protected void onDraw(Canvas canvas){
        canvas.drawRect(new Rect(10,10,200,200), rectanglePaint);
        Log.w(this.getClass().getName(), "On Draw Called");
    }
}

public class CameraPreview extends Activity implements SurfaceHolder.Callback{

    private SurfaceHolder holder;
    private Camera camera;

    @Override
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);

        // We remove the status bar, title bar and make the application fullscreen
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);

        // We set the content view to be the layout we made
        setContentView(R.layout.camera_preview);

        // We register the activity to handle the callbacks of the SurfaceView
        CameraPreviewView surfaceView = (CameraPreviewView) findViewById(R.id.camera_surface);
        holder = surfaceView.getHolder();

        holder.addCallback(this);
        holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    }

    public void surfaceChanged(SurfaceHolder holder, int format, int width,
            int height) {

        Camera.Parameters params = camera.getParameters();

        params.setPreviewSize(width, height);
        camera.setParameters(params);

        try {
            camera.setPreviewDisplay(holder);
        } catch (IOException e) {
            e.printStackTrace();
        }

        camera.startPreview();

    }

    public void surfaceCreated(SurfaceHolder holder) {
        camera = Camera.open();
    }

    public void surfaceDestroyed(SurfaceHolder holder) {
        camera.stopPreview();
        camera.release();   
    }


}

在安卓开发者谷歌群上找到的。您只需添加:

setWillNotDraw(false)
给构造器。如果有人能解释一下原因,我将不胜感激。

小更正:

将setWillNotDraw(false)添加到构造函数将导致崩溃,因为尚未创建基础曲面对象

相反,将setWillNotDraw(false)语句放入surfaceCreated()方法中。这会延迟调用,直到有一个真正的对象可以使用并正常工作

(非常感谢发布此解决方案的用户,它为我解决了一个重大问题)

Romain Guy it:

为了提高效率,布局不会调用其
onDraw()
方法。到 启用它,调用setwillnotpaurenabled(false)(或设置等效项 XML属性设置为false。)


基于我使用的所有上述评论:

在onAttachedToWindow()事件中添加setWillNotDraw(false)

@覆盖
受保护的无效数据附加到DOWINDOW(){
super.onAttachedToWindow();
setWillNotDraw(假);
}


它成功了。

我要说的是,从来不会调用onDraw,因为调试器从来不会在方法中的断点上停止,而不是在构造函数中的断点上停止。另一方面,相机预览显示正确。哇,谢谢你,我想知道为什么我的视图的onDraw()方法从未被调用。我看到javadoc说“通常,如果覆盖onDraw(Canvas),您应该清除这个标志”,因此,如果您有一个没有任何小部件的视图,那么可能需要设置它。只是一个猜测:)哦,上帝,谢谢你的回答,我有一个不同的问题,但它也源于没有设置这个标志。一直在搜索解决方案。我认为SurfaceView在默认情况下已将WillNotDraw设置为false,因为它实际上是要从另一个线程(使用getHolder().lockCanvas()进行更新)。在onDraw中添加其他绘图将是低效的。如果你只需要onDraw,你可以直接从android.view.view派生出来。虽然人们通常会将
SurfaceView
子类化,并让它实现
SurfaceHolder.Callback
,但它不是必需的;在
surfaceCreated
中执行此操作只有在其类实现时才是一个选项。请注意,在构造函数中调用
setWillNotDraw(false)
会在什么情况下导致崩溃?XML属性的等效值是什么?