033 Android App启动的闪屏效果+新手向导(多个图片滑动效果)+ViewPager使用
1.目标效果
App启动时,出现闪屏效果(利用动画实现)。
App新手使用时,会出现新手向导效果。
2.XML页面布局
(1)闪屏页面
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/rl_main"
android:background="@mipmap/splash_bg_newyear"
tools:context=".MainActivity"> <ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:src="@mipmap/splash_horse_newyear"/> </RelativeLayout>
(2)UserGuideActivity页面布局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".UserGuideActivity"> <android.support.v4.view.ViewPager
android:id="@+id/vp_user_guide"
android:layout_width="match_parent"
android:layout_height="match_parent"> </android.support.v4.view.ViewPager> <Button
android:id="@+id/bt_userguide_start"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@drawable/selector_btn_text_user_guide"
android:padding="10dp"
android:background="@drawable/selector_btn_user_guide"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginBottom="100dp"
android:text="开始体验"/> <RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginBottom="75dp"> <LinearLayout
android:id="@+id/ll_guide_spot"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"> </LinearLayout> <ImageView
android:id="@+id/iv_red_spot"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/user_spot_red"/>
</RelativeLayout> </RelativeLayout>
(3)图片选择器
<1>按钮的背景图
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" android:drawable="@drawable/button_red_pressed"></item>
<item android:drawable="@drawable/button_red_normal"></item>
</selector>
<2>按钮上的文字的选择器
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="#000" android:state_pressed="true"></item>
<item android:color="#fff"></item>
</selector>
3.java后台代码
(1)MainActivity.class
package com.example.administrator.test66smartbeijing; import android.content.Intent;
import android.content.SharedPreferences;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.animation.AlphaAnimation;
import android.view.animation.Animation;
import android.view.animation.AnimationSet;
import android.view.animation.RotateAnimation;
import android.view.animation.ScaleAnimation;
import android.widget.RelativeLayout; import com.example.administrator.test66smartbeijing.utils.ConstantValue;
import com.example.administrator.test66smartbeijing.utils.SharePreferenceUtil; /**
* 闪屏页面(通过动画实现)
*/
public class MainActivity extends AppCompatActivity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); RelativeLayout rl_main=findViewById(R.id.rl_main);
//设置旋转动画
RotateAnimation rotateAnimation=new RotateAnimation(0,360,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f);
rotateAnimation.setDuration(1000); //设置动画时间
rotateAnimation.setFillAfter(true); //保持动画结束状态 //设置缩放动画
ScaleAnimation scaleAnimation=new ScaleAnimation(0,1,0,1,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f);
scaleAnimation.setDuration(1000);
scaleAnimation.setFillAfter(true); //渐变动画
AlphaAnimation alphaAnimation=new AlphaAnimation(0,1);
alphaAnimation.setDuration(2000); //设置动画时间
alphaAnimation.setFillAfter(true); //保持动画结束状态 //动画集合
AnimationSet animationSet=new AnimationSet(true);
animationSet.addAnimation(rotateAnimation);
animationSet.addAnimation(scaleAnimation);
animationSet.addAnimation(alphaAnimation); //启动动画
rl_main.startAnimation(animationSet); //给动画添加监听事件
animationSet.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) { } @Override
public void onAnimationEnd(Animation animation) {
//动画结束后执行
//用SharedPreferences存储用户是否是第一次进入的状态
boolean is_first_enter=SharePreferenceUtil.getBoolean(getApplicationContext(),ConstantValue.IS_FIRST_ENTER,true);
Intent intent;
if(is_first_enter){
//进入新手引导界面
intent=new Intent(getApplicationContext(),UserGuideActivity.class);
}else {
//进入主界面
intent=new Intent(getApplicationContext(),MainFunctionActivity.class);
}
startActivity(intent); //开启页面跳转
finish();//结束当前页面
} @Override
public void onAnimationRepeat(Animation animation) { }
});
}
}
(2)
package com.example.administrator.test66smartbeijing; import android.support.annotation.NonNull;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout; import java.util.ArrayList;
import java.util.List; public class UserGuideActivity extends AppCompatActivity { ViewPager viewPager;
LinearLayout ll_guide_spot;
ImageView iv_red_spot;
Button bt_userguide_start;
//创建一个数组用来存放新手向导的图片
int[] imageIdArray=new int[]{R.mipmap.guide_1,R.mipmap.guide_2,R.mipmap.guide_3};
List<ImageView> imageViewList; //用来存放ImageView控件的集合
int moveDistance; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_user_guide); viewPager = findViewById(R.id.vp_user_guide);
ll_guide_spot=findViewById(R.id.ll_guide_spot);
iv_red_spot=findViewById(R.id.iv_red_spot);
bt_userguide_start=findViewById(R.id.bt_userguide_start);
bt_userguide_start.setVisibility(View.INVISIBLE); initData();
viewPager.setAdapter(new MyViewPager()); //给viewpager设置适配器
//给viewpager设置滑动监听事件
viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
//当页面滑动过程中回调
//更新页面中小红点的位置
//1.计算小红点当前的左边距
int leftMargin= (int) (moveDistance*positionOffset)+position*moveDistance;
//2.获取当前小红点的布局参数
RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) iv_red_spot.getLayoutParams();
//3.修改左边距
layoutParams.leftMargin=leftMargin;
//4.重新设置布局参数
iv_red_spot.setLayoutParams(layoutParams);
} @Override
public void onPageSelected(int position) {
//某个页面被选中
if(position==imageIdArray.length-1){
bt_userguide_start.setVisibility(View.VISIBLE);
}else {
bt_userguide_start.setVisibility(View.INVISIBLE);
}
} @Override
public void onPageScrollStateChanged(int state) { }
}); iv_red_spot.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
iv_red_spot.getViewTreeObserver().removeOnGlobalLayoutListener(this); //移除监听,避免重复回调
//计算两个小圆点之间的距离
//小红点的移动距离=第二个小圆点的left值-第一个小圆点的left值
moveDistance=ll_guide_spot.getChildAt(1).getLeft()-ll_guide_spot.getChildAt(0).getLeft();
}
});
} //初始化数据
private void initData() {
imageViewList=new ArrayList<>();
for (int i = 0; i <imageIdArray.length ; i++) {
ImageView imageView=new ImageView(getApplicationContext());
imageView.setBackgroundResource(imageIdArray[i]);
imageViewList.add(imageView); //初始化小圆点
ImageView spot=new ImageView(getApplicationContext());
spot.setImageResource(R.drawable.user_spot_gray);
//初始化布局参数
LinearLayout.LayoutParams params=new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT);
if(i>0){
params.leftMargin=15;
}
spot.setLayoutParams(params); //设置小圆点的间距
ll_guide_spot.addView(spot);
}
} private class MyViewPager extends PagerAdapter {
//返回item的个数
@Override
public int getCount() {
return imageViewList.size();
} @Override
public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
return view==object;
} //初始化item布局
@NonNull
@Override
public Object instantiateItem(@NonNull ViewGroup container, int position) {
ImageView imageView=imageViewList.get(position);
container.addView(imageView);
return imageView;
} //销毁item
@Override
public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
container.removeView((View) object);
}
}
}
4.效果图

