viewpager+fragment的懒加载实现微信点击和滑动切换功能(切换效果)

实现类似微信Viewpager-Fragment的惰性加载,lazy-loading 前言今天起床,拿起手机开机第一时间当然是打开微信了,左右滑动Viewpager,发现它使用了一种叫惰性加载,或者说懒加载(lazy-loading)的方式加载Viewpager中的Fragment。效果如图: 什么是lazy-loading呢?顾名思义就是在必要的时候才加载,否则不进行View的绘制和数据的加载。原因是Viewpager一次只会显示一个页卡,那么刚开始的时候,只需加载第一张Frag 阅读详情

前言

1.从上一片文章之后已经半年没有写文章了,那篇文章之后公司进入疯狂的加班,一直到放年假。年后回来之后换了一家创业公司之后,然后又进入疯狂的加班(≧﹏ ≦) …所以一直都没有写文章(其实这都是借口⊙﹏⊙)。现在公司没有那么忙了,也该把文章捡起来了,这毕竟是百利有一害的事(一害:费时间)。

2.这半年里除了对代码的热情更加高涨(虽然它总是虐我千百遍(≧﹏ ≦) ),还深深的中了爬山的毒,对于年轻的我来说,爬山让我明白了许多、懂得了许多,也锻炼了我的身体。对于程序员来说身体是非常重要的,大家在周末的时候可以爬爬山、跑跑步或者打打球之类的,运动运动,给大家献上几张端午假期去蒙古草原拍的几张照片:

这里写图片描述

这里写图片描述

这里写图片描述

正文

进入正题,这篇博客主要讲解viewpager+fragment实现微信滑动切换页面的功能,并且附带切换效果,功能其实并不难,只是需要把知识点关联起来

应为使用模拟器原因,出现模糊背景,手机上面是没有的

1.分析用到的知识点

(1). fragment的懒加载
(2). viewpager的滑动监听事件
(3). 控件alpha的设置、fragment切换的效果

2.功能实现

2.1.fragment的懒加载

这里写图片描述

这里写图片描述

当viewpager加载第一个fragment的时候会预加载第二个fragment,当加载第二个fragment的时候,会预加载第三个fragment,同时会进行数据加载,这种做法肯定不好,当第几个fragment显示的时候才应该加载数据,这里就用到了懒加载(参考:http://blog.youkuaiyun.com/maosidiaoxian/article/details/38300627):

public abstract class LazyFragment extends Fragment{
    //用于标记视图是否初始化
    protected boolean isVisible;
    //在onCreate方法之前调用,用来判断Fragment的UI是否是可见的
    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        if(getUserVisibleHint()) {
            isVisible = true;
            onVisible();
        } else {
            isVisible = false;
            onInvisible();
        }
    }
    /**
     * 视图可见
     * */
    protected void onVisible(){
        lazyLoad();
    }
    /**
     * 自定义抽象加载数据方法
     * */
    protected abstract void lazyLoad();
    /**
     * 视图不可见
     * */
    protected void onInvisible(){}
}

自定义LazyFragment类只需要继承Fragment,实现setUserVisibleHint方法来判断fragment视图是否可见,定义三个方法,当视图可见的时候,isVisible = true,调用lazyLoad方法,其它fragment只需要继承该fragment即可:

public class OneFragment extends LazyFragment {
    // 标志fragment是否初始化完成
    private boolean isPrepared;
    private View view;
    @Override
    public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) {
        if(view == null){
            view = inflater.inflate(R.layout.fragment_one , container , false);
            ButterKnife.inject(this, view);
            KLog.e("TAG" , "oneFragment--onCreateView");
            isPrepared = true;
            lazyLoad();
        }
        return view;
    }


    @Override
    protected void lazyLoad() {
        if(!isPrepared || !isVisible) {
            return;
        }
        KLog.e("TAG" , "oneFragment--lazyLoad");
    }
}

由于setUserVisibleHint方法在onCreateView方法之前调用,所以定义字段isPrepared 来判断fragment是否初始化完成,防止报nullpointerexception,只有当视图可见并且fragment初始化完成执行lazyLoad方法,可以理解成就是onStart方法,再进行数据加载,这也就是懒加载。

注:
a.由于每次加载fragment都会重新执行onCreateView方法,所以我用view来判断fragment是否初始化过,初始化过就不在初始化,当然要是想每次都初始化就不必判断
b.每次fragment视图可见的时候lazyLoad方法都会被调用,若是只想加载一次可自定义字段判断是否加载过数据

这里写图片描述

这里写图片描述

