我正在尝试在方向更改时平滑过渡,就像股票相机应用程序一样(图标旋转,相机视图不闪烁)。
我已经通过设置ROTATION_ANIMATION_CROSSFADE
和手动启动活动创建动画来完成图标旋转部分。
但是我的TextureView
(camerax 正在渲染的地方)在配置更改时重新创建,因此在方向更改时它会变黑。
如何避免重新创建视图?我应该自己处理配置更改吗?
我正在尝试在方向更改时平滑过渡,就像股票相机应用程序一样(图标旋转,相机视图不闪烁)。
我已经通过设置ROTATION_ANIMATION_CROSSFADE
和手动启动活动创建动画来完成图标旋转部分。
但是我的TextureView
(camerax 正在渲染的地方)在配置更改时重新创建,因此在方向更改时它会变黑。
如何避免重新创建视图?我应该自己处理配置更改吗?
添加
android:screenOrientation="portrait"
到清单文件中的活动。然后,将不会在设备旋转时重新创建活动。之后,自行处理方向更改。我更喜欢使用 OrientationChangeListener 来做到这一点。
@Override
public void onResume() {
//handle orientation change
orientationEventListener = new OrientationEventListener(getActivity(), SensorManager.SENSOR_DELAY_NORMAL) {
@Override
public void onOrientationChanged(int orientation) {
updateUi(orientation); //rotate ui elements on orientation change
videoCapture?.setTargetRotation(getOrientation(orientationHint)) //notify the capture session about the orientation change
}
};
orientationEventListener.enable();
}
getOrientation() 方法从 Surface 常量整数中返回一个整数:Surface.ROTATION_0、Surface.ROTATION_90、Surface.ROTATION_180 或 Surface.ROTATION_270。
另请注意,您需要在 onPause() 方法中禁用orientationEventListener。
编辑:
** Helper function that gets the rotation of a [Display] in degrees */
fun getOrientation(rotation: Int?) = when (rotation) {
0 -> Surface.ROTATION_0
90 -> Surface.ROTATION_90
180 -> Surface.ROTATION_180
270 -> Surface.ROTATION_270
else -> Surface.ROTATION_0
}