版权声明:本文为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

WelcomeActivity【欢迎界面】的更多相关文章

  1. Android WelcomeActivity 启动画更换网络图片

    1.运行效果  第一张是本地的启动图,第二张是网络启动图       2.用到的第三方jar包   Android-Universal-Image-Loader-master 不熟的请看  Andro ...

  2. 【Android UI设计与开发】3.引导界面(三)实现应用程序只启动一次引导界面

    大部分的引导界面基本上都是千篇一律的,只要熟练掌握了一个,基本上也就没什么好说的了,要想实现应用程序只启动一次引导界面这样的效果,只要使用SharedPreferences类,就会让程序变的非常简单, ...

  3. 浅谈Android的广告欢迎界面(倒计时)

    前些时候就是别人问我他的android APP怎么做一个广告的欢迎界面,就是过几秒后自动跳转到主界面的实现. 也就是下面这种类似的效果.要插什么广告的话你就换张图吧. 那么我就思考了下,就用了andr ...

  4. 【Android UI设计与开发】第04期:引导界面(四)仿人人网V5.9.2最新版引导界面

    这一篇我将会以人人网的引导界面为实例来展开详细的讲解,人人网的引导界面比较的新颖,不同于其他应用程序千篇一律的靠滑动来引导用户,而是以一个一个比较生动形象的动画效果展示在用户们的面前,有一种给人眼前一 ...

  5. Android 欢迎界面淡入效果并用WebView加载网址

    1.首先是欢迎界面布局文件,只有一个背景图片:welcome.xml: <?xml version="1.0" encoding="utf-8"?> ...

  6. Android UI经常使用实例 怎样实现欢迎界面(Splash Screen)

    在Android平台下.下载一个应用后,首次打开映入眼帘的便是Splash Screen,暂且不说Android的设计原则提不提倡这样的Splash Screen.先来看看一般使用Splash Scr ...

  7. Android课程设计第五天欢迎界面(滑动)和图形选择

    注意:课程设计只为完成任务,不做细节描述~ 滑动界面 package com.example.myapplication; import android.content.Intent; import ...

  8. android开机引导界面的几种实现

    不少应用在设计的时候都会有几个引导界面,这里总结一下几个典型实现: 之前自己做过仅具有一个引导界面的应用,在welcomeActivity中设置一张图片,更复杂的为该图片设置一个渐入渐出的动画,然后利 ...

  9. Android 记住密码和自动登录界面的实现(SharedPreferences 的用法)

    原文:http://blog.csdn.net/liuyiming_/article/details/7704923 SharedPreferences介绍: SharedPreferences是An ...

随机推荐

  1. TestNG 相对路径与绝对路径getResourceAsStream

    以下内容引自: http://blog.csdn.net/zmx729618/article/details/51144588 (注: 此url并非原出处,该文章也是转自他人.但博主未注明出处) Ja ...

  2. Elasticsearch笔记六之中文分词器及自定义分词器

    中文分词器 在lunix下执行下列命令,可以看到本来应该按照中文"北京大学"来查询结果es将其分拆为"北","京","大" ...

  3. 使用limit查询的同时取得总的记录数:SQL_CALC_FOUND_ROWS和FOUND_ROWS()

    通常我们都用如下的sql来进行列表 SELECT COUNT(*) FROM users WHERE name LIKE 'a%';SELECT name, email FROM users WHER ...

  4. Ubuntu配置tomcat9

    buntu 安装jdk:[链接] Ubuntu安装eclipse:[链接] Ubuntu下安装MySQL与mysql workbench:[链接] Ubuntu配置tomcat9:[链接] Ubunt ...

  5. Hibernate-ORM:05.Hibernate中的list()和iterator()

    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- Hibernate中查多条(全部)使用list()或iterator() 本篇介绍: 1.如何使用list() ...

  6. Mysql 上亿级数据导入Hive思路分享

    前提条件: 数据库容量上亿级别,索引只有id,没有创建时间索引 达到目标: 把阿里云RDS Mysql表数据同步到hive中,按照mysql表数据的创建时间日期格式分区,每天一个分区方便查询 每天运行 ...

  7. 多租户实现之基于Mybatis,Mycat的共享数据库,共享数据架构

    前言 SaaS模式是什么? 传统的软件模式是在开发出软件产品后,需要去客户现场进行实施,通常部署在局域网,这样开发.部署及维护的成本都是比较高的. 现在随着云服务技术的蓬勃发展,就出现了SaaS模式. ...

  8. Python爬虫入门教程 59-100 python爬虫高级技术之验证码篇5-极验证识别技术之二

    图片比对 昨天的博客已经将图片存储到了本地,今天要做的第一件事情,就是需要在两张图片中进行比对,将图片缺口定位出来 缺口图片 完整图片 计算缺口坐标 对比两张图片的所有RBG像素点,得到不一样像素点的 ...

  9. SpringBoot框架与MyBatis集成,连接Mysql数据库

    SpringBoot是一种用来简化新Spring应用初始搭建及开发过程的框架,它使用特定方式来进行配置,使得开发人员不再需要定义样板化的配置.MyBatis是一个支持普通SQL查询.存储和高级映射的持 ...

  10. 19条MySQL优化准则

    1.EXPLAIN 做MySQL优化,我们要善用EXPLAIN查看SQL执行计划. 下面来个简单的示例,标注(1.2.3.4.5)我们要重点关注的数据: type列,连接类型.一个好的SQL语句至少要 ...