天天看点

视频通话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。

继续阅读