3

我已经将 SurfaceView 子类化并在 Activity 的 onCreate 中实例化它。生成预览,但控件从不进入 onDraw(),它在 SurfaceView 的子类中被覆盖。这是为什么?

class ActivityClass extends Activity{

    onCreate(){

        mPreview = new Preview(this);
        setContentView(mPreview);
    }
    public void startPreview(){

        rec = new MediaRecorder();
        rec.setVideoSource();.......
        rec.setPreviewDisplay(mPreview.getSurfaceHolder.getSurface());
    } 
}

class Preview extends SurfaceView implements SurfaceHolder.Callback{

    SurfaceHolder mHolder;

    public Preview(Context context){
        super(context);
        mHolder = getHolder();     
        mHolder.addCallback(this);      
        mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
        bringToFront();//this is not
        invalidate();//making a difference
    }

    SurfaceHolder getSurfaceHolder(){

        return mHolder;
    }
    //Surface callback methods implemented here
}

在Surface上绘制预览之前,如果实现了onDraw回调,是不是应该把控制权交给呢?

因为 onDraw 回调对 Android 框架说'你不绘制视图。我会画它,因为我已经实施了'。我对吗?

那么,为什么控件无法进入onDraw()呢?请帮忙。

4

3 回答 3

3

您只需添加

setWillNotDraw(false)

给构造函数。

它完成了..:)

于 2014-02-10T05:53:28.220 回答
0

一些可疑的事情正在发生。您似乎正在尝试将 SurfaceView 设置为预览显示。在这种情况下,Activity 应该实现 SurfaceHolder.Callback(而不是 SurfaceView)。这是为了让 Activity 可以知道 SurfaceView 何时已创建并准备好进行绘制。此外,甚至不需要扩展 SurfaceView:您应该能够使用 SurfaceView 本身。

假设我误解了并且您出于某种原因确实想扩展surfaceview ...我看不到您在Preview 类中覆盖onDraw 的位置。您没有包含此代码吗?

当你说 onDraw 回调告诉 android '你不绘制视图。我会画它,因为我已经实施了',我不同意。onDraw 是一个 View 绘制所有 View 都有的东西的函数,例如背景。SurfaceView 扩展视图。当你扩展 SurfaceView 时,你可以重写 onDraw 来告诉 android 除了 View 中原始的 onDraw 绘制的内容之外还绘制一些东西。换句话说,Android 总是做所有的绘图;覆盖 onDraw 只是告诉它在合适的时间绘制更多的东西。

于 2011-10-23T03:37:09.507 回答
0
public class SelectedRect extends View {
    public SelectedRect(Context context) {
        super(context);     
        bringToFront();
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        drawLine(canvas);
        invalidate();       
        this.bringToFront();    
    }
}

在活动课上:

View rect =  new SelectedRect(this);
rect.bringToFront();
this.addView(rect, new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT,
        LayoutParams.FILL_PARENT));
于 2010-07-27T05:55:44.827 回答