3

SurfaceViewをサブクラス化し、アクティビティのonCreateでインスタンス化しました。プレビューは生成されますが、SurfaceViewのサブクラスでオーバーライドされるonDraw()にコントロールが入ることはありません。何故ですか?

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

0

何か怪しいことが起こっている。SurfaceView をプレビュー表示に設定しようとしているようです。その場合、Activity は SurfaceHolder.Callback (SurfaceView ではなく) を実装する必要があります。これは、SurfaceView がいつ作成され、描画の準備が整ったかをアクティビティが認識できるようにするためです。さらに、SurfaceView を拡張する必要さえないはずです。SurfaceView 自体を使用できるはずです。

私が誤解していて、何らかの理由で surfaceview を本当に拡張したいと仮定すると... Preview クラスで onDraw をオーバーライドした場所がわかりません。このコードを含めませんでしたか?

onDraw コールバックが Android に「ビューを描画しない」ことを伝えると言うとき。実装されたので描きます」と反論。onDraw は、ビューが背景など、すべてのビューにあるものを描画する関数です。SurfaceView はビューを拡張します。SurfaceView を拡張すると、onDraw をオーバーライドして、ビュー内の元の onDraw が描画するものに加えて、Android に何かを描画するように指示できます。つまり、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 に答える