Android欢迎界面和引导页的实现

前言:欢迎界面我理解的意思是,启动程序也想要一定时间,不如用线程控制,打一下广告

效果图:

这里我就先写一个最简单一个界面,3秒后进入主程序。

manifest里这段代码,就是控制开启程序的第一个页面

  <intent-filter>
                <action android:name="android.intent.action.MAIN"/>

                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
public class SplashActivity extends AppCompatActivity {
    Handler mHandler = new Handler();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_splash);
        mHandler.postDelayed(new Runnable() {
            @Override
            public void run() {
                SharedPreferences sp = getPreferences(MODE_PRIVATE);
                boolean isFirst = sp.getBoolean("isFirst", true);
                Intent intent = new Intent();
                if (isFirst) {
                    sp.edit().putBoolean("isFirst", false).commit();
                    //如果用户是第一次安装应用并进入
                    intent.setClass(SplashActivity.this, LoginActivity.class);
                } else {
                    intent.setClass(SplashActivity.this, MainActivity.class);
                }
                startActivity(intent);
                finish();

            }
        }, 3000);
    }

}

这是第一个这个适应于 sqlite 数据库

这个适用于Bmob 数据库

public class SplashActivity extends AppCompatActivity {
    Handler mHandler = new Handler();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_splash);
        Bmob.initialize(this,"","Bomb");

        mHandler.postDelayed(new Runnable() {
            @Override
            public void run() {
                Intent intent = new Intent();
                BmobUser bmobUser = BmobUser.getCurrentUser();

                if(bmobUser != null){
                    // 允许用户使用应用
                    intent.setClass(SplashActivity.this, MainActivity.class);
                }else{
                    //缓存用户对象为空时, 可打开用户注册界面…
                    intent.setClass(SplashActivity.this, LoginActivity.class);
                }
                startActivity(intent);
                finish();

            }
        }, 3000);
    }

}

第二种 调用人家已经写好的开源代码,我觉得 用Android studio最大好处 导包容易啊,但是报错也容易,苦笑。

https://github.com/PaoloRotolo/AppIntro 这里我引用的这个开源框架。

但是我有点没有看懂 ,感觉版本太多,我有个习惯不喜欢看教学视频,一般直接看源码。

这个先用简单的等我真个项目结束后,我用photoshop p3张图功能描述图 做安装简介,可以用开源框架,也可以写4页滑动,在最后一页,放一个按钮,跳进主程序。主要是虚拟机慢,不喜欢停顿的时刻。

这篇博客时隔快一年了 点有来写一下3页轮播欢迎页

效果图:

逻辑处理判断:

欢迎界面实现的逻辑是判断用户是否首次进入app,如果是则进入欢迎页,欢迎页是由ViewPager实现的三页引导页滑动轮播,最后一页有立即体验按钮,点击后通过SharePreference保存用户已经不是第一次打开app了。如果不是首次进入欢迎,通过后台线程控制,30秒后自动跳转,判断用户是否已经登录,如果登录过,则进入主界面,否则进入登录界面。

ViewPager :引导页的轮播

SplashActivity .java

public class SplashActivity extends BaseActivity {
    private Handler mHandler = new Handler();

    @Override
    protected int contentViewID() {
        return R.layout.activity_splash;
    }

    @Override
    protected void initialize() {

        StatusBarUtils.setLightMode(SplashActivity.this);
        setTopTitle("",false);
        boolean isFirstOpen = (boolean) SharePreferenceUtil.get(SplashActivity.this, ConstantConfig.FIRST_OPEN, false);
        if (!isFirstOpen) {
            startActivityFinish(GuideActivity.class);
            return;
        }
        mHandler.postDelayed(new Runnable() {
            @Override
            public void run() {
                BmobUser bmobUser = BmobUser.getCurrentUser(MyUser.class);
                if(bmobUser != null){
                    startActivityFinish(MainActivity.class);
                } else {
                    startActivityFinish(LoginActivity.class);
                }
            }
        },3000);
    }
}

 GuideActivity.java

public class GuideActivity extends BaseActivity {

    @BindView(R.id.viewpager_guide)
    ViewPager vpGuide;

    @BindView(R.id.ll)
    LinearLayout llDot;

    private GuideViewPagerAdapter guideAdapter;
    private List<View> views = new ArrayList<>();
    // 引导页图片资源
    private static final int[] pics = {R.layout.layout_guide1, R.layout.layout_guide2, R.layout.layout_guide3};
    // 底部小点图片
    private ImageView[] dotViews;

    @Override
    protected int contentViewID() {
        return R.layout.activity_guide;
    }

    @RequiresApi(api = Build.VERSION_CODES.O)
    @Override
    protected void initialize() {
        setTopTitle("",false);
        StatusBarUtils.setLightMode(GuideActivity.this);
        initBtn();
        // 初始化adapter
        guideAdapter = new GuideViewPagerAdapter(views);
        vpGuide.setAdapter(guideAdapter);

        vpGuide.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            // 当新的页面被选中时调用
            @Override
            public void onPageSelected(int position) {
                // 设置底部小点选中状态
                setCurDot(position);
            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });
        initDots();
    }

    private void initBtn() {
        // 初始化引导页视图列表
        int btnIndex = pics.length - 1;
        for (int i = 0; i < pics.length; i++) {
            View view = LayoutInflater.from(this).inflate(pics[i], null);
            views.add(view);
            if (i == btnIndex) {
                view.findViewById(R.id.btn_enter).setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        // 如果切换到后台,就设置下次不进入功能引导页
                        SharePreferenceUtil.put(GuideActivity.this, ConstantConfig.FIRST_OPEN, true);
                        startActivityFinish(LoginActivity.class);
                    }
                });
            }
        }
    }
    
    /**
     * 设置当前指示点
     *
     * @param position
     */
    private void setCurDot(int position) {
        for (int i = 0; i < dotViews.length; i++) {
            if (position == i) {
                dotViews[i].setSelected(true);
            } else {
                dotViews[i].setSelected(false);
            }
        }
    }

    private void initDots() {
        LinearLayout.LayoutParams mParams = new LinearLayout.LayoutParams(45, 40);
        //设置小圆点左右之间的间隔
        mParams.setMargins(6, 0, 6, 0);
        dotViews = new ImageView[pics.length];
        //判断小圆点的数量,从0开始,0表示第一个
        for (int i = 0; i < pics.length; i++) {
            ImageView imageView = new ImageView(this);
            imageView.setLayoutParams(mParams);
            imageView.setImageResource(R.drawable.selector_dot);
            if (i == 0) {
                //默认启动时,选中第一个小圆点
                imageView.setSelected(true);
            } else {
                imageView.setSelected(false);
            }
            //得到每个小圆点的引用,用于滑动页面时,(onPageSelected方法中)更改它们的状态。
            dotViews[i] = imageView;
            //添加到布局里面显示
            llDot.addView(imageView);
        }

    }

}

 PagerAdapter 适配器

public class GuideViewPagerAdapter extends PagerAdapter {
    private List<View> views;
    private View mView;
    private Object mObject;

    public GuideViewPagerAdapter(List<View> views) {
        this.views = views;
    }

    // 获取要滑动的控件的数量,在这里我们以滑动的广告栏为例,那么这里就应该是展示的广告图片的ImageView数量
    @Override
    public int getCount() {
        if (views != null) {
            return views.size();
        }
        return 0;
    }

    // 来判断显示的是否是同一张图片,这里我们将两个参数相比较返回即可
    @Override
    public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
        return view == object;
    }

    // PagerAdapter只缓存三张要显示的图片,如果滑动的图片超出了缓存的范围,就会调用这个方法,将图片销毁
    @Override
    public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
        container.removeView(views.get(position));
    }

    // 当要显示的图片可以进行缓存的时候,会调用这个方法进行显示图片的初始化,我们将要显示的ImageView加入到ViewGroup中,然后作为返回值返回即可
    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        container.addView(views.get(position));
        return views.get(position);
    }

}

 

©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页