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

TI C2000 DSP CLA实战:用F28069的协处理器实现ADC采样与PWM相位实时联动控制

本文详细介绍了如何利用TI C2000系列DSP的CLA协处理器在TMS320F28069上实现ADC采样与PWM相位的实时联动控制。通过CLA的零周期上下文切换和硬件级任务触发特性,显著提升了电机控制和数字电源应用的实时性能,特别适用于需要亚微秒级响应的场景。

weixin_30932215的博客 3968

Sipeed麦克风阵列板练习

麦克风阵列板 Maix Dock Sipeed

sunshinebigbig的博客 3832

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

STM32移植LVGL(LittleVGL)

**STM32移植LVGL(LittleVGL)**

qq_53000374的博客 1万+

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

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

BASK2311的博客 1263

Nvidia Isaac Sim安装与配置 入门教程 2024(2)

Isaac Sim 安装和配置教程将指导用户完成从下载软件到设置和运行仿真的全过程。教程内容包括安装必要的依赖项、配置系统环境、配置Omniverse环境以及调试和优化仿真环境的步骤。通过详细的操作步骤和图文并茂的说明,用户可以快速上手 Isaac Sim,构建出高质量的机器人仿真环境,实现其研究和应用目标。

m0_56661101的博客 2万+

Unity3D 2022版如何一键安装Newtonsoft.Json?最新Package Manager教程

本文详细介绍了在Unity3D 2022及以上版本中,如何通过Package Manager一键安装和配置Newtonsoft.Json(Json.NET)。教程涵盖了从打开Package Manager、搜索并安装正确包源,到验证安装和基础使用的完整流程,旨在帮助开发者以现代化、可靠的方式集成这一强大的JSON处理框架,提升开发效率并规避手动导入的常见问题。

lg888的博客 921

数据库+多条目+侧拉+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

用 SNC 和 SAP Single Sign-On Secure Login 把 SAP 登录这件小事,变成一件安全又不用输密码的事

在传统的 SAP 系统里,登录这件事看起来很朴素:用户打开 SAP GUI,输入一个 SAP 用户名,再输入一个 SAP 密码,点回车,进系统,开始干活。表面上没毛病,但从安全角度看,这种老办法问题很大。默认情况下,这些用户名和密码在网络上传输时是明文,也就是不加密传输。攻击者如果在公司网络里做监听,理论上可以直接截取到口令信息,这种风险对今天任何一家合规要求高、审计严格的企业来说,基本是不可接受的。(SAP Help Portal)SAP 给出的答案叫做 ,全称是 。SNC 做的事情可以概括成两类:一类是

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 376

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

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

gitblog_06745的博客 694

杰理SDK入门教程(二):USB升级程序

开发板升级操作指南 摘要:本文介绍了开发板程序升级的两种方式(常规升级和串口升级),重点说明了常规升级的操作步骤: 拨码设置:提供4种拨码方式(不拨/1档/2档/3档),对应不同指示灯状态和按键要求 硬件连接:强制升级工具需正确连接电脑和开发板(注意USB接口方向) 升级流程:根据拨码状态操作按键,观察指示灯变化(红灯常亮绿灯灭表示进入升级模式) 执行升级:运行SDK中的download.bat完成升级 文中还包含拨码开关说明、指示灯状态对照表以及升级原理说明,帮助用户理解升级过程。升级成功后在设备管理器可

qq_42014563的博客 1117

如何合理评估信号过孔的残桩效应--Via Stub

设计中,之所以会去考察信号过孔的残桩效应(Via Stub),是因为它的存在导致了不需要的频率谐振,当这些谐振出现在所关注的信号通道的插入损耗中时,就会引发较为严重的信号完整性(SI)问题,那么Via Stub到底是如何引发SI问题的呢?

一只豌豆象的博客 4466

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

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

微不足道的博客 1113

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

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

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

Xu_JL1997的博客 1560

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

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

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

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、付费专栏及课程。

余额充值