【Androidstudio学习笔记】设计引导页功能

主目录

功能描述

此功能用于新用户第一次进入应用时在部分较为复杂的功能使用前展示的操作流程,当然也可以在后续的其他功能键重新查看引导流程

  1. 展示指定数量的引导页,并且在下面有固定的小圆点记录引导进度,可通过点击圆点切换引导页面(圆点配套颜色提醒,如果圆点和当前页面的索引相同,则显示红色,不同则显示白色,有利于提醒用户当前所在引导页面的位置)
  2. 也可通过左右滑动进行页面的切换,滑动/点击圆点都会触发颜色提醒
  3. 在划至最后一页时,提示用户可退出该引导
  4. 用户第一次打开应用并使用需要引导页引导的功能时,弹出引导页
  5. 点击最后一页的按钮可退出引导功能

大致思路

  1. activity主要用来获取组件,然后传给adapter适配器做剩下的工作
  2. adapter获取到RadioGroup在该节点下创建指定数量的RadioButton组件,并给RadioButton组件添加点击事件,用于切换小圆点和引导页的状态
  3. 给RadioGroup添加监听页面切换状态的回调,用于保证在滑动时小圆点和引导页的索引保持一致

准备工作

  1. 下载/截几张图用来当测试用的引导页
  2. 组件:ViewPager、RadioGroup,Radiobutton
  3. 在res的drawable文件夹中把1.里的图放进去(最好不要用中文)
  4. 在res的layout文件夹中创建两个xml,一个是放viewpager的,一个是放引导图的
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".LaunchSimpleActivity">

    <androidx.viewpager.widget.ViewPager
        android:id="@+id/vp_launch"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    </androidx.viewpager.widget.ViewPager>
    <RadioGroup
        android:id="@+id/rg_group"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:orientation="horizontal"
        android:layout_marginBottom="20dp"/>
</RelativeLayout>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <!-- 这是引导图片的图像视图 -->
    <ImageView
        android:id="@+id/iv_launch"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:adjustViewBounds="true"
        android:scaleType="fitXY" />



    <!-- 这是最后一页的入口按钮 -->

    <Button
        android:id="@+id/btn_start"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:text="退出引导,进入应用"
        android:background="@color/white"
        android:textColor="#499c54"
        android:textSize="22sp"
        android:visibility="gone" />"
</RelativeLayout>

代码

Activity

public class LaunchSimpleActivity extends AppCompatActivity {
    // 声明引导页面的图片数组
    private int[] lanuchImageArray = {R.drawable.guide_bg1,
            R.drawable.guide_bg2, R.drawable.guide_bg3, R.drawable.guide_bg4};

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_launch_simple);
        // 从布局视图中获取名叫vp_launch的翻页视图
        ViewPager vp_launch = findViewById(R.id.vp_launch);
        RadioGroup radioGroup = findViewById(R.id.rg_group);
        // 构建一个引导页面的翻页适配器
        LaunchSimpleAdapter adapter = new LaunchSimpleAdapter(vp_launch,radioGroup, this, lanuchImageArray);
        vp_launch.setAdapter(adapter); // 设置翻页视图的适配器
        vp_launch.setCurrentItem(0); // 设置翻页视图显示第一页
    }
    
}

Adapter

public class LaunchSimpleAdapter extends PagerAdapter {
    List<View> mViewList = new ArrayList<View>(); // 声明一个引导页的视图列表
    ViewPager viewPager; //装载引导页的viewpager容器
    RadioGroup radioGroup; // 装载底部小圆点的容器

    Context mContext; // activity,用于创建新的组件

    int[] introImages; // 需要展示的引导图的数组

