web-dev-qa-db-ja.com

Androidの左から右へのスライドアニメーション

起動モードがシングルインスタンスのアクティビティが3つあります。
onfling()を使って左右に振ります。

問題は、スライドのトランジションを右から左にスワイプすると問題がないことですが、左から右にスワイプすると、右から左にスワイプするとトランジションが発生します。

私はいつも新しい意図を送っているので、なぜこれが起こっているのか私は知っています。しかし、今、私は左から右へスライドするアニメーションを変更する必要があります。

overridingTransitionPending()という名前のメソッドがあることは知っていますが、アニメーションをXMLで定義する方法はわかりません。

166
sajjoo

このxmlをres/anim/で使用してください

これは左から右へのアニメーションです。

<set xmlns:Android="http://schemas.Android.com/apk/res/Android"
     Android:shareInterpolator="false">
  <translate Android:fromXDelta="-100%" Android:toXDelta="0%"
             Android:fromYDelta="0%" Android:toYDelta="0%"
             Android:duration="700"/>
</set>

これは右から左へのアニメーションです。

<set xmlns:Android="http://schemas.Android.com/apk/res/Android"
     Android:shareInterpolator="false">
  <translate
     Android:fromXDelta="0%" Android:toXDelta="100%"
     Android:fromYDelta="0%" Android:toYDelta="0%"
     Android:duration="700" />
</set>

あなたのコーディングでは、左から右へのような意図を使用してください。

this.overridePendingTransition(R.anim.animation_enter,
                   R.anim.animation_leave);

あなたのコーディングでは右から左へのような意図を使う

this.overridePendingTransition(R.anim.animation_leave,
                               R.anim.animation_enter);
368
fargath

アプリケーション全体で移行作業が必要な場合は、rootacivityを作成し、それを必要なアクティビティに継承できます。ルートアクティビティのonCreateで、必要な方向を指定してoverridePendingTransitionを呼び出します。アクティビティが再開された場合、onStartは他の方向でoverridePendingTransitionを呼び出します。ここで私は完全な実行中のコードを以下に与えています。私が間違っているなら私を訂正してください。

あなたのanimフォルダにこのxmlファイルを作成してください

anim_slide_in_left.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android" >
    <translate
        Android:duration="600"
        Android:fromXDelta="100%"
        Android:toXDelta="0%" >
    </translate>
</set>

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="600"
        Android:fromXDelta="-100%"
        Android:toXDelta="0%" >
    </translate>
</set>

anim_slide_out_left.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android" >
    <translate
        Android:duration="600"
        Android:fromXDelta="0%"
        Android:toXDelta="-100%" >
    </translate>
</set>

anim_slide_out_right.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android" >
    <translate
        Android:duration="600"
        Android:fromXDelta="0%"
        Android:toXDelta="100%" >
    </translate>
</set>

RootActivity

import Android.app.Activity;
import Android.os.Bundle;

public class RootActivity extends Activity {
    int onStartCount = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        onStartCount = 1;
        if (savedInstanceState == null) // 1st time
        {
            this.overridePendingTransition(R.anim.anim_slide_in_left,
                    R.anim.anim_slide_out_left);
        } else // already created so reverse animation
        { 
            onStartCount = 2;
        }
    }

    @Override
    protected void onStart() {
        // TODO Auto-generated method stub
        super.onStart();
        if (onStartCount > 1) {
            this.overridePendingTransition(R.anim.anim_slide_in_right,
                    R.anim.anim_slide_out_right);

        } else if (onStartCount == 1) {
            onStartCount++;
        }

    }

}

FirstActivity

import Android.content.Intent;
import Android.os.Bundle;
import Android.view.View;
import Android.view.View.OnClickListener;
import Android.widget.Button;
import Android.widget.TextView;

public class FirstActivity extends RootActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        TextView tv = (TextView) findViewById(R.id.tvTitle);
        tv.setText("First Activity");
        Button bt = (Button) findViewById(R.id.buttonNext);
        bt.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent i = new Intent(FirstActivity.this, SecondActivity.class);
                startActivity(i);

            }
        });
    }

}