2.2.viewpager的滑动监听事件

首先设置viewpager的适配器,FragmentPagerAdapter的子类只要实现 getItem(int) 和 getCount()方法:

public class FragmentAdapter extends FragmentPagerAdapter{
    //fragment 集合
    private List<Fragment> mFragmentList = new ArrayList<>();

    public FragmentAdapter(FragmentManager fm , List<Fragment> list) {
        super(fm);
        this.mFragmentList = list;
    }

    @Override
    public Fragment getItem(int position) {
        return mFragmentList.get(position);
    }

    @Override
    public int getCount() {
        return mFragmentList.size();
    }
}

其次设置viewpager监听事件:

//viewpager滑动监听
        mMainViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
                changAlpha(position, positionOffset);
            }
            @Override
            public void onPageSelected(int position) {
                changAlpha(position);
            }
            @Override
            public void onPageScrollStateChanged(int state) {}
        });

onPageScrolled方法的表示viewpager正在滑动:

position当向右滑动的时候表示当前页面的下标,向左滑动的时候表示左边页面的下标;
positionOffset是当前页面滑动比例,如果页面向右翻动,这个值不断变大,最后在趋近1的情况后突变为0。如果页面向左翻动,这个值不断变小,最后变为0;
positionOffsetPixels是当前页面滑动像素,变化情况和positionOffset一致。

参数的变化随方向的相反正好相反,下面我们写tab的颜色渐变就不需要判断方向了

根据该方法的positionOffset和position这两个参数就可以实现tab滑动颜色渐变的效果,先看一下布局:

<LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/white"
        android:orientation="horizontal"
        android:paddingTop="5dp">
        <FrameLayout
            android:id="@+id/m_main_fw_lay"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1">
            <Button
                android:id="@+id/m_main_fw_btn_false"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                style="@style/fragment_tab_item_false"
                android:drawableTop="@mipmap/bottom1_tab_false"
                android:text="服务"/>
            <Button
                android:id="@+id/m_main_fw_btn_true"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                style="@style/fragment_tab_item_true"
                android:drawableTop="@mipmap/bottom1_tab_true"
                android:text="服务"/>
        </FrameLayout>
        <FrameLayout
            android:id="@+id/m_main_sj_lay"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1">
            <Button
                android:id="@+id/m_main_sj_btn_false"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                style="@style/fragment_tab_item_false"
                android:drawableTop="@mipmap/bottom2_tab_false"
                android:text="社交"/>
            <Button
                android:id="@+id/m_main_sj_btn_true"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                style="@style/fragment_tab_item_true"
                android:drawableTop="@mipmap/bottom2_tab_true"
                android:text="社交"/>
        </FrameLayout>
        <FrameLayout
            android:id="@+id/m_main_gz_lay"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1">
            <Button
                android:id="@+id/m_main_gz_btn_false"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                style="@style/fragment_tab_item_false"
                android:drawableTop="@mipmap/bottom3_tab_false"
                android:text="工作"/>
            <Button
                android:id="@+id/m_main_gz_btn_true"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                style="@style/fragment_tab_item_true"
                android:drawableTop="@mipmap/bottom3_tab_true"
                android:text="工作"/>
        </FrameLayout>
        <FrameLayout
            android:id="@+id/m_main_lxr_lay"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1">
            <Button
                android:id="@+id/m_main_lxr_btn_false"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                style="@style/fragment_tab_item_false"
                android:drawableTop="@mipmap/bottom4_tab_false"
                android:text="联系人"/>
            <Button
                android:id="@+id/m_main_lxr_btn_true"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                style="@style/fragment_tab_item_true"
                android:drawableTop="@mipmap/bottom4_tab_true"
                android:text="联系人"/>
        </FrameLayout>
        <FrameLayout
            android:id="@+id/m_main_wd_lay"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1">
            <Button
                android:id="@+id/m_main_wd_btn_false"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                style="@style/fragment_tab_item_false"
                android:drawableTop="@mipmap/bottom5_tab_false"
                android:text="我的"/>
            <Button
                android:id="@+id/m_main_wd_btn_true"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                style="@style/fragment_tab_item_true"
                android:drawableTop="@mipmap/bottom5_tab_true"
                android:text="我的"/>
        </FrameLayout>
    </LinearLayout>

每个tab我是使用的2个button,一个默认颜色,一个选中颜色,我们只需要根据滑动比例来改变选中颜色button的alpha即可:

