WelcomeActivity【歡迎界面】

版權聲明:本文爲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

使用步驟

1、項目組織結構圖

注意事項:app

一、  導入類文件後須要change包名以及從新import R文件路徑ide

二、  Values目錄下的文件(strings.xml、dimens.xml、colors.xml等),若是項目中存在,則複製裏面的內容,不要整個覆蓋佈局

2、導入步驟

將WelcomeActivity文件複製到項目中【跳轉界面的操做根據實際狀況填寫】【若是不須要倒計時區域文本展示,則設置倒計時區域隱藏便可

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>

將倒計時區域的背景countdown_text_circle_bg_drawable.xml複製到項目中

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

在dimens.xml中添加如下代碼

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

建議在styles.xml中設置主題樣式爲無標題欄

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

在AndroidManifest.xml中聲明WelcomeActivity

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

3、使用方法

省略。post

混淆配置

ui

參考資料

This Handler class should be static or leaks might occur Android

項目demo下載地址

https://github.com/haiyuKing/WelcomeActivityDemo

相關文章
相關標籤/搜索