SecondActivity

import Android.content.Intent;
import Android.os.Bundle;
import Android.view.View;
import Android.view.View.OnClickListener;
import Android.widget.Button;
import Android.widget.TextView;

public class SecondActivity extends RootActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        TextView tv = (TextView) findViewById(R.id.tvTitle);
        tv.setText("Second Activity");
        Button bt = (Button) findViewById(R.id.buttonNext);
        bt.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent i = new Intent(SecondActivity.this, ThirdActivity.class);
                startActivity(i);

            }
        });

    }

}

ThirdActivity

import Android.os.Bundle;
import Android.view.View;
import Android.view.View.OnClickListener;
import Android.widget.Button;
import Android.widget.TextView;

public class ThirdActivity extends RootActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        TextView tv = (TextView) findViewById(R.id.tvTitle);
        tv.setText("Third Activity");
        Button bt = (Button) findViewById(R.id.buttonNext);
        bt.setText("previous");
        bt.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                finish();

            }
        });
    }

}

そして最後にマニフェスト

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
    package="com.example.transitiontest"
    Android:versionCode="1"
    Android:versionName="1.0" >

    <uses-sdk
        Android:minSdkVersion="8"
        Android:targetSdkVersion="18" />

    <application
        Android:allowBackup="true"
        Android:icon="@drawable/ic_launcher"
        Android:label="@string/app_name"
        Android:theme="@style/AppTheme" >
        <activity
            Android:name="com.example.transitiontest.FirstActivity"
            Android:label="@string/app_name" >
            <intent-filter>
                <action Android:name="Android.intent.action.MAIN" />

                <category Android:name="Android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            Android:name="com.example.transitiontest.SecondActivity"
            Android:label="@string/app_name" >
        </activity>
        <activity
            Android:name="com.example.transitiontest.ThirdActivity"
            Android:label="@string/app_name" >
        </activity>
    </application>

</manifest>

左、右、上、下からのスライド効果で同じことを実装するサンプルコードを作りました。 (これらすべてのアニメーションxmlファイルを作成したくない人のために:))

github のコードをチェックアウトしてください。

67
habib

また、これを行うことができます。

FirstClass.this.overridePendingTransition(Android.R.anim.slide_in_left, Android.R.anim.slide_out_right);

また、アニメーションxmlを追加する必要はありません。

12
SolArabehety

デフォルトのアクティビティアニメーションを上書きすることができます。これが私が使う解決策です:

"CustomActivityAnimation"を作成し、これを "windowAnimationStyle"によってベーステーマに追加します。

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorPrimary</item>
    <item name="Android:windowAnimationStyle">@style/CustomActivityAnimation</item>

</style>

<style name="CustomActivityAnimation" parent="@Android:style/Animation.Activity">
    <item name="Android:activityOpenEnterAnimation">@anim/slide_in_right</item>
    <item name="Android:activityOpenExitAnimation">@anim/slide_out_left</item>
    <item name="Android:activityCloseEnterAnimation">@anim/slide_in_left</item>
    <item name="Android:activityCloseExitAnimation">@anim/slide_out_right</item>
</style>

Resフォルダの下にanimフォルダを作成してから、次の4つのアニメーションファイルを作成します。

slide_in_right.xml

<?xml version="1.0" encoding="utf-8"?>

<set xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <translate Android:fromXDelta="100%p" Android:toXDelta="0"
        Android:duration="@Android:integer/config_mediumAnimTime"/>
</set>

slide_out_left.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <translate Android:fromXDelta="0" Android:toXDelta="-100%p"
        Android:duration="@Android:integer/config_mediumAnimTime"/>
</set>

slide_in_left.xml

<?xml version="1.0" encoding="utf-8"?>

<set xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <translate Android:fromXDelta="-100%p" Android:toXDelta="0"
        Android:duration="@Android:integer/config_mediumAnimTime"/>
</set>

slide_out_right.xml

<?xml version="1.0" encoding="utf-8"?>

<set xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <translate Android:fromXDelta="0" Android:toXDelta="100%p"
        Android:duration="@Android:integer/config_mediumAnimTime"/>
</set>

これが私の--- githubのサンプルプロジェクトです

これですべてです...ハッピーコーディング:)

11

activity」開始時にアニメーションを適用する場合は、以下のコードを記述します。

startActivity(intent);
overridePendingTransition(R.anim.opening_anim, R.anim.closing_anim);

dialog」にアニメーションを適用する場合は、まずstyles.xmlファイルに以下のコードを追加します

<style name="my_style”> 
 <item 
  name="@Android:windowEnterAnimation">@anim/opening_anim</item> 
 <item 
 name="@Android:windowExitAnimation">@anim/closing_anim</item>
</style>

以下で定義したようにこのスタイルを使用します。

final Dialog dialog = new Dialog(activity);
dialog.getWindow().getAttributes().windowAnimations = R.style.my_style;

view」にアニメーションを適用する場合は、以下のコードを記述します

txtMessage = (TextView) findViewById(R.id.txtMessage);

// load the animation
animFadein = AnimationUtils.loadAnimation(getApplicationContext(),R.anim.animation); 

// start the animation
txtMessage.startAnimation(animFadein);

以下、ほとんどのアニメーション.xmlコードに言及しました。

表示-表示されるようにする

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <alpha
        Android:interpolator="@Android:anim/accelerate_interpolator"
        Android:duration="1"
           Android:fromAlpha="1.0"
           Android:toAlpha="1.0"/>
</set>

==========================================

ゆっくりとview.xmlにフェードします

<?xml version="1.0" encoding="UTF-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <alpha
        Android:fromAlpha="0.0"
        Android:toAlpha="1.0"
        Android:interpolator="@Android:anim/accelerate_interpolator" 
        Android:duration="300"
        Android:repeatCount="0" />
</set>

==========================================

フェードアウト-view.xmlから徐々にフェードアウトします

<?xml version="1.0" encoding="UTF-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <alpha
        Android:fromAlpha="1.0"
        Android:toAlpha="0.0"
        Android:interpolator="@Android:anim/accelerate_interpolator" 
        Android:duration="300"
        Android:repeatCount="0" />
</set>

==========================================

Push_down_in.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <translate Android:fromYDelta="-100%p" Android:toYDelta="0" Android:duration="400"/>
</set>

==========================================

Push_down_out.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <translate Android:fromYDelta="0" Android:toYDelta="100%p" Android:duration="400"/>
</set>

==========================================

Push_left_in.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <translate Android:fromXDelta="100%p" Android:toXDelta="0" Android:duration="300"/>
    <alpha Android:fromAlpha="0.0" Android:toAlpha="1.0" Android:duration="300" />
</set>

==========================================

Push_left_out.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <translate Android:fromXDelta="0" Android:toXDelta="-100%p" Android:duration="300"/>
    <alpha Android:fromAlpha="1.0" Android:toAlpha="0.0" Android:duration="300" />
</set>

==========================================

Push_right_in.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <translate Android:fromXDelta="-100%p" Android:toXDelta="0" Android:duration="300"/>
    <alpha Android:fromAlpha="0.0" Android:toAlpha="1.0" Android:duration="300" />
</set>

==========================================

Push_right_out.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <translate Android:fromXDelta="0" Android:toXDelta="100%p" Android:duration="300"/>
    <alpha Android:fromAlpha="1.0" Android:toAlpha="0.0" Android:duration="300" />
</set>

==========================================

Push_up_in.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <translate Android:fromYDelta="100%p" Android:toYDelta="0" Android:duration="300"/>
    <alpha Android:fromAlpha="0.0" Android:toAlpha="1.0" Android:duration="300" />
</set>

==========================================

Push_up_out.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <translate Android:fromYDelta="0" Android:toYDelta="-100%p" Android:duration="300"/>
    <alpha Android:fromAlpha="1.0" Android:toAlpha="0.0" Android:duration="300" />
