1

これは、Android 開発者の Web サイトからのコード スニペットです。

class Preview extends ViewGroup implements SurfaceHolder.Callback {

    SurfaceView mSurfaceView;
    SurfaceHolder mHolder;

    Preview(Context context) {
        super(context);

        mSurfaceView = new SurfaceView(context);
        addView(mSurfaceView);

        // Install a SurfaceHolder.Callback so we get notified when the
        // underlying surface is created and destroyed.
        mHolder = mSurfaceView.getHolder();
        mHolder.addCallback(this);
        mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    }
...
}  

これSurfaceHolderがクラスですinterface。戻ります。インターフェイスを実装する匿名クラスを作成する方法を知っており、次のようなことが可能です SurfaceViewmSurfaceView.getHolder();SurfaceHolder

SurfaceHolder mHolder = new SurfaceHolder{ ... }
無名クラスへの参照を変数名に割り当てます。しかし、上記のコード スニペットでは、インターフェイスはどのように実装されているのでしょうか?

コード スニペットはこちらにあります

4

3 に答える 3

3

キーはページのさらに下にあります。

public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
    // Now that the size is known, set up the camera parameters and begin
    // the preview.
    Camera.Parameters parameters = mCamera.getParameters();
    parameters.setPreviewSize(mPreviewSize.width, mPreviewSize.height);
    requestLayout();
    mCamera.setParameters(parameters);

    /*
      Important: Call startPreview() to start updating the preview surface. Preview must be
      started before you can take a picture.
    */
    mCamera.startPreview();
}

これはインターフェースで定義されたメソッドであるため、インターフェースはここで実装されます。読みやすくするために、Google の例ではクラスを複数のコード セグメントに分割しています。

(実際には、インターフェイスにはいくつかのメソッドがあり、そのすべてがそのページの別々のセクションで定義されています。)

于 2013-09-01T09:38:00.700 に答える
1

Here SurfaceHolder is an interface

SurfaceHolderは、ネストされた Interface Callback を持つインターフェイスです。そして、この Callback は Preview クラスに実装されます。

この行で、SurfaceView のインターフェイスを取得します。

mHolder = mSurfaceView.getHolder();

SurfaceView はクラスであり、SurfaceHolder はクラスを操作するメソッドを提供するインターフェイスです。したがって、SurfaceHolder は、ArrayList と組み合わせて List インターフェースのように使用されるインターフェースです。

SurfaceHolder.Callbackインターフェイスには 3 つのメソッドがあり、ドキュメントから確認できます。コードでは、surfaceChanged() と surfaceDestroyed() のみが実装されています。

この行

 mHolder.addCallback(this);

コールバックを SurfaceHolder に追加します。

于 2013-09-01T09:52:26.853 に答える
1

グーグルは彼らの例でそれをたくさんします。完全なコードを実際に示しているわけではなく、常に@Override. 実際のインターフェース定義: http://developer.android.com/reference/android/view/SurfaceHolder.Callback.htmlを見ると、3 つのメソッドが表示さsurfaceChangedれます。surfaceCreatedsurfaceDestroyed

元のリンクのページ (ctrl+F) でこれらのメソッドを検索すると、それらの実装が表示されます。

編集:

申し訳ありませんが、あなたのコメントで質問を理解しました。

秘訣は、SurfaceView(他のクラスと同様に)private ___内部に多数のオブジェクトがあり、そのうちの 1 つはSurfaceHolderインターフェイスを実装するオブジェクトであるということです。mSurfaceView.getHolder() の呼び出しでは、最初に surfaceview 内で参照されたインターフェイスを実装するオブジェクトへの参照を取得しているだけです。

インターフェースのオブジェクトを作成するのは通常の Java のことですが、そのインターフェースを明示的に示す必要があります。たとえば、スレッドで実行可能です。

Thread t = new Thread(new Runnable(){
    @Override
    run(){
       // do stuff
    }
}).start();

興味がある場合は、ここの 694 行の SurfaceView でどのように行われるかを確認できます。

https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/core/java/android/view/SurfaceView.java

于 2013-09-01T10:31:29.260 に答える