结论
overridePendingTransition(0, 0); // onCreate:禁用进入和退出动画
用户反馈机型
安卓客户端不满屏幕:荣耀X50、荣耀X60、荣耀60Pro、荣耀90、荣耀100、荣耀magicpad 2等
现象
打开应用,点击进入音视频可视化界面:有时好,有时一半黑屏。
购买荣耀100复现后捕获日志
2025-07-04 13:57:38.676 2731-3322/? I/HwPCUtils#HwPCMultiWindowManager: setRequestedOrientation, displayId 0
2025-07-04 13:57:38.677 2731-3322/? I/ActivityTaskManager: clearSizeCompatModeAttributes when in setRequestedOrientation for com.a/com.a.LiveActivity
2025-07-04 13:57:38.677 2731-3322/? I/WindowManager: handleTopActivityLaunchingInDifferentOrientation background visible activity to cover config
2025-07-04 13:57:38.678 1765-1765/? I/SurfaceFlingerEx: WMS requires statistical surfaceView layer info
2025-07-04 13:57:38.678 2731-3322/? I/DisplayRotationCoordinator: sub screen rotation fail
2025-07-04 13:57:38.678 2731-3322/? I/HwPCUtils#HwPCManagerService: RotateObserver onRotate 0->1
2025-07-04 13:57:38.678 2731-3322/? I/DE J DES: [effect] Display RotateObserver onRotate 0->1
2025-07-04 13:57:38.678 2731-3372/? I/DE J DES: [effect] setScene(70, 73
2025-07-04 13:57:38.679 2731-3322/? I/TransitionController: first create transition: TransitionRecord{300f72e id=-1 type=CHANGE flags=0x0}, caller: com.android.server.wm.DisplayContent.requestChangeTransition:4609 com.android.server.wm.DisplayRotation.updateRotationUnchecked:856 com.android.server.wm.DisplayRotation.updateOrientation:619 com.android.server.wm.DisplayContent.updateOrientation:2192 com.android.server.wm.DisplayContent.updateOrientation:2102
2025-07-04 13:57:38.680 3739-4019/? V/WindowManagerShell: Transition requested (#1699): android.os.BinderProxy@f88eaa1 TransitionRequestInfo { type = CHANGE, triggerTask = null, pipTask = null, remoteTransition = null, displayChange = DisplayChange { displayId = 0, startAbsBounds = null, endAbsBounds = null, startRotation = 0, endRotation = 1, physicalDisplayChanged = false mDisplaySwitchChanged =false }, flags = 0, debugId = 1699, displayMode = 0, hnTransitionRequestInfoEx = HnTransitionRequestInfoEx { isAllowAsyncStartTransitionfalse} }
2025-07-04 13:57:38.680 3739-4019/? I/PipTransition: handle PiP enter request type:CHANGE
2025-07-04 13:57:38.680 1765-3432/? I/SurfaceFlinger: createLayer layername: Surface(name=WindowToken{eb18033 type=2019 android.os.BinderProxy@9c8f36d})/@0x1674b18 - animation-leash of token_transform type: Layer address = 0xb400007da96041e0
2025-07-04 13:57:38.680 3739-4019/? I/PopOverTransitionHandler: handleRequest
2025-07-04 13:57:38.680 1738-1850/? E/ANDR-PERF-OPTSHANDLER: Perflock resource /sys/devices/system/cpu/bus_dcvs/L3/soc:qcom,memlat:l3:prime/min_freq not supported
2025-07-04 13:57:38.680 1738-1850/? E/ANDR-PERF-RESOURCEQS: Failed to apply optimization [13, 22]
2025-07-04 13:57:38.682 1765-3432/? I/SurfaceFlinger: createLayer layername: Surface(name=WindowToken{cb12380 type=2000 android.os.BinderProxy@20230b2})/@0xf965356 - animation-leash of token_transform type: Layer address = 0xb400007da9575bd0
尝试修复
# 2025-07-04 13:57:38.682 1765-3432/? I/SurfaceFlinger: createLayer layername: Surface(name=WindowToken{cb12380 type=2000 android.os.BinderProxy@20230b2})/@0xf965356 - animation-leash of token_transform type: Layer address = 0xb400007da9575bd0
从日志看到相关animation动画信息怀疑:是否Activity淡入淡出动画在该类机型中出现问题?
- 尝试禁用动画。
- 加开关测试:未禁用前进出10大概出现2-3次;禁用后未再出现。因此就用该方法临时处理。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (FileUtils.isFileExists("/sdcard/hh.txt")) {
overridePendingTransition(0, 0); // --- 禁用进入和退出动画
Log.i(TAG, "LiveActivity overridePendingTransition onCreate: close");
} else {
Log.i(TAG, "LiveActivity overridePendingTransition onCreate: open");
}
setContentView(R.layout.activity_live);
}
界面截图
附录
方法介绍
overridePendingTransition
是 Android 中用于自定义 Activity 切换动画的方法。它允许开发者指定进入和退出 Activity 时的动画效果,从而增强用户体验。
基本语法
@Override
public void finish() {
super.finish();
overridePendingTransition(enterAnim, exitAnim);
}
或者
Intent intent = new Intent(this, NextActivity.class);
startActivity(intent);
overridePendingTransition(enterAnim, exitAnim);
参数说明
enterAnim
:新 Activity 进入时的动画资源 ID。exitAnim
:当前 Activity 退出时的动画资源 ID。
动画资源定义
动画资源通常放在 res/anim/
目录下。以下是一些常见的动画示例:
slide_in_right.xml(从右侧进入)
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="@android:integer/config_shortAnimTime"
android:fromXDelta="100%"
android:toXDelta="0%" />
</set>
slide_out_left.xml(向左侧退出)
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="@android:integer/config_shortAnimTime"
android:fromXDelta="0%"
android:toXDelta="-100%" />
</set>
使用示例
启动 Activity 时设置动画
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
startActivity(intent);
overridePendingTransition(R.anim.slide_in_right, R.anim.slide_out_left);
关闭 Activity 时设置动画
@Override
public void finish() {
super.finish();
overridePendingTransition(R.anim.slide_in_left, R.anim.slide_out_right);
}
注意事项
- 必须在
startActivity()
或finish()
之后立即调用overridePendingTransition
,否则动画不会生效。 - 如果不需要动画,可以将参数设为 0。
- 动画资源应尽量使用系统提供的短动画时间(如
@android:integer/config_shortAnimTime
)以确保一致性。
常见动画效果
- 淡入淡出:使用
alpha
动画。 - 滑动:使用
translate
动画。 - 缩放:使用
scale
动画。
通过合理使用 overridePendingTransition
,可以显著提升应用的交互体验。