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使用的更多相关文章

  1. android app启动就闪退怎么办?

    开发过程中,如遇到android app启动就闪退,不要急,直接进入调试模式运行app,就会取得出错的原因. http://blog.sina.com.cn/s/blog_44fa172f0102wg ...

  2. Android app启动出现白屏闪屏

    出现白屏闪屏原因: 进入到AppStartActivity,但是未加载到布局文件,就先显示了窗口的背景,白屏就是显示的windows的背景,即所设置的theme. onCreate()中的setCon ...

  3. Android App 启动页(Splash)黑/白闪屏现象产生原因与解决办法(转)

    转载: Android App 启动页(Splash)黑/白闪屏现象产生原因与解决办法   首先感谢博主分享,本文作为学习记录 惊鸿一瞥 微信的启动页,相信大家都不陌生. 不知道大家有没有发现一个现象 ...

  4. [FMX] Android APP 启动黑屏优化补丁

    使用说明 *************************************************** Android APP 启动黑屏优化补丁 作者: Swish, YangYxd 201 ...

  5. Android 解决启动页白屏或者黑屏的问题

    欢迎页启动的线程由于请求和处理的数据量过大而,导致欢迎页在出现之前界面上会有一个短暂的白色闪屏停留,当然白色闪屏的停留是因为 application 的主题样式android:theme=@style ...

  6. Android Activity启动黑/白屏原因与解决方式

    Android Activity启动黑/白屏原因与解决方式 我们新建一个HelloWorld项目,运行在手机上时,Activity打开之前会有一个动画,而这个动画里是全白或者全黑的(取决于你的主题是亮 ...

  7. Android app启动activity并调用onCreate()方法时都默默地干了什么?

    Android app启动activity并调用onCreate() 方法时都默默地干了什么?   在AndroidManifest.xml文件中的<intent-filter>元素中有这 ...

  8. Android app启动是出现白屏或者黑屏如何解决?

    1.为什么 APP 启动时会出现白屏或者黑屏? 当打开一个 Activity 时,如果这个 Activity 所属的应用还没有在运行,系统会为这个 Activity 所属的应用创建一个进程,但进程的创 ...

  9. android开发之splash闪屏页判断是否第一次进入app代码

    package com.david.david.zhankudemo.activity; import android.app.Activity; import android.content.Con ...

随机推荐

  1. 小程序弹框wx.showModal的使用

    if (!logined) { wx.showModal({ title: '提示', content: '您还没登录登录车掌柜, 是否前往登录', confirmText: '前往登录', conf ...

  2. docker理论 Cgroup namespace 各种隔离

    耦合 是指两个或两个以上的体系或者两种运动形式间通过相互作用而批次影响以至联合起来的现象. Nginx与apache 在同一台服务器运行都占用80端口,起冲突这是我们修改其中一个端口为8080 半解耦 ...

  3. 讨论关于RAID以及RAID对于存储的影响

    定义及作用 RAID是Redundent Array of Inexpensive Disks的缩写,直译为“廉价冗余磁盘阵列”,也简称为“磁盘阵列”.后来RAID中的字母I被改作了Independe ...

  4. abp zero bug

    web host 项目中ChatController GetUploadedObject 使用:using (CurrentUnitOfWork.SetTenantId(null)) 图片刷新出错,改 ...

  5. (基因功能 & 基因表达调控)研究方案

    做了好久的RNA-seq分析,基因表达也在口头溜了几年了,但似乎老是浮在表面. 对一件事的了解程度决定了你的思维深度,只想做技工就不用想太多,想做大师就一定要刨根问底. 老是说基因表达,那么什么是基因 ...

  6. Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated column 'kindergarten.n.stuMChkTime' which is not functionally dependent on columns in GROUP BY clause; this is in

    错误原因: ​ sql _mode中only _full _group _by不兼容的问题 解决思路: ​ 既然是only _full _group _by不兼容,那就把它去掉就好啦 show var ...

  7. Java_jdbc 基础笔记之二 数据库连接

    /** * DriverManager 类是驱动程序管理器类 * 1)可以通过重载的getConnection()方法获取数据库的连接,较为方便 * 2)可以同时管理多个驱动程序:若注册了多个数据库连 ...

  8. 惠普打印机和扫描仪修复医生 HP Print and Scan Doctor

    https://support.hp.com/cn-zh/topic/printscandoctor-printing-problems http://ftp.hp.com/pub/printers/ ...

  9. PDF生成类库

    from:https://blog.csdn.net/plean/article/details/8097015 最近忙了两个星期的任务了     iTextSharp.dll是个开源的用于生成pdf ...

  10. flutter 中的搜索条实现

    import 'package:flutter/material.dart'; import 'package:flutter_app/SearchBarDemo.dart'; void main() ...