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.效果图

  • 相关阅读:
    [LeetCode]2. Add Two Numbers链表相加
    Integration between Dynamics 365 and Dynamics 365 Finance and Operation
    向视图列添加自定义图标和提示信息 -- PowerApps / Dynamics365
    Update the Power Apps portals solution
    Migrate portal configuration
    Use variable to setup related components visible
    Loyalty management on Retail of Dynamic 365
    Modern Fluent UI controls in Power Apps
    Change screen size and orientation of a canvas app in Power App
    Communication Plan for Power Platform
  • 原文地址:https://www.cnblogs.com/luckyplj/p/10927803.html
Copyright © 2011-2022 走看看