</set>

==========================================

rotation.xml

<?xml version="1.0" encoding="utf-8"?>
<rotate
 xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:fromDegrees="0"
    Android:toDegrees="-90"
    Android:pivotX="50%"
    Android:pivotY="50%"
    Android:duration="0" Android:fillAfter="true">
</rotate>

==========================================

scale_from_corner.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <scale Android:fromYScale="0" Android:toYScale="1.0"
        Android:fromXScale="0" Android:toXScale="1.0" 
        Android:duration="500" Android:pivotX="100%"
        Android:pivotY="100%" />
</set>

==========================================

scale_torwards_corner.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <scale Android:fromYScale="1.0" Android:toYScale="0"
        Android:fromXScale="1.0" Android:toXScale="0" 
        Android:duration="500"/>
</set>

==========================================

shrink_and_rotate_a(exit).xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android">
<scale
    Android:fromXScale="1.0" Android:toXScale="0.8"
    Android:fromYScale="1.0" Android:toYScale="0.8"
    Android:pivotX="50%p" Android:pivotY="50%p"
    Android:interpolator="@Android:anim/accelerate_interpolator"
    Android:duration="100"
/>
<scale
    Android:fromXScale="1.0" Android:toXScale="0.0"
    Android:fromYScale="1.0" Android:toYScale="1.0"
    Android:pivotX="50%p" Android:pivotY="50%p"
    Android:interpolator="@Android:anim/accelerate_interpolator"
    Android:duration="150"
    Android:startOffset="100"
/>

==========================================

shrink_and_rotate_b(entrance).xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android">
<scale
    Android:fromXScale="0.0" Android:toXScale="1.0"
    Android:fromYScale="1.0" Android:toYScale="1.0"
    Android:pivotX="50%p" Android:pivotY="50%p"
    Android:interpolator="@Android:anim/accelerate_interpolator"
    Android:duration="150"
    Android:startOffset="250"
/>

<scale
    Android:fromXScale="0.8" Android:toXScale="1.0"
    Android:fromYScale="0.8" Android:toYScale="1.0"
    Android:pivotX="50%p" Android:pivotY="50%p"
    Android:interpolator="@Android:anim/accelerate_interpolator"
    Android:duration="100"
    Android:startOffset="400"
/>

=======================================

blink.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <alpha Android:fromAlpha="0.0"
      Android:toAlpha="1.0"
      Android:interpolator="@Android:anim/accelerate_interpolator"
      Android:duration="800"
      Android:repeatMode="reverse"
      Android:repeatCount="infinite"/>
</set>

=======================================

ZoomIn.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android"
   Android:fillAfter="true" >
    <scale
       xmlns:Android="http://schemas.Android.com/apk/res/Android"
       Android:duration="1000"
       Android:fromXScale="1"
       Android:fromYScale="1"
       Android:pivotX="50%"
       Android:pivotY="50%"
       Android:toXScale="3"
       Android:toYScale="3" >
    </scale>
</set>

=======================================

ZoomOut.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android"
   Android:fillAfter="true" >
    <scale
       xmlns:Android="http://schemas.Android.com/apk/res/Android"
       Android:duration="1000"
       Android:fromXScale="1.0"
       Android:fromYScale="1.0"
       Android:pivotX="50%"
       Android:pivotY="50%"
       Android:toXScale="0.5"
       Android:toYScale="0.5" >
    </scale>
</set>

=======================================

FadeIn.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android"
   Android:fillAfter="true" >
    <alpha
       Android:duration="1000"
       Android:fromAlpha="0.0"
       Android:interpolator="@Android:anim/accelerate_interpolator"
       Android:toAlpha="1.0" />
</set>

=======================================

FadeOut.xml

<set xmlns:Android="http://schemas.Android.com/apk/res/Android"
   Android:fillAfter="true" >
    <alpha
       Android:duration="1000"
       Android:fromAlpha="1.0"
       Android:interpolator="@Android:anim/accelerate_interpolator"
       Android:toAlpha="0.0" />
