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);
    }

}

 

  • 3
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
### 回答1: Android Studio引导实现可以通过以下步骤完成: 1. 创建一个新的Android Studio项目。 2. 在项目中创建一个新的Activity,用于显示引导。 3. 在引导Activity中添加一个ViewPager控件,用于显示多个面。 4. 创建一个PagerAdapter类,用于管理ViewPager中的面。 5. 在PagerAdapter中添加需要显示的面,可以使用布局文件或代码方式创建。 6. 在引导Activity中添加一个指示器控件,用于显示当前面的位置。 7. 在ViewPager的OnPageChangeListener中更新指示器的位置。 8. 在最后一个面中添加一个按钮,用于跳转到主界面或登录界面。 9. 在按钮的点击事件中跳转到相应的界面。 以上就是Android Studio引导实现的基本步骤,可以根据具体需求进行调整和扩展。 ### 回答2: 引导在移动应用中是一个非常重要的组件,它可以帮助用户更好地了解应用程序的功能和使用,提高用户的体验和满意度。Android Studio提供了良好的支持来实现应用程序的引导实现步骤如下: 1.创建一个新项目 在Android Studio中创建一个新项目。在创建项目的过程中,可以选择空白活动,在项目创建后再进行引导的添加。 2.设计引导 准备好需要展示的引导图片,并按照设计图的要求进行切图、编辑等操作。 3.创建视图控件 打开activity_main.xml文件,并添加ViewPager和CircleIndicator视图控件,用于展示引导和指示当前展示的引导的位置。ViewPager需要用Adapter进行管理,并创建好相应的Fragment或者View视图。 4.创建引导适配器 创建一个继承自PagerAdapter的适配器类,用于管理ViewPager中展示的引导视图控件。在适配器中需要重写getCount()方法,返回需要展示的引导数量;getItem()方法,返回某一个特定位置的引导视图控件;以及isViewFromObject()方法,用于判断某个视图控件是否为某一视图。 5.添加动画效果 在不同的引导之间需要添加相应的动画效果,以便让用户更加吸引和留意。可以使用Android中提供的Animator、ObjectAnimator等动画技术实现需要的动画效果。 6.完善引导功能 在ViewPager中添加事件监听器,以便在规定条件下实现面跳转和引导的最终目标。 7.测试 在完成代码编写后需要进行测试,并检查引导中的所有功能是否正常工作。以便在发布应用时达到最佳效果。 总之,通过上述步骤的操作,可以在Android Studio中很轻松地实现一个流畅、功能完备的引导。这将有助于提高用户体验和应用程序的使用率。 ### 回答3: 在开发Android应用时,经常需要添加引导来给用户介绍应用的基本功能和操作方法。本文将以Android Studio为例,介绍如何实现引导。 一、创建项目 首先打开Android Studio,点击“Start a new Android Studio project”,选择“Empty Activity”,输入“App name”和“Package name”,点击“Finish”创建项目。 二、添加引导 1、步骤一 在“app”文件夹下,右键点击“res”,选择“New”-“Android Resource File”,设置“Resource type”为“layout”,命名为“activity_main.xml”(这里取名为activity_main.xml是为了后面直接复制粘贴代码方便)。 2、步骤二 右键点击“res”文件夹,选择“New”-“Folder”-“Values Folder”,命名为“values-w820dp”(这个文件夹的作用是为了适配平板设备),在该文件夹下创建一个名为“dimens.xml”的布局文件,在该文件中添加以下代码: ``` <resources> <dimen name="tutorial_image_size">450dp</dimen> <dimen name="tutorial_image_padding">30dp</dimen> <dimen name="tutorial_title_size">20sp</dimen> <dimen name="tutorial_title_padding_top">30dp</dimen> <dimen name="tutorial_description_size">14sp</dimen> <dimen name="tutorial_description_padding_top">10dp</dimen> <dimen name="tutorial_button_padding_top">50dp</dimen> <dimen name="tutorial_button_size">50dp</dimen> </resources> ``` 3、步骤三 在“res”文件夹下创建一个名为“drawable”的文件夹,将要使用的引导图片拷贝到该文件夹下。 4、步骤四 在“res”文件夹下创建一个名为“values”的文件夹,在该文件夹下创建一个名为“colors.xml”的布局文件,在该文件中添加以下代码: ``` <resources> <color name="colorPrimary">#3F51B5</color> <color name="colorPrimaryDark">#303F9F</color> <color name="colorAccent">#FF4081</color> <color name="colorTutorialBackground">#FFFFFF</color> </resources> ``` 5、步骤五 在“res”文件夹下创建一个名为“drawable”的文件夹,在该文件夹下创建一个名为“gradient_tutorial_background.xml”的布局文件,在该文件中添加以下代码: ``` <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <gradient android:startColor="@color/colorPrimary" android:endColor="@color/colorPrimaryDark" android:angle="135" /> </shape> ``` 6、步骤六 在“res”文件夹下创建一个名为“layout”的文件夹,在该文件夹下创建一个名为“item_viewpager_tutorial.xml”的布局文件,在该文件中添加以下代码: ``` <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/colorTutorialBackground" android:orientation="vertical" android:padding="@dimen/tutorial_image_padding"> <ImageView android:id="@+id/imageViewPagerTutorial" android:layout_width="@dimen/tutorial_image_size" android:layout_height="@dimen/tutorial_image_size" android:layout_gravity="center_horizontal" android:layout_marginBottom="@dimen/tutorial_title_padding_top" android:src="@drawable/tutorial1" /> <TextView android:id="@+id/tvTitleViewPagerTutorial" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:layout_marginTop="@dimen/tutorial_title_padding_top" android:text="Title" android:textColor="#000000" android:textSize="@dimen/tutorial_title_size" /> <TextView android:id="@+id/tvDescriptionViewPagerTutorial" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:layout_marginTop="@dimen/tutorial_description_padding_top" android:text="Description" android:textColor="#000000" android:textSize="@dimen/tutorial_description_size" /> <Button android:id="@+id/btnSkipViewPagerTutorial" android:layout_width="@dimen/tutorial_button_size" android:layout_height="@dimen/tutorial_button_size" android:layout_gravity="right" android:background="@null" android:paddingTop="@dimen/tutorial_button_padding_top" android:text="Skip" android:textColor="#000000" /> </LinearLayout> ``` 7、步骤七 在“res”文件夹下创建一个名为“layout”的文件夹,在该文件夹下创建一个名为“activity_view_pager_tutorial.xml”的布局文件,在该文件中添加以下代码: ``` <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/gradient_tutorial_background"> <androidx.viewpager.widget.ViewPager android:id="@+id/viewPagerTutorial" android:layout_width="match_parent" android:layout_height="match_parent" /> </RelativeLayout> ``` 三、编写代码 1、步骤一 打开“MainActivity.java”文件,添加以下代码: ``` public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); boolean isFirstTime = MyPreferences.isFirst(MainActivity.this); if (isFirstTime) { startActivity(new Intent(MainActivity.this, ViewPagerTutorialActivity.class)); finish(); } } } ``` 2、步骤二 创建一个名为“MyPreferences”的Java类,在该类中添加以下代码: ``` public class MyPreferences { private static final String FIRST = "first"; private static SharedPreferences getSharedPreferences(Context context) { return context.getSharedPreferences("MyPreferences", MODE_PRIVATE); } public static void setFirst(Context context, boolean value) { SharedPreferences.Editor editor = getSharedPreferences(context).edit(); editor.putBoolean(FIRST, value).apply(); } public static boolean isFirst(Context context) { return getSharedPreferences(context).getBoolean(FIRST, true); } } ``` 3、步骤三 创建一个名为“ViewPagerTutorialActivity”的Java类,在该类中添加以下代码: ``` public class ViewPagerTutorialActivity extends AppCompatActivity { int[] tutorialImages = {R.drawable.tutorial1, R.drawable.tutorial2, R.drawable.tutorial3}; String[] titles = {"Title 1", "Title 2", "Title 3"}; String[] descriptions = {"Description 1", "Description 2", "Description 3"}; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_view_pager_tutorial); ViewPager viewPager = findViewById(R.id.viewPagerTutorial); TutorialViewPagerAdapter adapter = new TutorialViewPagerAdapter(this, tutorialImages, titles, descriptions); viewPager.setAdapter(adapter); Button btnSkip = findViewById(R.id.btnSkipViewPagerTutorial); btnSkip.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { MyPreferences.setFirst(ViewPagerTutorialActivity.this, false); startActivity(new Intent(ViewPagerTutorialActivity.this, MainActivity.class)); finish(); } }); } } ``` 4、步骤四 创建一个名为“TutorialViewPagerAdapter”的Java类,在该类中添加以下代码: ``` public class TutorialViewPagerAdapter extends PagerAdapter { private Context context; private int[] images; private String[] titles; private String[] descriptions; private LayoutInflater layoutInflater; public TutorialViewPagerAdapter(Context context, int[] images, String[] titles, String[] descriptions) { this.context = context; this.images = images; this.titles = titles; this.descriptions = descriptions; layoutInflater = LayoutInflater.from(context); } @Override public int getCount() { return images.length; } @Override public boolean isViewFromObject(View view, Object object) { return view == object; } @Override public Object instantiateItem(ViewGroup container, int position) { View view = layoutInflater.inflate(R.layout.item_viewpager_tutorial, container, false); ImageView imageView = view.findViewById(R.id.imageViewPagerTutorial); TextView tvTitle = view.findViewById(R.id.tvTitleViewPagerTutorial); TextView tvDescription = view.findViewById(R.id.tvDescriptionViewPagerTutorial); Button btnSkip = view.findViewById(R.id.btnSkipViewPagerTutorial); imageView.setImageResource(images[position]); tvTitle.setText(titles[position]); tvDescription.setText(descriptions[position]); if (position == getCount()-1) { btnSkip.setText("Finish"); } container.addView(view); return view; } @Override public void destroyItem(ViewGroup container, int position, Object object) { container.removeView((View) object); } } ``` 至此,Android Studio引导实现就完成了。在运行项目时,第一次打开应用会显示引导,用户按下Skip按钮,或者直接滑到最后一,点击Finish按钮进入主界面。之后再打开应用,就不会再显示引导了,因为已经保存了用户的选择。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

江南:-)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值