Как сделать хорошо закодированный заставку

Мы все знаем, что есть много уроков о том, как сделать заставку на Android. Но мы также знаем, что это псевдо-всплески . Я искал многих, и я всегда видел Thread.sleep(x) . Это не очень хорошо закодировано, это просто сделать красоту приложения и выглядеть как профессиональное приложение, это не то, что я хочу!
Еще одна проблема с этими заставками заключается в том, что они не решают мою проблему, потому что они отображают ее только после запуска активности и отображения содержимого.

У меня есть приложение, которое делает много вещей во время инициализации, и когда приложение начинает, пользователь видит черный экран на несколько секунд, достаточно времени, чтобы раздражать. Поэтому я хочу показать хорошо зашифрованный заставку, которая удаляет черный экран, который появляется перед представлением содержимого.

Я что-то пробовал. Я включил заставку ( RelativeLayout ) в макет, который установлен в 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, возможно, это может быть способ.

Solutions Collecting From Web of "Как сделать хорошо закодированный заставку"

Когда действие запускается, Android запускает Zygote, пустую активность, которая ничего не делает, и устанавливает на нее свою тему активности, а затем запускает ее. После того, как ваша активность будет готова для отображения, она переключит отображаемую активность на вашу. Для получения дополнительной информации о Zygote вы можете прочитать эту статью Кирилла Мотье

Чтобы ответить на ваш вопрос, вы можете сделать следующее:

  1. Создайте небольшую тему, в которой пользовательский фон окна отображает информацию о всплеске (вы можете использовать 9-патч для центрирования немасштабированного контента);
  2. В своем манифесте используйте эту тему всплеска для своей деятельности;
  3. В методе onCreate () вашей активности вызовите setTheme (R.id.yourActivityTheme) (вызовите его перед setContentView ());
  4. наслаждаться…

Таким образом, ваш «заставка» (то есть: зигота с вашей темой всплеска) будет виден, пока ваша активность не будет готова к отображению.

Редактирование: вот отличный учебник для всплывающих экранов, где вы хотите, чтобы заставка появлялась в течение определенного времени или для какой-либо обработки. Это дает плюсы и минусы нескольких подходов.

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

Создайте действие 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); } } } 

Я сделал это, создав полный диалог всплеска экрана, а затем закрою его, когда я закончил загрузку

 splashDialog = new Dialog(getActivity(), android.R.style.Theme_Black_NoTitleBar_Fullscreen); splashDialog.setContentView(R.layout.yourSplashLayout); 

Лучший способ открыть всплывающий экран – вы можете создать для него новое действие, а затем в этом мероприятии вы можете установить таймер, чтобы открыть новый вид деятельности, который будет вашим основным видом деятельности. Я думаю, используя это, вы можете избавиться от своего Черный экран при запуске. В манифесте проявляется активность всплеска в качестве активности запуска по умолчанию. Вот пример: –

SplashActivity.java

 public class SplashActivity extends Activity { private Timer timer; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.layout_splash_activity); } @Override protected void onResume() { timer = new Timer(); timer.schedule(new TimerTask() { @Override public void run() { Intent intialScreenIntent = new Intent(SplashActivity.this, MainActivity.class); startActivity(intialScreenIntent); } }, 2000l); super.onResume(); } @Override public void onBackPressed() { try { timer.cancel(); timer = null; } catch (Exception e) { } super.onBackPressed(); }} 

Я тоже искал то же самое. В конце я реализую это, чтобы полностью удовлетворить мои требования.

Заметка :

  • Выполняйте всю тяжелую работу над созданием своего второго занятия. Поэтому, когда все работы будут выполнены, активность автоматически запускается после onStart() .
  • Вы можете поместить некоторые проверки в onCreate() если вы хотите, чтобы какой-то код onCreate() только один раз в жизни приложения.
  • Не выполняйте тяжелую работу в методе 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> 

Это класс активности

Открытый класс SplashScreenActivity расширяет действие {

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

Надеюсь, это поможет вам. Наслаждайтесь кодированием!

Один из моих нелицензированных проектов потребовал заставки, даже если это не было необходимо. Возможно, это может быть полезно для вашего проекта, поскольку оно основано на диалоге, а не на активности. Если экран заставки отображается или жестикулирован, он будет отклонен, а также как только он будет завершен с помощью анимации (временное затухание). Модификации могут быть внесены в класс, чтобы вы проверяли какое-то «готовое состояние логическое», прежде чем разрешать касание или жесты отклонять изображение.

Файл класса: 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 ().

Ниже приведена функция Splash Screen, которую я использую во всех проектах. Пожалуйста, проверьте, полезно ли вам.

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

Надеюсь, это поможет вам. Наслаждайтесь кодированием … 🙂