簡體   English   中英

接口在這里如何實現?

[英]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是一個interfaceSurfaceView是一個類。 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種方法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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM