首先,当您在屏幕之间启动意图时,您是否尝试覆盖 PendingAnimation?也许有些褪色或什么的。
我也看到这可能是一个问题,因为当您开始一项新活动时,在 setContentView 中的视图膨胀之前还有一小段时间,所以您可能会看到屏幕变黑,直到该步骤完成。也许使用 traceview 来查看它占用时间的地方,并可能稍微优化 onCreate->onDestroy 方法。
创建活动是一个昂贵的过程。也许如果这真的让你觉得很烦,请使用视图翻转器并将所有你可以使用的代码移动到单独的视图中,从 xml 中膨胀它们(也许如果它们不是太重,你可以在 onCreate 中加载它们并可能重用很多为纵向视图和横向声明的变量。您将把相关代码留在活动中,并将每个视图的独特功能移动到视图类中。
这只是一个难题。我已经用一个coverflow和一个包含图像拇指的gridView完成了这个,结果很好。切换视图非常快,并且内存消耗非常低,主要是因为视图之间共享数据。
编辑
因此,您想做这样的事情,让视图重新启动或 retainConfigurationState (在 android 文档中,它说这样可以更快地处理方向更改)。这是使用活动组处理方向更改的代码:
我有 2 个活动 A 和 B,可以是任何类型(TAbActivity 等...)
我有 1 个名为 OrientationChangeActivity 的主要活动:
public class OrientationChangeActivity extends ActivityGroup {
private ArrayList<String> mIdList;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mIdList = new ArrayList<String>();
if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
startChildActivity("ActivityA", new Intent(this, ActivityA.class));
} else if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
startChildActivity("ActivityB", new Intent(this, ActivityB.class));
}
}
............
这是使用我评论中发布的链接。我将活动 A 设置为纵向纵向,将活动 B 设置为横向。我让 OrientationChangeActivity 自行重新启动(清单中不包含 configChage 声明),因此再次调用 onCreate 并切换活动。
你也可以看看代码:
@Override
public void finishFromChild(Activity child) {
LocalActivityManager manager = getLocalActivityManager();
int index = mIdList.size() - 1;
if (index < 1) {
finish();
return;
}
manager.destroyActivity(mIdList.get(index), true);
mIdList.remove(index);
index--;
String lastId = mIdList.get(index);
Intent lastIntent = manager.getActivity(lastId).getIntent();
Window newWindow = manager.startActivity(lastId, lastIntent);
setContentView(newWindow.getDecorView());
}
它告诉您如何在 activityGroup 中创建一个活动并将其设置为视图。您可以使用此代码在此处加载两个活动,并根据方向更改将它们设置为内容视图。(意味着您需要添加 configChage=orientation)。