zoukankan      html  css  js  c++  java
  • 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.效果图

  • 相关阅读:
    JS仿FLASH特效可跳转回首页的CSS二级联动菜单
    来自Individuality纯CSS打造的笔记本样式的菜单导航
    Jquery仿Flash效果的3款滑动菜单
    简约漂亮的JS下拉风格的导航条
    还不错来自老外的Milonic DHTML/JavaScript Menu菜单导航
    摘自当当网的36类商品分类菜单
    纯CSS实现的蓝色竖向导航代码
    JS打造可折叠展开的导航菜单(Slashdot Menu)
    纯CSS打造的圆角下拉导航菜单
    Jquery仿FLASH特效超漂亮的CSS菜单
  • 原文地址:https://www.cnblogs.com/luckyplj/p/10927803.html
Copyright © 2011-2022 走看看