[英]How is the interface being implemented here?
這是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{ ... }
將對匿名類的引用分配給變量名。 但是在上面的代碼片段中如何實現接口?
關鍵在頁面的下方:
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的示例僅將該類分為多個代碼段。
(實際上,界面中有幾種方法,所有方法都在該頁面的不同部分中定義。)
Here SurfaceHolder is an interface
SurfaceHolder是一個帶有嵌套接口回調的接口。 並且此回調將在Preview類中實現。
通過此行,您可以獲取SurfaceView的界面。
mHolder = mSurfaceView.getHolder();
SurfaceView是類,而SurfaceHolder是Interface,它提供使用該類的方法。 因此,SurfaceHolder是與列表接口(與ArrayList組合使用)類似的接口。
SurfaceHolder.Callback接口具有三種方法,我可以從文檔中看到。 在代碼中,僅實現了surfaceChanged()和surfaceDestroyed()。
這條線
mHolder.addCallback(this);
將回調添加到SurfaceHolder。
Google在他們的例子中做了很多。 它們並沒有真正顯示完整的代碼,並且並不總是顯示@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行中看到它是如何完成的
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.