WelcomeActivity【歡迎界面】


版權聲明:本文為HaiyuKing原創文章,轉載請注明出處!

前言

簡單記錄下歡迎界面的布局以及倒計時和跳過功能。

效果圖

代碼分析

1、修改APP整個主題為無標題欄樣式: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>

2、設置WelcomeActivity界面為全屏模式:在WelcomeActivity的onCreate方法中添加以下代碼

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

 3、倒計時功能並且修改文字

使用步驟

一、項目組織結構圖

注意事項:

1、  導入類文件后需要change包名以及重新import R文件路徑

2、  Values目錄下的文件(strings.xml、dimens.xml、colors.xml等),如果項目中存在,則復制里面的內容,不要整個覆蓋

二、導入步驟

將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
     * 
     * */
    
    //1、正常狀態下,運行——倒計時——跳轉到登錄界面,finish歡迎界面
    //2、用戶在打開應用時,按home鍵返回到了桌面,過了一段時間再次打開了應用
    //3、在歡迎界面,手機出現了一個其他應用的提示對話框,此時實現的是繼續倒計時,所以暫未處理
    
    @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>

三、使用方法

省略。

混淆配置

參考資料

This Handler class should be static or leaks might occur Android

項目demo下載地址

https://github.com/haiyuKing/WelcomeActivityDemo


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM