Android左到右滑动animation

我有三个活动的发起模式是单一实例。
使用onfling() ,我左右摆动它们。

问题是,当我从右向左滑动幻灯片转换是好的,但是当我从左向右滑动时,我从左向右滑动过渡。

我知道这是为什么发生,因为我总是发送新的意图。 但是,现在我需要改变从左向右滑动的animation。

我知道有一个名为overridingTransitionPending()的方法,但我不知道如何用XML定义我的animation。

res/anim/

这是从左到右的animation:

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

这是从右到左的animation:

 <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); 

如果你想要整个应用程序的转换工作,你可以创build一个rootacivity并inheritance它在你需要的活动。 在根活动的onCreate调用overridePendingTransition与所需的方向。 如果活动恢复, onStart调用overridePendingTransition与其他方向。 我在这里给出完整的运行代码。如果我错了,请纠正我。

在你的anim文件夹中创build这个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> 

制作了一个示例代码,实现了从左,右,上和下的幻灯片效果。 (对于那些不想做所有这些animationXML文件:))

检出github上的代码

另外,你可以这样做:

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

而且你不需要添加任何animationxml

您可以覆盖您的默认活动animation。 这是我使用的解决scheme:

创build一个“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> 

创buildres文件夹下的anim文件夹,然后创build这四个animation文件:

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中的示例项目。

这就是所有…快乐编码:)

我无法使用ViewPropertyAnimatorfind这种types的animation的解决scheme。

这是一个例子:

布局:

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

animation – 从右到左和退出视图:

 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); } }); 

animation – 从右到左进入视图:

 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); } }); 

如果你的API级别是19+,你可以使用上面的translation 。 如果你的API级别小于19,你可以看看类似的教程: http : //trickyandroid.com/fragments-translate-animation/