8

2つのビューを切り替えることができる小さなアクティビティを作成しました。今、私はいくつかのアニメーション(フェードイン/フェードアウト効果)を追加しようとしています。誰かが私にそれを正しく行う方法を説明できますか?

私自身がこれを行おうとすると、ちょっとバグがあります(ボタンを非常に速くクリックすると、アプリケーションがフリーズします)。以下のコードを使用します。

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" />

前もって感謝します!

4

2 に答える 2

6

私が過去にこれを行った方法は、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();

アニメーションが適切に遷移することを確認するために、アニメーションファイルを少し変更する必要がある場合があります(つまり左右のアニメーションをフェードさせます)。

お役に立てれば!

于 2012-11-05T17:44:36.013 に答える
2

この問題には2つの主な解決策があると思います

  • 1つ目は、提案されているようにViewFlipperを使用することです。
  • もう1つは、ここで説明するソリューションを使用することです。

2つ目は、ビュー階層に追加のViewオブジェクトを必要としないため、2つ目は、ビューツリー全体に2つのビューを表示できるためです。ViewFlipperの位置によって定義される単一の場所だけではありません。

于 2013-04-10T08:06:37.747 に答える