使用交叉淡入淡出动画在视图之间切换

时间:2012-11-05 17:26:31

标签: android

我写了一个小活动,可以在两个视图之间切换。现在我想添加一些动画(淡入/淡出效果)。任何人都能解释我该如何做到这一点吗?

我自己尝试这样做有点儿(如果我会非常快地点击按钮,我的应用程序会冻结)。我使用下面列出的代码:

public class WelcomeActivity extends Activity {
private boolean isLogin = false;
private String KEY_IS_LOGIN = "KEY_IS_LOGIN";
private Animation anim_fadein;
private RelativeLayout welcome, login;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    welcome = (RelativeLayout)getLayoutInflater().inflate(R.layout.activity_welcome_menu, null);
    login = (RelativeLayout)getLayoutInflater().inflate(R.layout.activity_welcome_login, null);
    anim_fadein = AnimationUtils.loadAnimation(this, R.anim.anim_fadein);
    if (savedInstanceState != null)
        isLogin = savedInstanceState.getBoolean(KEY_IS_LOGIN, false);
    if (isLogin)
        setContentView(login);
    else
        setContentView(welcome);
}

@Override
public void onBackPressed() {
    if (isLogin) {
        setContentView(welcome);
        welcome.startAnimation(anim_fadein);
        isLogin = false;
    } else {
        super.onBackPressed();
    }
}

@Override
public void onSaveInstanceState(Bundle outState) {
    outState.putBoolean(KEY_IS_LOGIN, isLogin);
    super.onSaveInstanceState(outState);
}

public void onButton1Click(View v) {
    setContentView(login);
    login.startAnimation(anim_fadein);
}

public void onButtonLoginClick(View v) {
    Intent i = new Intent(getApplicationContext(), MainActivity.class);
    startActivity(i);
}

public void onButtonBackClick(View v) {
    setContentView(welcome);
    welcome.startAnimation(anim_fadein);
}

动画XML文件:

<?xml version="1.0" encoding="utf-8"?>
<alpha
xmlns:android="http://schemas.android.com/apk/res/android"
android:fromAlpha="0.0"
android:toAlpha="1.0"
android:duration="800" />

提前致谢!

2 个答案:

答案 0 :(得分:5)

我过去这样做的方法是使用ViewFlipper类并利用包提供的内置动画功能。

以下是如何执行此操作的示例;根据我的经验,过渡非常顺利:

XML文件

<LinearLayout
    //Ommitted...
    <ViewFlipper
        android:id="@+id/[your_id_here]"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">
            <RelativeLayout
                <!--Your first layout XML here...-->
            </RelativeLayout>
            <RelativeLayout
                <!--Your second layout XML here...-->
            </RelativeLayout>
    </ViewFlipper>
</LinearLayout>

请注意,您不必使用相对布局,我只是为了清晰起见而使用它们。

实施动画

获取您活动中ViewFlipper的参考:

ViewFlipper v = (ViewFlipper) findViewById(R.id.[your_id]);

根据需要设置动画:

v.setInAnimation(AnimationUtils.loadAnimation([your_activity_name].this, R.anim.[your_in_animation here]));
v.setOutAnimation(AnimationUtils.loadAnimation([your_activity_name].this, R.anim.[your_out_animation here]));

请注意,您可以在位于以下目录中的Android类文件中找到一些非常好的预建动画:

[android-sdks]/samples/android-[VERSION_NUMBER_HERE]/ApiDemos/res/anim

如果可以的话,我强烈建议您使用它们 - 它会为您节省很多时间。

现在,如果要在视图之间切换,请使用以下命令:

v.showNext();
v.showPrevious();

您可能需要稍微更改动画文件,以确保动画正确转换(即向右移动左侧动画)。

希望这有帮助!

答案 1 :(得分:1)

我认为这个问题有2个主要解决方案

  • 第一个是建议使用ViewFlipper
  • 另一个是使用here描述的解决方案。

我更喜欢第二个因为它在你的视图中不需要额外的View对象,其次你可以在视图树中拥有你的2个视图。不仅在由ViewFlipper的位置定义的单个位置。