/**
     * 根据滑动设置透明度
     */
    private void changAlpha(int pos, float posOffset) {
        int nextIndex = pos + 1;
        if(posOffset > 0){
            //设置tab的颜色渐变效果
            mButtonList.get(nextIndex).setAlpha(posOffset);
            mButtonList.get(pos).setAlpha(1 - posOffset);
            //设置fragment的颜色渐变效果
            mFragmentList.get(nextIndex).getView().setAlpha(posOffset);
            mFragmentList.get(pos).getView().setAlpha(1 - posOffset);
            //设置fragment滑动视图由大到小,由小到大的效果
            mFragmentList.get(nextIndex).getView().setScaleX(0.5F + posOffset/2);
            mFragmentList.get(nextIndex).getView().setScaleY(0.5F + posOffset/2);
            mFragmentList.get(pos).getView().setScaleX(1-(posOffset/2));
            mFragmentList.get(pos).getView().setScaleY(1-(posOffset/2));
        }
    }

当posOffset > 0 ,说明viewpager在滑动;前面说了onPageScrolled方法参数随滑动方向的变化是相反的所以这里只需要写一个方法便可实现两个方向滑动颜色渐变的效果,道理就是改变两个button的Alpha值就可实现渐变效果,是不是挺简单;
关于fragemnt的颜色渐变和伸缩效果,在上面也已经贴出了代码,就不详细解释了,相信大家都能看懂;

onPageSelected方法表示滑动抬起手指那一刻所执行的方法,参数position代表的是当前页面的下标,所以当滑动结束之后,我们把当前页面的tab、fragment.getView()的Alpha设置为1.0f,其它tab设置为0.0f ; fragment的x、y轴设置为1.0f(需要判断fragment.getView()是否为null,防止报nullpointerexception),其他的0.0f即可:

 /**
      * 一开始运行、滑动和点击tab结束后设置tab的透明度,fragment的透明度和大小
      */
    private void changAlpha(int postion) {
        for (int i = 0; i < mButtonList.size(); i++) {
            if (i == postion) {
                mButtonList.get(i).setAlpha(1.0f);
                if(null != mFragmentList.get(i).getView()){
                    mFragmentList.get(i).getView().setAlpha(1.0f);
                    mFragmentList.get(i).getView().setScaleX(1.0f);
                    mFragmentList.get(i).getView().setScaleY(1.0f);
                }
            } else {
                mButtonList.get(i).setAlpha(0.0f);
                if(null != mFragmentList.get(i).getView()){
                    mFragmentList.get(i).getView().setAlpha(0.0f);
                    mFragmentList.get(i).getView().setScaleX(0.0f);
                    mFragmentList.get(i).getView().setScaleY(0.0f);
                }
            }
        }
    }

把所有fragemnt放入集合中遍历判断即可;

主要代码就这些,有不解的地方请看Demo

源码下载

Android高级面试指南:核心知识点与实战解析 Android开发中的核心组件如Activity、Fragment和Service是构建应用的基础,理解其底层原理如Binder机制和渲染系统对性能优化至关重要。在高级面试中,面试官往往深入考察这些基础组件的设计思想与实现细节,例如Handler机制中MessageQueue的链表实现选择。性能优化涉及内存泄漏防治、ANR监控和包体积瘦身等实战要点,架构设计则关注组件化与响应式编程等现代开发模式。掌握这些技术不仅能提升应用性能,还能在电商、社交等复杂场景中实现高效开发。本指南特别适合3-5年经验的开发者准备 阅读详情

相关推荐

Android仿微信滑动切换页面实战项目

在移动应用开发中,滑动切换页面已成为主流的用户交互方式之一。尤其以微信为代表的社交类应用,通过顶部标签页与内容区域的联动滑动,实现了高效、直观的信息浏览体验。本章将系统性地介绍Android平台上实现滑动切换页面的技术背景与发展脉络,重点剖析其在现代UI架构中的核心地位。从用户体验角度出发,探讨为何滑动导航成为主流设计范式,并结合Material Design设计语言,阐述滑动页面在信息分层、操作效率和视觉流畅性方面的优势。TabLayout。

weixin_42578963的博客 665

ViewPager2+Fragment实现懒加载

ViewPager2+Fragment实现懒加载

u011210902的博客 3121

android实现ViewPager懒加载的三种方法

主要介绍了android实现ViewPager懒加载的三种方法,懒加载在项目运用中很广泛,可以提高运行速度,有兴趣的可以了解一下。

Android随笔-ViewPager2

Android随笔-ViewPager2与TabLayout的使用

古典码 1779

汽车工程师必看:从CAN到Ethernet,6种车载通信协议全解析(附应用场景对比)

