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
WelcomeActivity【欢迎界面】的更多相关文章
- Android WelcomeActivity 启动画更换网络图片
1.运行效果 第一张是本地的启动图,第二张是网络启动图 2.用到的第三方jar包 Android-Universal-Image-Loader-master 不熟的请看 Andro ...
- 【Android UI设计与开发】3.引导界面(三)实现应用程序只启动一次引导界面
大部分的引导界面基本上都是千篇一律的,只要熟练掌握了一个,基本上也就没什么好说的了,要想实现应用程序只启动一次引导界面这样的效果,只要使用SharedPreferences类,就会让程序变的非常简单, ...
- 浅谈Android的广告欢迎界面(倒计时)
前些时候就是别人问我他的android APP怎么做一个广告的欢迎界面,就是过几秒后自动跳转到主界面的实现. 也就是下面这种类似的效果.要插什么广告的话你就换张图吧. 那么我就思考了下,就用了andr ...
- 【Android UI设计与开发】第04期:引导界面(四)仿人人网V5.9.2最新版引导界面
这一篇我将会以人人网的引导界面为实例来展开详细的讲解,人人网的引导界面比较的新颖,不同于其他应用程序千篇一律的靠滑动来引导用户,而是以一个一个比较生动形象的动画效果展示在用户们的面前,有一种给人眼前一 ...
- Android 欢迎界面淡入效果并用WebView加载网址
1.首先是欢迎界面布局文件,只有一个背景图片:welcome.xml: <?xml version="1.0" encoding="utf-8"?> ...
- Android UI经常使用实例 怎样实现欢迎界面(Splash Screen)
在Android平台下.下载一个应用后,首次打开映入眼帘的便是Splash Screen,暂且不说Android的设计原则提不提倡这样的Splash Screen.先来看看一般使用Splash Scr ...
- Android课程设计第五天欢迎界面(滑动)和图形选择
注意:课程设计只为完成任务,不做细节描述~ 滑动界面 package com.example.myapplication; import android.content.Intent; import ...
- android开机引导界面的几种实现
不少应用在设计的时候都会有几个引导界面,这里总结一下几个典型实现: 之前自己做过仅具有一个引导界面的应用,在welcomeActivity中设置一张图片,更复杂的为该图片设置一个渐入渐出的动画,然后利 ...
- Android 记住密码和自动登录界面的实现(SharedPreferences 的用法)
原文:http://blog.csdn.net/liuyiming_/article/details/7704923 SharedPreferences介绍: SharedPreferences是An ...
随机推荐
- python3:操作excel文件
前提:自动化接口测试中,可以将用例放在excel中管理.结合实际情况讲解如何操作excel文件 1.安装xlrd:pip install xlrd 2.导入模块:import xlrd 3.打开Exc ...
- 用java8重写Arrays.sort(oldWay, new Comparator<String>(){@Override public int compare(String s1, String s2)});
参考https://www.liaoxuefeng.com/article/001411306573093ce6ebcdd67624db98acedb2a905c8ea4000/ Java 8终于引进 ...
- ./configure、make、make install
这些都是典型的使用GNU的AUTOCONF和AUTOMAKE产生的程序的安装步骤 一.基本信息 1../configure 是用来检测你的安装平台的目标特征的.比如它会检测你是不是有CC或GCC,并不 ...
- 微信jssdk config:invalid signature 签名错误 ,问题排查过程
invalid signature签名错误.建议按如下顺序检查: 确认签名算法正确,可用 http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisi ...
- 一文学会Scala
整体介绍 Scala 是一门多范式(multi-paradigm)的编程语言,设计初衷是要集成面向对象编程和函数式编程的各种特性. 联邦理工学院洛桑(EPFL)的Martin Odersky于2001 ...
- 流程控制之while循环
目录 语法(掌握) while+break while+continue while循环的嵌套(掌握) tag控制循环退出(掌握) while+else(了解) 语法(掌握) 循环就是一个重复的过程, ...
- 『线段树 Segment Tree』
更新了基础部分 更新了\(lazytag\)标记的讲解 线段树 Segment Tree 今天来讲一下经典的线段树. 线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间 ...
- WebGL three.js学习笔记 阴影与实现物体的动画
实现物体的旋转.跳动以及场景阴影的开启与优化 本程序将创建一个场景,并实现物体的动画效果 运行的结果如图: 完整代码如下: <!DOCTYPE html> <html lang=&q ...
- [翻译 EF Core in Action 1.10] 应该在项目中使用EF Core吗?
Entity Framework Core in Action Entityframework Core in action是 Jon P smith 所著的关于Entityframework Cor ...
- android事件分发源码分析—笔记
昨天晚上从源码角度复习了一下android的事件分发机制,今天将笔记整理下放在网上.其实说复习,也是按着<android开发艺术探索>这本书作者的思路做的笔记. 目录 事件是如何从Acti ...