ライセンスのないプロジェクトの 1 つで、スプラッシュ スクリーンが必要でしたが、必要ではありませんでした。アクティビティではなくダイアログに基づいているため、プロジェクトに役立つ場合があります。スプラッシュ スクリーンがタップまたはジェスチャされると、アニメーション (時間指定フェードアウト) が終了すると、スプラッシュ スクリーンは閉じられます。タップまたはジェスチャで画像を閉じることを許可する前に、ある種の「準備完了状態ブール値」をチェックするように、クラスに変更を加えることができます。
クラスファイル: AppIntro.java
import android.app.Dialog;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.Window;
import android.view.animation.Animation;
import android.view.animation.Animation.AnimationListener;
import android.view.animation.AnimationUtils;
public class AppIntro extends Dialog {
protected int mLayoutRes = 0;
protected int mAnimRes = 0;
protected Animation mIntroAnim = null;
protected View mLayout = null;
public AppIntro(Context aContext, int aLayoutRes, int aAnimRes) {
super(aContext);
mLayoutRes = aLayoutRes;
mAnimRes = aAnimRes;
}
@Override
protected void onCreate(Bundle aSavedState) {
super.onCreate(aSavedState);
mLayout = LayoutInflater.from(getContext()).inflate(mLayoutRes,null);
mLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
AppIntro.this.dismiss();
}
});
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(mLayout);
mIntroAnim = AnimationUtils.loadAnimation(getContext(),mAnimRes);
mIntroAnim.setAnimationListener(new AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
//nothing to do
}
@Override
public void onAnimationRepeat(Animation animation) {
//nothing to do
}
@Override
public void onAnimationEnd(Animation animation) {
AppIntro.this.dismiss();
}
});
}
@Override
public boolean onGenericMotionEvent(MotionEvent event) {
dismiss();
return true;
}
@Override
public void show() {
super.show();
mLayout.startAnimation(mIntroAnim);
}
}
次に、ファイル「res/anim/intro_anim.xml」で、アニメーションのフェードアウトを定義します (アプリの読み込みに必要な長さに変更します)。4200 = 4.2 秒。
<?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="4200"
android:repeatCount="0" >
</alpha>
</set>
最後に、"layout/intro.xml" でスプラッシュ スクリーン レイアウトを (任意の画像を使用して) 定義します。私の特定のスプラッシュ スクリーンには、画像付きのアプリ タイトルと、さまざまな資金源からの 3 つのロゴが表示されました。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/layout_intro"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<TextView
android:id="@+id/intro_Text_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:gravity="center"
android:text="@string/title_intro"
android:textAppearance="?android:attr/textAppearanceLarge" />
<ImageView
android:id="@+id/intro_Image_myproject"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/intro_Text_title"
android:layout_centerHorizontal="true"
android:src="@drawable/intro_image" />
<FrameLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/intro_Image_myproject"
android:layout_alignRight="@id/intro_Image_myproject"
android:layout_alignLeft="@id/intro_Image_myproject">
<ImageView
android:id="@+id/intro_Image_logo1"
android:layout_width="80dp"
android:layout_height="50dp"
android:scaleType="fitXY"
android:src="@drawable/logo1"
android:layout_gravity="left|center_vertical"/>
<ImageView
android:id="@+id/intro_Image_logo2"
android:layout_width="150dp"
android:layout_height="wrap_content"
android:src="@drawable/logo2"
android:layout_gravity="center"
android:scaleType="centerInside"/>
<ImageView
android:id="@+id/intro_Image_logo3"
android:layout_width="70dp"
android:layout_height="70dp"
android:scaleType="fitXY"
android:src="@drawable/logo3"
android:layout_gravity="right|center_vertical"/>
</FrameLayout>
</RelativeLayout>
ダイアログをポップアップするために使用されるコード:
@Override
protected void onCreate(Bundle aSavedState) {
super.onCreate(aSavedState);
if (aSavedState==null) {
//only show splash screen at app start, not on rotate screen
new AppIntro(this,R.layout.intro,R.anim.intro_anim).show();
}
setContentView(R.layout.main);
//...rest of onCreate()
}
私のアプリはスプラッシュ スクリーンと同時にメイン ビューを表示したため、.show() を呼び出すとすぐにこのダイアログが表示される保証はありません。