禁用从纵向到横向的默认animation
我有一个应用程序,可以在横向或纵向上运行几个“正常”的活动。 他们是专为和大多用于肖像。
这个应用程序有一个单一的活动,使用相机,并locking在风景。 我'模拟'这个活动是通过旋转90度的图像和文字的肖像,所以它看起来像其余的活动。
在某些设备上,如三星Galaxy Tab 7和Galaxy S3, 从正常肖像活动转到相机横向活动并返回时,会显示一个旋转animation 。 这对于用户来说是令人困惑的,因为景观活动模拟在肖像上。
有没有办法去除这个旋转animation ? 理想情况下,我想更改为默认肖像肖像animation,但只是删除旋转animation就足够了。
我试过了
overridePendingTransition(0, 0);
该方法的其他变体没有成功。
[添加]
根据@igalarzab,@Georg和@Joe的build议,我已经完成了这个(仍然没有运气):
- 向Manifest添加了android:configChanges =“orientation | screenSize”
- 添加onConfigurationChanged
- 创build了一个虚拟animation,它什么也不做,并添加overridePendingTransition(R.anim.nothing,R.anim.nothing);
我有这些结果:
- onConfigurationChanged仅在旋转相同的Activity(纵向上的活动A – 横向上的活动A)时被调用。 但是从肖像上的活动A到横向上的活动B都不会被调用
- 这防止了活动在旋转时重新启动,但它并没有删除旋转animation(在Galaxy S3,Galaxy Nexus,Galaxy Tab 7.0和Galaxy Tab 10.1上testing)
- overridePendingTransition(R.anim.nothing,R.anim.nothing); 删除了正常的转换(纵向 – >纵向和横向 – >横向),但没有移除旋转animation(纵向 – >横向,反之亦然)。
我已经上传了一个显示我想要禁用的animation的video。 将相机活动(locking到风景)更改为其他活动,同时将手机保持在人像上时会发生这种情况:
对不起,没有办法控制旋转animation。 这是在你的应用程序之外完成的,在窗口pipe理器的深处,它需要当前屏幕的屏幕截图,调整并重build其背后的UI,然后运行内置animation以从原始屏幕截图过渡到新的重buildUI。 屏幕旋转更改时无法修改此行为。
这是股票相机应用程序禁用旋转animation的方式:
private void setRotationAnimation() { int rotationAnimation = WindowManager.LayoutParams.ROTATION_ANIMATION_CROSSFADE; Window win = getWindow(); WindowManager.LayoutParams winParams = win.getAttributes(); winParams.rotationAnimation = rotationAnimation; win.setAttributes(winParams); }
注意:根据API参考和下面的评论,这只适用于:
- API级别18或以上
-
FLAG_FULLSCREEN
标志是为Activity的WindowManager.LayoutParams
设置的 - 该活动不被另一个窗口覆盖(例如长时间按下电源button触发的电源closurespopup窗口)
您可以在AndroidManifest中设置一个名为android:configChanges
的属性,您可以在其中决定要在代码中进行哪些更改。 通过这种方式,旋转更改animation将被禁用,您可以根据需要在Activity
onConfigurationChanged
方法中处理它。
<activity android:name=".MySuperClass" android:label="@string/read_qrcode" android:screenOrientation="portrait" android:configChanges="orientation" />
我把它放在mainActivity中,它取消了旋转animation:
@Override public void setRequestedOrientation(int requestedOrientation) { super.setRequestedOrientation(requestedOrientation); int rotationAnimation = WindowManager.LayoutParams.ROTATION_ANIMATION_JUMPCUT; Window win = getWindow(); WindowManager.LayoutParams winParams = win.getAttributes(); winParams.rotationAnimation = rotationAnimation; win.setAttributes(winParams); }
更多细节在这里 。
您可能已经尝试过,但以防万一:
试着定义一个“什么都不做”的animation,并用它的id调用overridePendingTransition()
。 也许是这样的:
<set xmlns:android="http://schemas.android.com/apk/res/android" android:fillAfter="true"> <translate android:fromXDelta="0" android:toXDelta="0" android:duration="100" /> </set>
对不起,我没有Galaxy设备来testing:)
您可以在AndroidManifest中设置一个名为android:configChanges的属性,您可以在其中决定要在代码中进行哪些更改。 通过这种方式,旋转更改animation将被禁用,您可以根据需要在Activity的onConfigurationChanged方法中处理它。
这应该工作,但根据这个页面,你应该添加screenSize到configChanges添加android:configChanges =“orientation | screenSize”到你的活动标签。
如果你想以纵向模式设置你的活动,只有你可以在你的清单文件中这样做
<activity android:name=".Qosko4Activity" android:label="@string/app_name" android:screenOrientation="portrait" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
对他们说不,我说是的,这是可能的,这是非常简单的! 第一件事可能听起来很愚蠢,但locking你的应用程序到所需的方向! 然后不断询问陀螺仪什么方向的设备有最后但并非最不重要的旋转或animation您的意见到新的方向!
编辑:你可能想隐藏系统的UI,因为它不会旋转。 马里奥