    // 引导页适配器的构造方法,传入上下文与图片数组
    public LaunchSimpleAdapter(ViewPager vp_launch,RadioGroup radioGroup, final Context context, int[] imageArray) {
        this.viewPager = vp_launch;
        this.introImages = imageArray;
        this.mContext = context;
        this.radioGroup = radioGroup;
        // 根据布局文件item_launch.xml生成视图对象
        initViewPager();
        for (int i = 0; i < imageArray.length; i++) {
            View tem_intro_view = LayoutInflater.from(context).inflate(R.layout.item_launch, null);
            ImageView iv_launch = tem_intro_view.findViewById(R.id.iv_launch);
//            RadioGroup rg_indicate = intro_view.findViewById(R.id.rg_indicate);
            Button btn_start = tem_intro_view.findViewById(R.id.btn_start);
            iv_launch.setImageResource(imageArray[i]); // 设置引导页的全屏图片
            // 如果是最后一个引导页,则显示入口按钮,以便用户点击按钮进入主页
            if (i == imageArray.length - 1) {
                btn_start.setVisibility(View.VISIBLE);
                btn_start.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        // 这里要跳到应用主页
                        Toast.makeText(context, "欢迎您开启美好生活",
                                Toast.LENGTH_SHORT).show();
                    }
                });
            }
            mViewList.add(tem_intro_view); // 把该图片对应的页面添加到引导页的视图列表
        }
        initPots();
        switchPotStatus(0);
    }

    // 获取页面项的个数
    public int getCount() {
        return mViewList.size();
    }

    // 判断当前视图是否来自指定对象
    public boolean isViewFromObject(View view, Object object) {
        return view == object;
    }

    // 从容器中销毁指定位置的页面
    public void destroyItem(ViewGroup container, int position, Object object) {
        container.removeView(mViewList.get(position));
    }

    // 实例化指定位置的页面,并将其添加到容器中
    public Object instantiateItem(ViewGroup container, int position) {
        container.addView(mViewList.get(position));
        return mViewList.get(position);
    }

    private void initViewPager() {
        //初始化viewpager的页面变化监听事件
        viewPager.addOnPageChangeListener(onPageChangeListener);
        viewPager.setPageTransformer(true,new ZoomOutPageTransformer());
    }

    private ViewPager.OnPageChangeListener onPageChangeListener = new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

        }

        @Override
        public void onPageSelected(int position) {
            switchPotStatus(position);
        }

        @Override
        public void onPageScrollStateChanged(int state) {

        }
    };
    private void initPots(){
        for (int i = 0; i < introImages.length; i++) {
            //需要依次排序
            RadioButton radio = new RadioButton(mContext); // 创建一个单选按钮
            radio.setLayoutParams(new ViewGroup.LayoutParams(
                    ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
            radio.setButtonDrawable(R.mipmap.unselected_pot); // 设置单选按钮的图标
            radio.setPadding(10, 0, 10, 0); // 设置单选按钮的四周间距
            radioGroup.addView(radio); // 把单选按钮添加到页面底部的单选组
            int index = i;
            radio.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    viewPager.setCurrentItem(index);
                    switchPotStatus(index);
                }
            });
        }
    }

    private void switchPotStatus(int position){
        int count = radioGroup.getChildCount();
        for (int i = 0; i < count; i++) {
            ((RadioButton)radioGroup.getChildAt(i)).setButtonDrawable(R.mipmap.unselected_pot);
        }
        ((RadioButton)radioGroup.getChildAt(position)).setButtonDrawable(R.mipmap.selected_pot);
        radioGroup.invalidate();
    }

}

我在网上查找对应的功能脚本时,发现没有我想要的小圆点保持悬浮状态在屏幕下方的功能,因此我的代码添加了一些细节

滑动动画

import android.annotation.SuppressLint;


import android.util.Log;

import android.view.View;

import androidx.viewpager.widget.ViewPager;

public class ZoomOutPageTransformer implements ViewPager.PageTransformer {
    private static final float MIN_SCALE = 0.85f;

    private static final float MIN_ALPHA = 0.5f;


    @SuppressLint("NewApi")

    public void transformPage(View view, float position) {

        int pageWidth = view.getWidth();

        int pageHeight = view.getHeight();

        if (position < -1) { // [-Infinity,-1)

            // This page is way off-screen to the left.

            view.setAlpha(0);
        } else if (position <= 1) //a页滑动至b页 ; a页从 0.0 -1 ;b页从1 ~ 0.0

        { // [-1,1]

            // Modify the default slide transition to shrink the page as well

            float scaleFactor = Math.max(MIN_SCALE, 1 - Math.abs(position));

            float vertMargin = pageHeight * (1 - scaleFactor) / 2;

            float horzMargin = pageWidth * (1 - scaleFactor) / 2;

            if (position < 0) {

                view.setTranslationX(horzMargin - vertMargin / 2);

            } else {

                view.setTranslationX(-horzMargin + vertMargin / 2);

            }


            // Scale the page down (between MIN_SCALE and 1)

            view.setScaleX(scaleFactor);

            view.setScaleY(scaleFactor);


            // Fade the page relative to its size.

            view.setAlpha(MIN_ALPHA + (scaleFactor - MIN_SCALE)

                    / (1 - MIN_SCALE) * (1 - MIN_ALPHA));


        } else { // (1,+Infinity]

            // This page is way off-screen to the right.

            view.setAlpha(0);

        }

    }
}

