这是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
是interface
,SurfaceView
是一个类。 mSurfaceView.getHolder();
返回SurfaceHolder
。我知道如何创建实现接口的匿名类,并且可以执行类似
SurfaceHolder mHolder = new SurfaceHolder{ ... }
将匿名类的引用分配给变量名称。但是如何在上面的代码片段中实现接口?
答案 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种方法surfaceChanged
,surfaceCreated
和surfaceDestroyed
现在,如果您在原始链接的页面(ctrl + F)中搜索这些方法,您将看到它们的实现。
修改强>
我很抱歉,现在你的评论让我理解了这个问题。
诀窍在于SurfaceView
(就像任何类一样)里面有一堆private ___
个对象,其中一个是实现SurfaceHolder
接口的对象。通过调用mSurfaceView.getHolder(),您只需获得对实现最初在surfaceview内引用的接口的对象的引用。
创建接口对象是一件普通的Java事情,但你需要明确地显示该接口,例如在线程上运行:
Thread t = new Thread(new Runnable(){
@Override
run(){
// do stuff
}
}).start();
如果你很好奇,你可以在这里看看它是如何在SurfaceView上完成的,第694行