界面如何在这里实现?

时间:2013-09-01 09:35:22

标签: java android

这是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);
    }
...
}  

此处SurfaceHolderinterfaceSurfaceView是一个类。 mSurfaceView.getHolder();返回SurfaceHolder。我知道如何创建实现接口的匿名类,并且可以执行类似

的操作

SurfaceHolder mHolder = new SurfaceHolder{ ... }
将匿名类的引用分配给变量名称。但是如何在上面的代码片段中实现接口?

The code snippet can be found here

3 个答案:

答案 0 :(得分: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的示例只是将该类拆分为多个代码段。

(实际上,界面中有几种方法,所有这些方法都在不同的部分中在该页面上定义。)

答案 1 :(得分:1)

Here SurfaceHolder is an interface

SurfaceHolder是一个接口,带有嵌套的接口回调。这个Callback将在Preview类中实现。

使用此行,您将获得SurfaceView的界面。

mHolder = mSurfaceView.getHolder();

SurfaceView是类,SurfaceHolder是提供使用该类的方法的接口。因此,SurfaceHolder是一个接口,它与ListList结合使用,与ArrayList结合使用。

SurfaceHolder.Callback界面有三种方法,我可以从文档中看到。在代码中只实现了surfaceChanged()和surfaceDestroyed()。

这一行

 mHolder.addCallback(this);

将Callback添加到SurfaceHolder。

答案 2 :(得分: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