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中的示例项目。
这就是所有…快乐编码:)
您可以使用ViewAnimator或ViewFlipper来达到此目的。 您需要处理左侧和右侧的Swap事件并设置所需的启动。
你可以在博客中的所有例子。
http://learnandroideasily.blogspot.in/2013/06/detect-swap-event-in-android.html
animation示例
http://learnandroideasily.blogspot.in/2013/05/android-animation.html
http://learnandroideasily.blogspot.in/2013/06/android-viewflipper-example.html
http://learnandroideasily.blogspot.in/2013/08/android-viewanimator-example.html
我无法使用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/