起動モードがシングルインスタンスのアクティビティが3つあります。onfling()
を使って左右に振ります。
問題は、スライドのトランジションを右から左にスワイプすると問題がないことですが、左から右にスワイプすると、右から左にスワイプするとトランジションが発生します。
私はいつも新しい意図を送っているので、なぜこれが起こっているのか私は知っています。しかし、今、私は左から右へスライドするアニメーションを変更する必要があります。
overridingTransitionPending()
という名前のメソッドがあることは知っていますが、アニメーションをXMLで定義する方法はわかりません。
この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);
アプリケーション全体で移行作業が必要な場合は、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 のコードをチェックアウトしてください。
また、これを行うことができます。
FirstClass.this.overridePendingTransition(Android.R.anim.slide_in_left, Android.R.anim.slide_out_right);
また、アニメーションxmlを追加する必要はありません。
デフォルトのアクティビティアニメーションを上書きすることができます。これが私が使う解決策です:
"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のサンプルプロジェクトです
これですべてです...ハッピーコーディング:)
「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>
==========================================
<?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>
==========================================
<?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>
==========================================
<?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>
==========================================
<?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>
==========================================
<?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>
==========================================
<?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>
==========================================
<?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>
==========================================
<?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>
==========================================
<?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>
==========================================
<?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>
==========================================
<?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>
==========================================
<?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>
==========================================
<?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>
==========================================
<?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"
/>
==========================================
<?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"
/>
=======================================
<?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>
=======================================
<?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>
=======================================
<?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>
=======================================
<?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>
=======================================
<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>
=======================================
<?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>
=======================================
<?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>
=======================================
<?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>
=======================================
<?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>
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);
}
});
APIレベルが19以上の場合は、上記のようにtranslation
を使用できます。 APIレベルが19未満の場合は、同様のチュートリアルをご覧ください。 http://trickyandroid.com/fragments-translate-animation/
右から左のスライド用
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ファイルで継続時間を変更できます。