7

Android でスプラッシュ スクリーンを作成する方法についてのチュートリアルがたくさんあることは誰もが知っています。しかし、それらが疑似スプラッシュスクリーンであることもわかっています。私は多くを検索し、常に見ましたThread.sleep(x)。それはうまくコーディングされていません。これは、アプリを美しくし、プロのアプリのように見せるためのものです。それは私が望んでいることではありません! これらのスプラッシュ スクリーンのもう 1 つの問題は、アクティビティの開始
にのみ表示され、コンテンツ ビューが表示されるため、私の問題を解決できないことです。

初期化中に多くのことを行うアプリがあり、アプリが起動すると、ユーザーに数秒間黒い画面が表示され、イライラするのに十分な時間です。そのため、コンテンツ ビューが設定される前に表示される黒い画面を削除する、適切にコーディングされたスプラッシュ スクリーンを表示したいと考えています。

私は何かを試しました。RelativeLayoutに設定されているレイアウトにスプラッシュ スクリーン (a) を含めましたMainActivityが、私の知る限り、Android はすべてが読み込まれた後にのみコンテンツを表示するため、コンテンツ ビューからいくつかのビューを表示しようとしている場合は、すべてが終わるまで待つこと。それでも、私は自分のコードを送ります。

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    new SplashTask().execute();
}

private class SplashTask extends AsyncTask<Void, Void, Void> {

    @Override
    protected void onPreExecute() {
        initializeViews();
        mSplashScreen.setVisibility(View.VISIBLE);
    }

    @Override
    protected Void doInBackground(Void... params) {
        return null;
    }

    @Override
    protected void onPostExecute(Void params) {
        Standard.Initiate(MainActivity.this);
        verifyListStats();
        loadListAdapters();
        setOnClickListeners();
        mSplashScreen.setVisibility(View.GONE); 
    }

}

いくつかのリソースをロードしようとしましdoInBackground(...)たが、それらのリソースを必要とするいくつかの操作を実行しているため、実行onResume()できません (または、少なくとも実行できないと思います)。

何か案が?iOS の起動イメージに似た組み込みのメカニズムについて聞いたことがあります。

4

8 に答える 8

5

アクティビティが起動されると、Android は何もしない空のアクティビティである Zygote を起動し、それにアクティビティ テーマを設定して起動します。アクティビティを表示する準備ができたら、表示されているアクティビティを自分のアクティビティに入れ替えます。Zygote の詳細については、Cyril Motier によるこの記事を参照してください。

あなたの質問に答えるには、これを行うことができます:

  1. カスタム ウィンドウの背景にスプラッシュ情報を表示する小さなテーマを作成します (9 パッチを使用して、スケーリングされていないコンテンツを中央に配置できます)。
  2. マニフェストで、このスプラッシュ テーマをアクティビティに使用します。
  3. アクティビティの onCreate() メソッドで、 setTheme(R.id.yourActivityTheme) を呼び出します ( setContentView() の前に呼び出します);
  4. 楽しい...

そうすれば、アクティビティが表示される準備が整うまで、「スプラッシュ スクリーン」 (つまり、スプラッシュ テーマの zygote) が表示されます。

于 2013-08-28T10:30:07.550 に答える
3

編集: これは、スプラッシュ スクリーンを一定時間表示する、または一部の処理を終了するスプラッシュ スクリーンの優れたチュートリアルです。いくつかのアプローチの長所と短所も示します。

http://blogactivity.wordpress.com/2012/02/24/writing-splash-screens-the-right-way/

于 2013-08-22T22:00:18.700 に答える
2

SplashScreen アクティビティを作成し、アプリでデフォルトとして宣言します。つまり、これを AndroidManifest.xml に追加します。

  <activity
        android:name="package.SplashScreen"
        android:icon="@drawable/icon"
        android:label="@string/app_name"
        android:noHistory="true">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </activity>

SplashActivity onCreate で、新しい AsyncTask を起動します。

public class SplashScreen extends Activity {

   public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.splash_image);

      new InitAsyncTask().execute();
   }

   private class InitAsyncTask extends AsyncTask<?, ?, ?> {

      protected ? doInBackground(?... params) {
         // PERFORM YOUR INITIALIZATION HERE
      }

      protected void onPostExecute(? result) {
          // Initialization is completed, close SplashScreen 
          // and launch your MainActivity:
          SplashScreen.this.finish();
          startActivity(new Intent(MainActivity.class, SplashScreen.this);

     }
   }
}
于 2013-08-22T22:30:48.843 に答える
0

