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 ...
随机推荐
- 如何解决金蝶IKernel.exe报错 Windows Installer 错误 重新安装、无法卸载
如何解决金蝶IKernel.exe报错 Windows Installer 错误 金蝶这个小婊子,就是这么贱. 卸载了高版本的,再安装低版本就不能安装上,死活都不能安装. 请手动启动一下Install ...
- Redis恢复数据
对于单点或者集群,都可以用 cat data.txt | redis-cli --pipe方式进行冷恢复. 对于大数据量会很慢,但不会出错.
- Mybatis笔记(二)
目录 MyBatis 逆向工程 MyBatis Generator 使用 分页插件 1.下载分页插件 2.配置分页插件 3.使用分页插件 SSM整合(spring与springMVC) 1.创建web ...
- k8s 配置文件 详解
apiVersion: v1 # [必须]版本号kind: Pod # [必选]Podmetadata: # [必选-Object]元数据 name: String # [必选] Pod的名称 nam ...
- pythonw.exe不能用
其实可以直接执行python目录下的Lib/idlelib/idle.bat即可,对于非安装版的python来说开始菜单是找不到启动快捷方式的.
- sublime text3中如何使用PHP编译系统
[WinError 2] 系统找不到指定的文件 编译错误原因,是因为编译器没有配置 第一步: 添加php可执行程序所在目录到系统环境变量(具体方法此处省略,使用本文下面的说明中的方法,此步骤可以省略 ...
- 【java/Json】用Java对象构建Json语法树
本文后续:https://www.cnblogs.com/xiandedanteng/p/11973129.html 编译第一步:将文本解析成Java对象构成的语法树 第二步:将语法树输出整形好的Js ...
- 怎么设置cookie,怎么设置cookie以及删除cookie和cookie详解
在操作cookie之前,先来看一下cookie长什么样. 可以看到,cookie是一个个键值对(“键=值”的形式)加上分号空格隔开组合而成, 形如: "name1=value1; name2 ...
- python使用post请求发送图片并接受图片
图像读取编码与反编码: import requests import json import numpy as np import cv2 import base64 # 首先将图片读入 # 由于要发 ...
- autoComplete TextView
这个比较简单,只是将AutoCompleteTextView绑定一个ArrayAdapter就可以了. 界面布局: <?xml version="1.0" encoding= ...