033 Android App启动的闪屏效果+新手向导(多个图片滑动效果)+ViewPager使用的更多相关文章
- android app启动就闪退怎么办?
开发过程中,如遇到android app启动就闪退,不要急,直接进入调试模式运行app,就会取得出错的原因. http://blog.sina.com.cn/s/blog_44fa172f0102wg ...
- Android app启动出现白屏闪屏
出现白屏闪屏原因: 进入到AppStartActivity,但是未加载到布局文件,就先显示了窗口的背景,白屏就是显示的windows的背景,即所设置的theme. onCreate()中的setCon ...
- Android App 启动页(Splash)黑/白闪屏现象产生原因与解决办法(转)
转载: Android App 启动页(Splash)黑/白闪屏现象产生原因与解决办法 首先感谢博主分享,本文作为学习记录 惊鸿一瞥 微信的启动页,相信大家都不陌生. 不知道大家有没有发现一个现象 ...
- [FMX] Android APP 启动黑屏优化补丁
使用说明 *************************************************** Android APP 启动黑屏优化补丁 作者: Swish, YangYxd 201 ...
- Android 解决启动页白屏或者黑屏的问题
欢迎页启动的线程由于请求和处理的数据量过大而,导致欢迎页在出现之前界面上会有一个短暂的白色闪屏停留,当然白色闪屏的停留是因为 application 的主题样式android:theme=@style ...
- Android Activity启动黑/白屏原因与解决方式
Android Activity启动黑/白屏原因与解决方式 我们新建一个HelloWorld项目,运行在手机上时,Activity打开之前会有一个动画,而这个动画里是全白或者全黑的(取决于你的主题是亮 ...
- Android app启动activity并调用onCreate()方法时都默默地干了什么?
Android app启动activity并调用onCreate() 方法时都默默地干了什么? 在AndroidManifest.xml文件中的<intent-filter>元素中有这 ...
- Android app启动是出现白屏或者黑屏如何解决?
1.为什么 APP 启动时会出现白屏或者黑屏? 当打开一个 Activity 时,如果这个 Activity 所属的应用还没有在运行,系统会为这个 Activity 所属的应用创建一个进程,但进程的创 ...
- android开发之splash闪屏页判断是否第一次进入app代码
package com.david.david.zhankudemo.activity; import android.app.Activity; import android.content.Con ...
随机推荐
- golang-flag - 命令行参数解析
flag - 命令行参数解析 在写命令行程序(工具.server)时,对命令参数进行解析是常见的需求.各种语言一般都会提供解析命令行参数的方法或库,以方便程序员使用.如果命令行参数纯粹自己写代码解析, ...
- 巧用DNSlog实现无回显注入【转载】
原作者:afanti 原出处:https://www.cnblogs.com/afanti/p/8047530.html 0x00 简介 测试一些网站的时候,一些注入都是无回显的,我们可以写脚本来进行 ...
- Samba文件共享服务设置
SMB的主程序 smbd:SMB-TCP139,CIFS-TCP445 nmbd:NetBios-UDP137,138 SMB主程序对应的两个服务 /etc/init.d/smb /etc/init. ...
- 三大框架 之 Hibernate生成策略与缓存策略(主键生成策略、持久化、持久化类划分、一级缓存、事物管理)
目录 Hibernate生成策略与缓存策略 主键生成策略 主键分类 主键的生成策略 持久化 什么是持久化 什么是持久化类 持久化类编写规则 持久化类的划分 三种状态区分 持久态对象特征 一级缓存 什么 ...
- Assignment2:因果图法的介绍与示例分析
一. 黑盒测试:是一种常用的软件测试方法,它将被测软件看作一个打不开的黑盒,主要根据功能需求设计测试用例,进行测试.几种常用的黑盒测试方法和黑盒测试工具有,等价类划分法.边界值分析法.因果图法.决策表 ...
- MYSQL 神奇的操作insert into test select * from test;
将16行数据复制一份插入数据库,变成32行
- make 实例 一 3463
######################################################################### # # Makefile used for buil ...
- linux内核挂载根文件系统时报错”VFS: Cannot open root device "ram0" or unknown-block(0,0): error -6“如何处理?
1. 通过error -6得到: #define ENXIO 6 /* No such device or address */ 2. 解决办法 使能CONFIG_BL ...
- AndoridSQLite数据库开发基础教程(9)
AndoridSQLite数据库开发基础教程(9) 添加视图 视图是从一个或几个基本表(或视图)中导出的虚拟的表.通过视图可以看到表的内容.下面为数据库添加视图,操作步骤如下: (1)打开的数据库,单 ...
- 小D课堂 - 零基础入门SpringBoot2.X到实战_第9节 SpringBoot2.x整合Redis实战_37、分布式缓存Redis介绍
笔记 1.分布式缓存Redis介绍 简介:讲解为什么要用缓存和介绍什么是Redis,新手练习工具 1.redis官网 https://redis.io/download ...