ライセンスのないプロジェクトの 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() を呼び出すとすぐにこのダイアログが表示される保証はありません。

于 2013-08-27T18:47:20.393 に答える
0

私も同じものを探していました。最後に、これを実装して、私の要件を満たします。

ノート :

  • 2 番目のアクティビティの作成時にすべての重い作業を行います。そのため、すべての作業が完了すると、後で自動的に開始されるアクティビティonStart()が呼び出されます。
  • onCreate()アプリケーションの存続期間中に一部のコードを 1 回だけ実行する場合は、 にチェックを入れることができます。
  • アプリケーションの起動時に実行されるため、ApplicationClass の onCreate() メソッドで重い作業を行わないでください。したがって、この実行中に黒い画面が表示されます。

これはスプラッシュ スクリーン xml です。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:background="@drawable/splash_screen"
  tools:context=".SplashScreenActivity">
</RelativeLayout>

アクティビティクラスです

public class SplashScreenActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_splash_screen);
    new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            Intent mainIntent = new Intent(SplashScreenActivity.this,
                    MyLauncherActivity.class);
            SplashScreenActivity.this.startActivity(mainIntent);
                         // SplashScreenActivity.this.finish(); No need to finish it as "noHistory" tag is true in the manifest
        }
    }, 1500);

}

@Override
public void onBackPressed() {
}
}

マニフェストのエントリ:

 <activity
        android:name="com.wokomoco.test.activities.SplashScreenActivity"
        android:label="@string/app_name"
        android:noHistory="true"
        android:screenOrientation="portrait" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
 </activity>

これがあなたを助けることを願っています。コーディングを楽しもう!!

于 2013-08-27T09:54:23.543 に答える
0

以下は、すべてのプロジェクトで使用しているスプラッシュ スクリーン アクティビティです。お役に立てるかどうかご確認ください。

public class SplashActivity extends Activity {

    private SharedPreferences myPrefs;
    private SharedPreferences.Editor prefsEditor;
    private boolean login;
    private boolean connectivityState;
    private String connectedNetworkType;
    private ConnectivityManager connectivityManager;
    private CheckInternet checkInternet;
    private File file = new File(API.file_dir);
    public static Location loc;
    Configuration newConfig;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.splash_layout);



        //----------------------
        myPrefs = getSharedPreferences("myPrefs", MODE_WORLD_READABLE);
        boolean login = myPrefs.getBoolean("login", false); 

            checkForInternetAndNextFlow();
    }


    // Check for the Internet Connection
    private void checkForInternetAndNextFlow() {

        connectivityManager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
        checkInternet = new CheckInternet(getApplicationContext());
        connectivityState = checkInternet.isConnected(connectivityManager);

        if (connectivityState) {
            connectedNetworkType = checkInternet.getNetworkType();
            // Toast.makeText(getApplicationContext(), "Connected via : " +
            // connectedNetworkType, Toast.LENGTH_LONG).show();

            // check for the login or not from preference
            myPrefs = this.getSharedPreferences("myPrefs", MODE_WORLD_READABLE);
            login = myPrefs.getBoolean("login", false);

            System.out.println("Loging value is:" + login);
            Thread t = new Thread() {
                public void run() {
                    try {
                        Thread.sleep(1500);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    } finally {
                        if (login) {
                            Intent i = new Intent(SplashActivity.this,MainTabActivity.class);
                            startActivity(i);
                        } else {
                            Intent i = new Intent(SplashActivity.this,LoginActivity.class);
                            startActivity(i);
                        }
                    }
                }
            };
            t.start();

        } else {
            // Toast.makeText(getApplicationContext(), "NOT connected",
            // Toast.LENGTH_LONG).show();
            final Dialog dialog = new Dialog(SplashActivity.this,R.style.CustomDialogTheme);
            dialog.getWindow();
            dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
            dialog.setContentView(R.layout.internet_dialog);
            dialog.setCancelable(false);

            Button retryBtn = (Button) dialog.findViewById(R.id.retryBtn);
            Button cancel = (Button) dialog.findViewById(R.id.cancelBtn);

            retryBtn.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View arg0) {
                    dialog.dismiss();
                    checkForInternetAndNextFlow();
                }
            });

            cancel.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View arg0) {
                    dialog.dismiss();
                    finish();
                }
            });
            dialog.show();
        }

    }


}

それがあなたを助けることを願っています。コーディングを楽しんでください... :)

于 2013-08-28T08:47:21.660 に答える