本文全面解析了从CAN到Ethernet的6种车载通信协议,包括CAN、LIN、MOST、FlexRay等,并对比了它们的应用场景和技术特点。文章详细介绍了各协议的演进历程、技术优势及在现代汽车中的混合网络架构设计,为汽车工程师提供了实用的协议选型指南和未来通信技术发展趋势。

weixin_28683689的博客 491

MIMO-OFDM 通信-感知一体化(ISAC)中的联合优化与性能权衡

本文深入探讨了MIMO-OFDM技术在通信-感知一体化(ISAC)系统中的核心作用与挑战。文章分析了如何通过联合优化资源分配、波束成形与波形设计,在有限的频谱与硬件资源下,实现通信速率与感知精度之间的最佳平衡,并指出了工程实践中面临的同步、干扰等关键难题。

dapp9builder的博客 215

ViewPager2实现懒加载

1.如何使用ViewPager2 implementation 'com.google.android.material:material:1.2.0-alpha06' 2.在布局文件中添加 <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:

CruelLei的博客 4572

claude code desktop中出现Doesn‘t look like an Anthropic model - expected a gateway model route 解决方案

本文主要介绍了claude code desktop中出现Doesn’t look like an Anthropic model - expected a gateway model route referencing an Anthropic model和Server is busy. Retrying的解决方案,希望能对使用claude code desktop的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 9万+

如何应对Android面试官-> 玩转 ViewPager 懒加载

通常我们 ViewPager 在使用的是一般都是结合 Fragment 一起使用,我们先来搭一个简单的使用界面,最终搭建出来的效果如下:简单的 ViewPager + Fragment 的实现,比较简单,就不贴代码的实现了,我们接下来内容的讲解;页面可见的时候才进行加载;依托这个 setUserVisibleHint(isVisibleToUser: Boolean) 来实现懒加载;ViewPager渲染原理。

BASK2311的博客 1263

直捣黄龙~

这篇文章描述了一个矩阵寻路问题,要求计算从起点到终点的最短路径数量及长度。主要思路是通过BFS算法解决:首先标记哨兵警戒区域为禁区,然后从起点出发进行广度优先搜索,记录每个位置的最短步数和路径条数。当到达终点时,输出路径数和步数;若不可达则返回(0,0)。算法使用队列实现BFS,同时处理路径统计和步数记录,适用于网格寻路类问题。

面试高手的博客 216

AI训练师三级考证避坑指南|假证辨别+机构套路+OSTA验证

这是最基础的问题,也是最容易忽略的问题。人工智能训练师三级证书本身是有价值的——政府认可的职业技能等级证书、多地紧缺工种补贴、人才引进加分。但正因为有价值,才引来了大量骗子。记住三句话OSTA查不到的证,一分钱都不值声称免考包过的,100%是骗子培训费一次性谈清楚,后续加价直接走人如果你正在考虑考人工智能训练师三级证书,想要从报名到备考到拿证的完整一站式指南,欢迎查看我的付费专栏:📖《人工智能训练师三级·从零到拿证完全指南》99篇系统化内容,覆盖报名、备考、冲刺、拿证全流程。

白话机器学习 1219

数据库+多条目+侧拉+tablayout+viewpager-fragment的切换+PullToRefreshListView的上拉下拉的刷新+banner的多条目

activity_main viewpager+fragment+侧滑的切换布局 &amp;amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;amp;gt; &amp;amp;lt;android.support.v4.widget.DrawerLayout xmlns:android=&amp;quot;http:/

yjjhtl的博客 602

DDD系列 - 第12讲 如何在DDD中实现Query服务(轻量化CQRS)

轻量化CQRS、整合Repository和DAO的优势。

罗小爬的技术宝书 266

Android的Viewpage2Fragment实现微信滑动界面效果:打造极致滑动体验

Android的Viewpage2Fragment实现微信滑动界面效果:打造极致滑动体验 去发现同类优质开源项目:https://gitcode.com/ 项目介绍 在移动应用开发中,滑动界面效果是提升用户体验的重要元素之一。本文将为您详细介绍一个开源项目:Android的Viewpage2+Fragment实现微信滑动界面效果。该项目旨在帮助开发者掌握如何利用Viewpage2和Fragment...

gitblog_06745的博客 694

11、频率响应与伯德图详解

本文详细介绍了电子电路分析中的频率响应与伯德图,涵盖分贝的定义与计算、带宽与3dB点、放大器反馈机制、倍频程与十倍频程概念,并系统讲解了基于实数和复数零极点的伯德图构建方法。通过具体示例分析了传递函数的渐近近似、幅度与相位响应,并结合MATLAB工具展示了伯德图的绘制过程。文章旨在帮助读者深入理解电路在不同频率下的行为特性,为电路设计与优化提供理论支持。