总结

代码量不大,逻辑也不复杂,当前还只是demo阶段,放在正式环境下的话还需要商讨引导页的获取是通过本地直接获取还是从服务器下拉资源。后者的话则还需要添加接入网络部分的代码
xml文件里有的可能会报错,记得自己改一下内容
希望可以帮到需要帮助的兄弟们

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Android Studio是Google推出的Android应用程序开发工具,它集成了开发、调试、打包等功能。要学习使用Android Studio,需要了解以下几个方面的知识: 1. Java基础: Android开发是基于Java语言的,所以要学习Android Studio首先要掌握Java基础知识。 2. Android基础: 了解Android操作系统的基本构架和常用组件,如Activity、Service、BroadcastReceiver等。 3. Android Studio使用: 了解Android Studio的基本界面和常用功能,如创建工程、编写代码、调试程序等。 4. Android SDK: 了解Android SDK的安装和配置,以及如何使用SDK Manager来下载SDK并配置项目。 5. 练习实践: 多练习实际项目,熟悉Android Studio的使用,并不断练习和完善自己的技能。 ### 回答2: Android Studio 是一个为 Android 来开发的整体开发环境。它基于 IntelliJ IDEA ,强调速度和智能操作,并致力于为应用程序开发提供高效率的开发工具。Android Studio 的推出,使得 Android 开发者更加容易地创建高质量的应用程序。 首先,要学 Android Studio ,你需要首先了解一些基本知识。学习 Android Studio 的工具包括 Gradle 、 Kotlin 和 Java 等。通过学习这些基础知识,你可以了解不同的语言、工具和框架。 在学习 Android Studio 时要使用实战性的方法。也就是说,每次学习新的东西时,你需要找到一个相关的例子。这样可以帮助你更好地理解它。如果你使用 Android Studio 模板,这将非常有用。这些模板可以帮助你创建常见的应用程序结构,并且你可以基于这些模板创建自己的应用程序。 另外,还有很多不同的工具和插件可以帮助你学习 Android Studio 。例如, Android Studio 网站上有很多有用的文章和教程,可以帮助你更好地理解 Android Studio 。还有很多在线工具可以帮助你实现特定的功能,在初学者阶段,这些工具可以为学习的难度减轻很多。 总之,学习 Android Studio 任重而道远。需要有耐心和时间,还需要不断地尝试和实践。在这个过程中,你可以尝试教学资料、交流学习合作、进一步增强你的知识水平。通过不断的应用和实践,一定可以成为一名优秀的 Android 开发者并圆满地完成应用开发。 ### 回答3: 作为一个应用开发者,学习使用安卓应用程序开发套件非常重要。Android Studio是Google出品的最新安卓开发工具,它具有多种强大的工具和功能,可以极大地提高应用程序的开发效率和质量。在学习过程中,个人对Android Studio的理解主要体现在以下几个方面。 首先,要开始使用Android Studio,需要了解它的基本结构和工具。Android Studio主要由三个主要组件组成:IDE、SDK、和Emulator。IDE是开发者使用的主要工具。它提供了编写、测试和调试代码所需的所有基本功能,包括视觉化设计器,代码编辑器和调试工具。SDK是开发应用程序所需的软件开发包。它包括实用程序和库,可用于在应用程序中实现预定功能。Emulator是一个虚拟的安卓设备,可以用来在开发应用程序时模拟真实设备上的应用程序运行情况。 其次,一些基本的编程知识也必不可少,例如Java编程、XML语言、UI界面设计等。JavaAndroid Studio中最常用的编程语言,用于编写应用程序的逻辑代码;XML语言则用于设计UI界面。在学习这些基本知识时,建议首先了解Java语言特性和面向对象编程理念,熟悉它们的基本语法和数据类型。同时,也可以通过在线教程和网课等方式加强对UI设计和布局的理解。 最后,学会使用网上的资源和社区的帮助非常重要。Android Studio的开发者社区很大,有很多在线资源可以帮助开发者的开发学习,例如stack overflow、CSDN社区等。同时,Google官方的开发者网站也提供了大量的文档资料、教程、API使用说明等。 总之,Android Studio学习需要进行持续不断的针对不同方面的学习和实践。要充分运用Android Studio的强大功能,建议在掌握基础知识的基础上,多做实际的项目练习,不断提高自己的技术水平和代码能力,才能成为一名优秀的安卓应用程序开发者。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

淳杰

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

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

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

打赏作者

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

抵扣说明:

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

余额充值