版權聲明:本文爲HaiyuKing原創文章,轉載請註明出處!html
簡單記錄下歡迎界面的佈局以及倒計時和跳過功能。java
一、修改APP整個主題爲無標題欄樣式:styles.xml文件android
<resources> <!-- 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/colorAccent</item> </style> </resources>
二、設置WelcomeActivity界面爲全屏模式:在WelcomeActivity的onCreate方法中添加如下代碼git
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); /*==========設置全屏======必須在setContentView前面=======*/ /*set it to be no title*/ requestWindowFeature(Window.FEATURE_NO_TITLE); /*set it to be full screen*/ getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN); setContentView(R.layout.activity_welcom); //初始化控件 initView(); //初始化Handler和Runnable initThread(); }
三、倒計時功能而且修改文字github
注意事項:app
一、 導入類文件後須要change包名以及從新import R文件路徑ide
二、 Values目錄下的文件(strings.xml、dimens.xml、colors.xml等),若是項目中存在,則複製裏面的內容,不要整個覆蓋佈局
package com.why.project.welcomeactivitydemo; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.view.Window; import android.view.WindowManager; import android.widget.TextView; import java.lang.ref.WeakReference; import java.util.Timer; import java.util.TimerTask; /** * @CreateUser HaiyuKing * @Used 歡迎界面 * Android Handler leak 分析及解決辦法:http://www.cnblogs.com/0616--ataozhijia/p/3672021.html */ public class WelcomActivity extends AppCompatActivity { /**倒計時文本*/ private TextView mCountdownTextView; private static final int MSG_COUNT_WHAT = 99; private static final int NUM = 3; private int countdownNum;//倒計時的秒數 private static Timer timer;//計時器 private MyHandler countdownHandle;//用於控制倒計時子線程 private Runnable runnable;//倒計時子線程 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); /*==========設置全屏======必須在setContentView前面=======*/ /*set it to be no title*/ requestWindowFeature(Window.FEATURE_NO_TITLE); /*set it to be full screen*/ getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN); setContentView(R.layout.activity_welcom); //初始化控件 initView(); //初始化Handler和Runnable initThread(); } /** * 初始化控件 * */ private void initView(){ mCountdownTextView = (TextView) findViewById(R.id.id_countdownTextView); mCountdownTextView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { stopThread(); openNextActivity(WelcomActivity.this);//打開下一個界面 } }); } /** * 初始化Handler和Runnable * */ private void initThread(){ //倒計時變量 initCountdownNum(); //handler對象 countdownHandle = new MyHandler(this); //runnable runnable = new Runnable() { @Override public void run() { //執行倒計時代碼 timer = new Timer(); TimerTask task = new TimerTask() { public void run() { countdownNum --; Message msg = countdownHandle.obtainMessage(); msg.what = MSG_COUNT_WHAT;//message的what值 msg.arg1 = countdownNum;//倒計時的秒數 countdownHandle.sendMessage(msg); } }; timer.schedule(task,0,1000); } }; } /**必須使用靜態類:解決問題:This Handler class should be static or leaks might occur Android * http://www.cnblogs.com/jevan/p/3168828.html*/ private static class MyHandler extends Handler { // WeakReference to the outer class's instance. private WeakReference<WelcomActivity> mOuter; public MyHandler(WelcomActivity activity) { mOuter = new WeakReference<WelcomActivity>(activity); } @Override public void handleMessage(Message msg) { WelcomActivity theActivity = mOuter.get(); if (theActivity != null) { switch (msg.what) { case MSG_COUNT_WHAT: if(msg.arg1 == 0){//表示倒計時完成 //在這裏執行的話,不會出現-1S的狀況 if(timer != null){ timer.cancel();//銷燬計時器 } openNextActivity(theActivity);//打開下一個界面 }else{ theActivity.mCountdownTextView.setText("跳過" + msg.arg1 + "s"); } break; default: break; } } } } /* * Activity有三個狀態: * 運行——當它在屏幕前臺時(位於當前任務堆棧的頂部)。它是激活或運行狀態。它就是相應用戶操做的Activity * 暫停——當它失去焦點但仍然對用戶可見時,它處於暫停狀態 * 中止——徹底被另外一個Activity覆蓋時則處於中止狀態。它仍然保留全部的狀態和成員信息。然而對用戶是不可見的,因此它的窗口將被隱藏,若是其餘地方須要內存,則系統常常會殺死這個Activity。 * * 運行:OnCreate——>OnStart——>OnResume * 暫停:OnResume——>OnPause 再次從新運行:——>OnResume * 中止: * (1)切換到其餘界面或者按home鍵回到桌面:OnPause——>OnStop 從新執行:——>OnRestart——>OnStart——>OnResume * (2)退出整個應用或者finish():OnPause——>OnStop——>OnDestroy 從新執行:——>OnCreate——>OnStart——>OnResume * * */ //一、正常狀態下,運行——倒計時——跳轉到登陸界面,finish歡迎界面 //二、用戶在打開應用時,按home鍵返回到了桌面,過了一段時間再次打開了應用 //三、在歡迎界面,手機出現了一個其餘應用的提示對話框,此時實現的是繼續倒計時,因此暫未處理 @Override protected void onResume() { //開啓線程 countdownHandle.post(runnable); super.onResume(); } @Override protected void onStop() { initCountdownNum();//初始化倒計時的秒數,這樣按home鍵後再次進去歡迎界面,則會從新倒計時 stopThread(); super.onStop(); } //中止倒計時 private void stopThread(){ //在這裏執行的話,用戶點擊home鍵後,不會繼續倒計時進入登陸界面 if(timer != null){ timer.cancel();//銷燬計時器 } //將線程銷燬掉 countdownHandle.removeCallbacks(runnable); } //打開下一個界面 private static void openNextActivity(Activity mActivity) { //跳轉到登陸界面並銷燬當前界面 Intent intent = new Intent(mActivity, MainActivity.class); mActivity.startActivity(intent); mActivity.finish(); } @Override protected void onDestroy() { super.onDestroy(); } /*初始化倒計時的秒數*/ private void initCountdownNum(){ countdownNum = NUM; } }
<?xml version="1.0" encoding="utf-8"?> <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="#ffffff"> <!-- 倒計時文本 --> <TextView android:id="@+id/id_countdownTextView" android:layout_width="@dimen/countdown_width" android:layout_height="@dimen/countdown_width" android:layout_alignParentTop="true" android:layout_alignParentRight="true" android:layout_marginTop="@dimen/countdown_margin" android:layout_marginRight="@dimen/countdown_margin" android:text="" android:textSize="@dimen/countdown_text_size" android:textColor="#ffffff" android:gravity="center" android:background="@drawable/countdown_text_circle_bg_drawable"/> </RelativeLayout>
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <!-- 矩形的圓角半徑(寬度的一半) --> <corners android:radius="@dimen/countdown_radius"/> <!-- 填充 --> <solid android:color="#414141"/><!-- 填充的顏色 --> <!-- <solid android:color="#E0B3B3B3"/> --> </shape>
<resources> <!-- Default screen margins, per the Android Design guidelines. --> <dimen name="activity_horizontal_margin">16dp</dimen> <dimen name="activity_vertical_margin">16dp</dimen> <!-- *********************************歡迎界面**************************************** --> <!-- 倒計時區域的寬度 --> <dimen name="countdown_width">48dp</dimen> <!-- 倒計時區域的半徑(寬度的一半) --> <dimen name="countdown_radius">24dp</dimen> <!-- 倒計時區域的外邊距 --> <dimen name="countdown_margin">15dp</dimen> <!-- 倒計時區域的文字大小 --> <dimen name="countdown_text_size">12sp</dimen> </resources>
<resources> <!-- 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/colorAccent</item> </style> </resources>
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.why.project.welcomeactivitydemo"> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <!-- 歡迎界面 --> <activity android:name=".WelcomActivity"> <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> <activity android:name=".MainActivity"> </activity> </application> </manifest>
省略。post
無ui
This Handler class should be static or leaks might occur Android