</set>

=======================================

Move.xml

<?xml version="1.0" encoding="utf-8"?>
<set
   xmlns:Android="http://schemas.Android.com/apk/res/Android"
   Android:interpolator="@Android:anim/linear_interpolator"
   Android:fillAfter="true">
   <translate
       Android:fromXDelta="0%p"
       Android:toXDelta="80%p"
       Android:duration="1000" />
</set>

=======================================

SlideDown.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android"
   Android:fillAfter="true">
    <scale
       Android:duration="800"
       Android:fromXScale="1.0"
       Android:fromYScale="0.0"
       Android:interpolator="@Android:anim/linear_interpolator"
       Android:toXScale="1.0"
       Android:toYScale="1.0" />
</set>

=======================================

SlideUp.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android"
   Android:fillAfter="true" >
    <scale
       Android:duration="800"
       Android:fromXScale="1.0"
       Android:fromYScale="1.0"
       Android:interpolator="@Android:anim/linear_interpolator"
       Android:toXScale="1.0"
       Android:toYScale="0.0" />
</set>

=======================================

Bounce.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android"
   Android:fillAfter="true"
   Android:interpolator="@Android:anim/bounce_interpolator">
    <scale
       Android:duration="800"
       Android:fromXScale="1.0"
       Android:fromYScale="0.0"
       Android:toXScale="1.0"
       Android:toYScale="1.0" />
</set>
9
Prince

ViewPropertyAnimatorを使用してこのタイプのアニメーションの解決策を見つけることができませんでした。

これが例です:

レイアウト:

<FrameLayout
Android:id="@+id/child_view_container"
Android:layout_width="match_parent"
Android:layout_height="wrap_content">

    <EditText
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:id="@+id/child_view"
        Android:gravity="center_horizontal"
        Android:layout_gravity="center_horizontal"
    />
</FrameLayout>

アニメート - 右から左に表示を終了:

final childView = findViewById(R.id.child_view);
View containerView = findViewById(R.id.child_view_container);
childView.animate()
  .translationXBy(-containerView.getWidth())
  .setDuration(TRANSLATION_DURATION)
  .setInterpolator(new AccelerateDecelerateInterpolator())
  .setListener(new AnimatorListenerAdapter() {
    @Override
    public void onAnimationEnd(Animator animation) {
        childView.setVisibility(View.GONE);
    }
});

アニメート - 右から左にビューを入力:

final View childView = findViewById(R.id.child_view);
View containerView = findViewById(R.id.child_view_container);
childView.setTranslationX(containerView.getWidth());
childView.animate()
    .translationXBy(-containerView.getWidth())
    .setDuration(TRANSLATION_DURATION)
    .setInterpolator(new AccelerateDecelerateInterpolator())
    .setListener(new AnimatorListenerAdapter() {
        @Override
        public void onAnimationStart(Animator animation) {
            childView.setVisibility(View.VISIBLE);
        }
    });
1
ABS

APIレベルが19以上の場合は、上記のようにtranslationを使用できます。 APIレベルが19未満の場合は、同様のチュートリアルをご覧ください。 http://trickyandroid.com/fragments-translate-animation/

1
taynguyen

右から左のスライド用

res/anim/in.xml:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android"
   Android:shareInterpolator="false">
   <translate
    Android:fromXDelta="100%" Android:toXDelta="0%"
    Android:fromYDelta="0%" Android:toYDelta="0%"
    Android:duration="700" />
</set>

res/anim/out.xml:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android"
   Android:shareInterpolator="false">
   <translate
    Android:fromXDelta="0%" Android:toXDelta="-100%"
    Android:fromYDelta="0%" Android:toYDelta="0%"
    Android:duration="700" />
</set>

アクティビティJavaファイル内:

Intent intent = new Intent(HomeActivity.this, ActivityCapture.class);
startActivity(intent);
overridePendingTransition(R.anim.in,R.anim.out);

長いまたは短いスライドアニメーションのxmlファイルで継続時間を変更できます。

0
Jacob