1

这是来自 android 开发者网站的代码片段。

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是一个interfaceSurfaceView是一个类。mSurfaceView.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是一个接口,具有嵌套的接口回调。而这个回调将在 Preview 类中实现。

通过这一行,您将获得 SurfaceView 的接口。

mHolder = mSurfaceView.getHolder();

SurfaceView 是类,SurfaceHolder 是提供使用该类的方法的接口。所以 SurfaceHolder 是与 ArrayList 组合使用的接口,类似于 List 接口。

SurfaceHolder.Callback接口有三个方法,我可以从文档中看到在代码中只实现了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 个方法surfaceChangedsurfaceCreatedsurfaceDestroyed

现在,如果您在原始链接的页面 (ctrl+F) 中搜索这些方法,您将看到它们的实现。

编辑:

非常抱歉,您的评论现在我理解了这个问题。

诀窍是SurfaceView(就像任何类一样)private ___里面有一堆对象,其中一个是实现SurfaceHolder接口的对象。通过调用 mSurfaceView.getHolder(),您将获得对实现最初在 Surfaceview 内部引用的接口的对象的引用。

创建接口对象是正常的 Java 事情,但是您需要明确显示该接口,例如在线程上可运行:

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

如果你很好奇,你可以在这里的 SurfaceView 上看到它是如何完成的,第 694 行

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

于 2013-09-01T10:31:29.260 回答