white的博客 172

【YOLO系列】YOLOv8详解:模型结构、损失函数、训练方法及代码实现

YOLOv8是Ultralytics团队2023年推出的高效目标检测框架,在速度与精度平衡、多任务支持和易用性方面实现突破。模型采用改进的CSPDarknet主干网络、C2f模块和SPPF加速结构,结合PAN-FPN特征融合和解耦检测头设计,支持目标检测、实例分割和关键点检测任务。创新性地使用CIoU定位损失、Focal Loss置信度损失和动态样本分配策略,显著提升检测性能。实验表明,YOLOv8较前代模型mAP提升5-10%,在TensorRT加速下可达1000FPS,提供5种尺寸灵活选择,成为实时目标

一碗白开水一 2779

Fragment懒加载的实现方法(含源码分析)

viewPager+fragment的使用,是开发过程中很常见的一种.但存在一个问题,就是会对相连的n个界面进行加载.本文采取逐一分析的方法,从fragment生命周期入手,寻找突破口,最终发现重写setUserVisibleHint,并通过标识符的方法,最终实现fragment的赖加载.为了便于大家在实际开发中直接使用,同时封装了baseFragment.

微不足道的博客 1113

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Android底部导航栏标签切换: ToolBar+TabLayout+ViewPager+Fragment

本文主要讲述实现以及Fragment切换之间如何优化,减少内存的开销,相信不少朋友吃过Fragment生命周期的亏。话不多说,切入正题。 1、结合ToolBarTabLayout+ViewPager+Fragment实现的底部导航功能 效果 与 分析 效果图如下,一般的手机应用首页就是这种样式,包括手机淘宝、QQ、微信。 我的主页 QQ 下面是新版QQ的界面,底部的导航栏实现的是切...

Xu_JL1997的博客 1560

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

ViewPager加载fragment出现Wrong state class错误的问题

编者:李国帅 qq:9611153 微信lgs9611153 时间:2020/8/2 背景: tab导航栏是常见的应用技术,通过点击导航栏或者手势滑动切换显示不同的fragment。 有时还会有一些附带的效果,比如tab字体颜色变化,选中内容居中等。自己实现也不复杂,但是也没必要重复制造轮子,也没有人家专业。我就采用了CommonNavigator+ViewPager+Fragment的方法。 问题描述: 应用中遇到了这么个问题, W/System.err: java.lang.I..

lgs7907 803

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

fragment viewpager 懒加载

参考链接 viewpager+fragment的懒加载实现微信点击和滑动切换功能(切换效果) Android 解决多个Fragment切换时不断实例化 背景:在用viewpager时,来切换fragment,将fragment放到一个list里,但是,加载时,不想一下子,都加载进去,那就用懒汉式加载; 一个不错的例子,源码下载 源码下载1.首先弄一个lazyfragment,其他继承它

博水之野,人杰地灵 401

Android实现类似微信的延迟加载的Fragment——LazyFragment

来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/4303910.html  参考微信,使用ViewPager来显示不同的tab,每个tab是一个Fragment, 假设有3个tab,对应的fragment是FragmentA、FragmentB、FragmentC 需要实现的效果是进入后,默认先只加载FragmentA,具体

安东尼的博客 1035

[Android]实现类似微信的延迟加载的Fragment——LazyFragment

参考微信,使用ViewPager来显示不同的tab,每个tab是一个Fragment, 假设有3个tab,对应的fragment是FragmentA、FragmentB、FragmentC 需要实现的效果是进入后,默认先只加载FragmentA,具体滑动到了哪个Fragment,再去加载该Fragment的数据。 可以参考如下BaseLazyFragment代码:

苏白的专栏 601

实现类似微信的延迟加载的Fragment——LazyFragment

参考微信,使用ViewPager来显示不同的tab,每个tab是一个Fragment, 假设有3个tab,对应的fragment是FragmentA、FragmentB、FragmentC 需要实现的效果是进入后,默认先只加载FragmentA,具体滑动到了哪个Fragment,再去加载该Fragment的数据。 可以参考如下BaseLazyFragment代码: /** * Au...

weixin_33719619的博客 68
上一篇: 实现美团、饿了么购物车效果,并本地存储相关数据
下一篇: 新博客地址
Mr丰
博客等级 码龄11年 106粉丝 9原创
评论 8
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值