本文介绍了扩展SurfaceView的OnDraw()方法从来没有所谓的的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想修改我用做一个摄像头preVIEW,以显示覆盖广场SurfaceView。但是,扩展SurfaceView的OnDraw的方法不会被调用。

下面是源:

 公共类相机previewView延伸SurfaceView {

    保护面漆rectanglePaint =新的油漆();

    公共摄像头previewView(上下文的背景下,ATTRS的AttributeSet){
        超(背景下,ATTRS);
        rectanglePaint.setARGB(255,200,0,0);
        rectanglePaint.setStyle(Paint.Style.FILL);
        rectanglePaint.setStrokeWidth(2);
    }

    @覆盖
    保护无效的OnDraw(帆布油画){
        canvas.drawRect(新的矩形(10,10,200,200),rectanglePaint);
        Log.w(this.getClass()的getName(),关于抽奖之称。);
    }
}

公共类相机preVIEW延伸活动实现SurfaceHolder.Callback {

    私人SurfaceHolder持有人;
    私人摄像头摄像头;

    @覆盖
    保护无效的onCreate(包savedInstanceState){
        super.onCreate(savedInstanceState);

        //我们删除了状态栏,标题栏,使应用程序全屏
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow()。setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);

        //我们设置的内容视图是我们做了布局
        的setContentView(R.layout.camera_ preVIEW);

        //我们注册活动来处理SurfaceView的回调
        相机previewView surfaceView =(相机previewView)findViewById(R.id.camera_surface);
        支架= surfaceView.getHolder();

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

    公共无效surfaceChanged(SurfaceHolder持有人,INT格式,诠释的宽度,
            INT高度){

        Camera.Parameters PARAMS = camera.getParameters();

        params.set previewSize(宽,高);
        camera.setParameters(PARAMS);

        尝试 {
            camera.set previewDisplay(保持器);
        }赶上(IOException异常E){
            e.printStackTrace();
        }

        camera.start preVIEW();

    }

    公共无效surfaceCreated(SurfaceHolder持有者){
        相机= Camera.open();
    }

    公共无效surfaceDestroyed(SurfaceHolder持有者){
        camera.stop preVIEW();
        camera.release();
    }


}
 

解决方案

发现它在Android的开发者谷歌组。您只需添加:

  setWillNotDraw(假)
 

要构造。现在,如果有人能解释我为什么,这将是极大的AP preciated。

I'm trying to modify the SurfaceView I use for doing a camera preview in order to display an overlaying square. However, the onDraw method of the extended SurfaceView is never called.

Here is the source :

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();   
    }


}
解决方案

Found it on the android-developers Google group. You simply have to add :

setWillNotDraw(false)

To the constructor. Now if someone could explain me why, that would be greatly appreciated.

这篇关于扩展SurfaceView的OnDraw()方法从来没有所谓的的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

09-16 01:23