天天看點

視訊通話view旋轉流程

1、com/android/incallui/InCallOrientationEventListener.java

手機裝置旋轉時回調的方法:

@Override
public void onOrientationChanged(int rotation) {
    if (rotation == OrientationEventListener.ORIENTATION_UNKNOWN) {
        return;
    }

    final int orientation = toScreenOrientation(rotation);

    if (orientation != SCREEN_ORIENTATION_UNKNOWN && sCurrentOrientation != orientation) {
        sCurrentOrientation = orientation;
        InCallPresenter.getInstance().onDeviceOrientationChange(sCurrentOrientation);
    }
}
           

2、 com / android / incallui / InCallPresenter.java

public void onDeviceOrientationChange(int orientation) {
    Log.d(this, "onDeviceOrientationChange: orientation= " + orientation);

    if (mCallList != null) {
        mCallList.notifyCallsOfDeviceRotation(orientation);
    } else {
        Log.w(this, "onDeviceOrientationChange: CallList is null.");
    }

    // Notify listeners of device orientation changed.
    for (InCallOrientationListener listener : mOrientationListeners) {
        listener.onDeviceOrientationChanged(orientation);
    }
}
           

3、 com / android / incallui / VideoCallPresenter.java

回調onDeviceOrientationChanged:

@Override
public void onDeviceOrientationChanged(int orientation) {
    mDeviceOrientation = orientation;

    VideoCallUi ui = getUi();
    if (ui == null) {
        Log.e(this, "onDeviceOrientationChanged: VideoCallUi is null");
        return;
    }

    Point previewDimensions = ui.getPreviewSize();
    if (previewDimensions == null) {
        return;
    }
    Log.d(this, "onDeviceOrientationChanged: orientation=" + orientation + " size: "
            + previewDimensions);
    changePreviewDimensions(previewDimensions.x, previewDimensions.y);

    ui.setPreviewRotation(mDeviceOrientation);
}
           

4、 com / android / incallui / VideoCallFragment.java

調用setPreviewRotation方法:

@Override
public void setPreviewRotation(int orientation) {
    Log.d(this, "setPreviewRotation: orientation=" + orientation);
    if (sPreviewSurface != null) {
        TextureView preview = sPreviewSurface.getTextureView();

        if (preview == null ) {
            return;
        }

        preview.setRotation(orientation);
    }
}
           

這裡的setRotation其實就是View類的一個方法,用于旋轉一個子view。

繼續閱讀