Android中自定义圆形选择器(可用于数字选择,评价选择等)

2024年安卓最全Android中自定义圆形选择器(可用于数字选择,评价选择等),android设置界面开发 其实客户端开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。然而Android架构学习进阶是一条漫长而艰苦的道路,不能靠一时激情,更不是熬几天几夜就能学好的,必须养成平时努力学习的习惯。贵在坚持!网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。需要这份系统化学习资料的朋友,可以戳这里获取一个人可以走的很快,但一群人才能走的更远! 阅读详情

下面是自定义view代码,可以根据实际需求更改最大值,直接在xml中引用然后直接调用接口就可以获取滑动的数值

public class Custom_SelectNnm_Circle extends View {

    private static final double RADIAN = 180 / Math.PI;
    private Context context;
    private Paint circle_Paint; //圆环的画笔
    private Paint select_Paint; //选中区域的画笔
    private Paint dot1;   //圆点1
    private int max_progress; //设置最大值
    public static  int cur_progress; //设置当前值
    private int bottom_color;//设置底色
    private int circle_color; //设置滑过的颜色
    private int circle_color2; //设置圆的颜色(锚点)
    private int cricle_width; //圆环的宽度
    private double cur_Angle;  //当前锚点1旋转角度
    private float mWheelCurX, mWheelCurY; //圆的位置
    private float ring_Radius;//圆环的半径
    private  OnSeekBarChangeListener changeListener; //设置监听

    public Custom_SelectNnm_Circle(Context context){
        this(context,null);
    }

    public Custom_SelectNnm_Circle(Context context, AttributeSet attrs) {
        this(context, attrs,0);
    }

    public Custom_SelectNnm_Circle(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        this.context=context;
        initAttrs(attrs,defStyleAttr);
        initPadding();
        initPaint();
    }

    private void initPaint(){

          /*
        圆环的画笔
         */
        circle_Paint=new Paint(Paint.ANTI_ALIAS_FLAG);
        circle_Paint.setAntiAlias(true);
        circle_Paint.setColor(bottom_color);
        circle_Paint.setStyle(Paint.Style.STROKE);
        circle_Paint.setStrokeWidth(cricle_width);

        /*
        选中区域的画笔
         */
        select_Paint=new Paint(Paint.ANTI_ALIAS_FLAG);
        //select_Paint.setShader(new SweepGradient(0, 0, arrColorCircle, null));
        select_Paint.setColor(circle_color);
        select_Paint.setAntiAlias(true);
        select_Paint.setStyle(Paint.Style.STROKE);
        select_Paint.setStrokeWidth(cricle_width);

        //画圆点
        dot1 = new Paint(Paint.ANTI_ALIAS_FLAG);
        dot1.setColor(circle_color2);
        circle_Paint.setAntiAlias(true);
        dot1.setStyle(Paint.Style.FILL);
    }


    private void initAttrs(AttributeSet attrs,int def){
        TypedArray typedArray = getContext().obtainStyledAttributes(attrs, R.styleable.circle_parameter, def, 0);
        max_progress=typedArray.getInt(R.styleable.circle_parameter_max_progress,20);
        cur_progress=typedArray.getInt(R.styleable.circle_parameter_cur_progress,5);
        if (cur_progress > max_progress) cur_progress = max_progress;
        bottom_color=typedArray.getColor(R.styleable.circle_parameter_bottom_color,getColor(R.color.custom_circle));
        circle_color=typedArray.getColor(R.styleable.circle_parameter_circle_color,getColor(R.color.custom_circle2));
        circle_color2=typedArray.getColor(R.styleable.circle_parameter_circle_color2,getColor(R.color.custom_circle3));
        Bitmap evaluatebg = BitmapFactory.decodeResource(context.getResources(), R.mipmap.select_evaluate_bg);
        Bitmap center = BitmapFactory.decodeResource(context.getResources(), R.mipmap.select_evaluate_center);
        int width = evaluatebg.getWidth();
        int width1 = center.getWidth();
        cricle_width=(width-width1)/4;
        typedArray.recycle();
    }

    //测量布局大小,规定xy点的坐标
    @Override
    public  void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), R.mipmap.select_evaluate_center);
        int height = bitmap.getHeight()+cricle_width*2;   //
        int width = bitmap.getWidth()+cricle_width*2;
        int min = Math.min(height, width);
        setMeasuredDimension(min,min);
        initposition();
    }

    //初始化边距
    private void initPadding(){
        int paddingLeft = getPaddingLeft();
        int paddingTop = getPaddingTop();
        int paddingRight = getPaddingRight();
        int paddingBottom = getPaddingBottom();
        int paddingStart = 0, paddingEnd = 0;
        if (Build.VERSION.SDK_INT >= 17) {
            paddingStart = getPaddingStart();
            paddingEnd = getPaddingEnd();
        }
        int maxPadding = Math.max(paddingLeft, Math.max(paddingTop,
                Math.max(paddingRight, Math.max(paddingBottom, Math.max(paddingStart, paddingEnd)))));
        setPadding(maxPadding, maxPadding, maxPadding, maxPadding);
    }


    private void initposition(){
        //转换为360度
        cur_Angle=(double) cur_progress / max_progress*360.0;
        //计算初始化旋转的角度
        double cos = -Math.cos(Math.toRadians(cur_Angle));
        //根据旋转的角度来确定位置
        MakeCurPosition(cos);
        //确定圆环的半径
        ring_Radius=(getMeasuredWidth() - getPaddingLeft() - getPaddingRight() - cricle_width) / 2;
    }


    private void MakeCurPosition(double cos){
        //根据旋转的角度来确定圆的位置
        //确定x点的坐标
        mWheelCurX = calcXLocationInWheel(cur_Angle, cos);
        //确定y点的坐标
        mWheelCurY=calcYLocationInWheel(cos);
    }


    //确定x点的坐标
    private float calcXLocationInWheel(double angle,double cos){
        if (angle < 180) {
            return (float) (getMeasuredWidth() / 2 + Math.sqrt(1 - cos * cos) * ring_Radius); //Math.sqrt正平分根  9-3
        } else {
            return (float) (getMeasuredWidth() / 2 - Math.sqrt(1 - cos * cos) * ring_Radius);
        }
    }

    //确定y点的坐标
    private float calcYLocationInWheel(double cos) {
        return getMeasuredWidth() / 2 + ring_Radius * (float) cos;
    }
    //获取颜色
    @TargetApi(Build.VERSION_CODES.M)
    private int getColor(int colorId) {
        final int version = Build.VERSION.SDK_INT;
        if (version >= 23) {
            return getContext().getColor(colorId);
        } else {
            return ContextCompat.getColor(getContext(), colorId);
        }
    }

    //画

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        float left = getPaddingLeft() + cricle_width / 2;
        float top = getPaddingTop() + cricle_width / 2;
        float right = canvas.getWidth() - getPaddingRight() - cricle_width / 2;
        float bottom = canvas.getHeight() - getPaddingBottom() - cricle_width / 2;
        float centerX = (left + right) / 2;
        float centerY = (top + bottom) / 2;

        float wheelRadius = (canvas.getWidth() - getPaddingLeft() - getPaddingRight()) / 2 - cricle_width / 2;
        //画圆
        canvas.drawCircle(centerX, centerY, wheelRadius, circle_Paint);

        //画圆弧
        float stop=0;
        stop=(float) Math.abs(cur_Angle);
        canvas.drawArc(new RectF(left, top, right, bottom), -90,stop, false, select_Paint);

        //画圆点
        canvas.drawCircle(mWheelCurX, mWheelCurY, cricle_width/2, dot1);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        float x = event.getX();
        float y = event.getY();
        if(event.getAction()==MotionEvent.ACTION_MOVE || isMovedot1(x,y) ==true  ){
            Log.i("TAG","进入X="+x+"进入Y="+y);
            //通过触摸点算出cos角度值
            float cos = calculateCos(x, y);
            // 通过反三角函数获得角度值
            double angle;   //获取滑动的角度
            if (x < getWidth() / 2) { // 滑动超过180度
                angle = Math.PI * RADIAN + Math.acos(cos) * RADIAN;    //通过计算得到滑动的角度值
            } else { // 没有超过180度
                angle = Math.PI * RADIAN - Math.acos(cos) * RADIAN; //PI 周长比直径    返回弧角度的余弦值
            }
                cur_Angle=angle;
                cur_progress=getSelectedValue(cur_Angle);
                Log.i("tag",cur_progress+"+++++++++++++++++++");
                MakeCurPosition(cos);
            if (changeListener != null) {
                Log.i("guo","改了+++改改2222222");
                changeListener.onChanged(this, cur_progress);
            }
            invalidate();
            return true;
        }else {
            return super.onTouchEvent(event);
        }
    }

    //
    private  boolean isMovedot1(float x,float y){
        float dot1x = Math.abs(mWheelCurX - x);
        float dot1y = Math.abs(mWheelCurY - y);
        if(dot1x<50 && dot1y<50){
            return true;
        }else{
            return false;
        }
    }

    //拿到切斜角的cos值
    private float calculateCos(float x, float y){
        float width = x - getWidth() / 2;
        float height = y - getHeight() / 2;
        float slope = (float) Math.sqrt(width * width + height * height);
        return height / slope;
    }

    private int getSelectedValue(double mCurAngle) {
        return Math.round(max_progress * ((float) mCurAngle / 360));  //四舍五入
    }

    public void setOnSeekBarChangeListener(OnSeekBarChangeListener listener) {
        changeListener = listener;
    }

    public interface OnSeekBarChangeListener {
        void onChanged(Custom_SelectNnm_Circle seekbar, int curValue);
    }
}

效果图

这里写图片描述

这里写图片描述

《Android版本更新、热更新》系列课程视频

版本更新6.0,7.0统统搞定!!

热修复不在麻烦,再也不用担心上线后出bug!!

http://edu.youkuaiyun.com/course/play/6523/131198

《Kotlin语法基础到实战开发》系列课程视频

http://edu.youkuaiyun.com/course/detail/6409?locationNum=7&fps=1&ref=srch&loc=1

http://edu.youkuaiyun.com/course/play/6409/123752

Kimi-WebBridge:用自然语言驱动浏览器自动化的实践指南 浏览器自动化技术通过程序模拟用户操作,实现网页任务的自动执行,其核心原理是基于浏览器驱动协议(如Chrome DevTools Protocol)与页面元素进行交互。这项技术的价值在于将人力从重复性劳动中解放出来,提升工作效率与准确性,广泛应用于数据采集、Web应用测试、日常办公流程自动化等场景。随着大语言模型(LLM)的发展,自然语言与浏览器自动化的结合成为新的趋势,**Kimi-WebBridge**正是这一方向的代表性工具。它作为一个“翻译层”,将用户的口语化指令(如“打开百度搜索天气”)解析并转换为 阅读详情

相关推荐

【信息科学与工程学】计算机科学与自动化——第六十三篇 人机交互之前端交互参数知识库01

此方案可满足千万级并发需求,同时支持时序数据、知识图谱和文档数据库的高效处理,通过云原生架构实现极致弹性。​:每月约$15-20万(100节点K8s集群+数据库集群+CDN流量)1. 宠物上架/下架流程。

weixin_49199313的博客 1477

Android:CheckBox方型选择框改为圆形选择框

style="@style/wifi_item_content" 改成 style="@style/Widget.AppCompat.CompoundButton.RadioButton"

AiHH的博客 6736

android 颜色选择器及弧形刻度盘

android 自定义的颜色选择器及弧形刻度盘,可滑动选中

Android 页面选择小圆点(页面显示自定义控件)

Android 页面选择小圆点(页面显示自定义控件)作用:自定义小控件效果图:style文件<?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="AbSlidingButtonStyle"> <attr name="btn_bottom" format="integer|reference" /

荒緄 4811

Android仿IOS10圆盘时间选择器

主要为大家详细介绍了Android仿IOS10圆盘时间选择器,自定义圆盘时间选择器,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

Android自定义半圆形圆盘滚动选择器

主要为大家详细介绍了Android自定义半圆形圆盘滚动选择器,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

Android 圆形CheckBox勾选

Android几种方式(style、selector)实现圆形的CheckBox,android checkbox圆形按钮样式,Android简单实现圆形CheckBox,Android CheckBox圆形复选框

马志武的博客 5172

【鼠标在不点击的情况下,直接移动到QT控件上不显示提示信息】

有时明明已经调用了setToolTips方法,鼠标移动到QT控件上仍然不会有提示信息,这时候就需要具体分析下。重点就是标红的这段话,大概意思就是。.h文件中加入鼠标移动事件的定义。.cpp文件中实现该事件。

ZTH_G的博客 2424

android 圆形选中,RoundChoiceView

A widget for round shape choice view with number or cross indicator先看下效果说在前面的话开发这个控件是因为在仿探探的图片选择器组件的时候,他们有这样的一个控件。照猫画虎,我也做了一个。想来,其实还是有很多的朋友需要这样的控件。所以开源出来给大家使用。使用方式项目放在 gihub 上,欢迎使用。github 地址:https://g...

weixin_32389853的博客 288

用limma包进行多组差异表达分析

写在前面:最近在使用limma包进行差异表达分析,参考了网上许多教程都觉得说的云里雾里,很不清楚。经过我自己一段时间非常痛苦的钻研,弄明白了,解决了我的实际需求。于是决定将我的分析经验写下来,分享给需要的人。 首先加载前期预处理好的表达矩阵。(我的原始表达矩阵文件已附在文后,大家有需要可以下载实践) setwd("E://Rworkplace") data<-read.table...

weixin_40640700的博客 4万+

从Microchip SDK到STM32实战:手把手教你移植LAN9252 EtherCAT从站驱动(含EEPROM配置避坑)

本文详细介绍了如何将Microchip SDK中的LAN9252 EtherCAT从站驱动移植到STM32F407平台,包括FSMC接口配置、中断处理适配和EEPROM配置等关键步骤。通过实战指南和避坑技巧,帮助开发者快速实现高性能EtherCAT从站设备的开发,适用于工业自动化领域。

weixin_29197835的博客 446

安卓中的ListView做到每一个item都不同---以实现圆角背景效果为例

前言 很多书籍都会讲到ListView的缓存优化,这个想必大家都知道。也正是因为缓存,让ListView变得有时候让人摸不着头脑。比如说我想做一个有圆角背景效果的ListView,如下图: 也许很多人都会想到在getView方法里,根据position去采用不同的圆角背景图片,如果仅仅是这样,你会发现结果出乎你的意料:为什么有些地方不该圆的它圆了,该圆的它不圆?其实这就是缓存机制导致的。当然了,你也可以选择不采用缓存,但是这会导致性能大大降低,当数据量比较大时,快速滑动列表就会出现比较明显的卡顿现象。本篇

英勇的博客 1017

从零搭建uniapp+vue3+ts+tailwindcss多端兼容开发环境

本文详细介绍了如何从零搭建uniapp+vue3+ts+tailwindcss多端兼容开发环境,包括环境准备、TailwindCSS集成、小程序兼容性解决方案以及样式优化技巧。通过实战步骤和常见问题解答,帮助开发者快速掌握这套技术栈,提升开发效率。

weixin_28693309的博客 324

前端第一节(html&css&javascript)

这是内容1这是内容2这是内容3这是一个有序列表这是有序列表1这是有序列表2这是有序列表3这是有序列表4自定义列表内容1

2301_79941274的博客 1418

CLCD土地覆盖数据在ArcGIS中的实战应用:从导入到空间分析的完整指南

本文详细介绍了CLCD土地覆盖数据在ArcGIS中的实战应用,从数据导入到空间分析的完整流程。涵盖坐标系转换、数据质量检查、土地利用变化检测等核心技术,并分享城市扩张模拟和跨数据集融合等高级应用技巧,帮助研究者高效利用这一权威数据集进行环境监测和城市规划。

weixin_29292535的博客 595

从 0 到 1 打造一个“超级 IP 智能体”

这篇文章介绍了一个"超级IP智能体"的技术架构和实现方案。该项目构建了一个多模态内容生成流水线,主要流程包括:1)视频下载和音频提取;2)语音识别转换为文字稿;3)使用大语言模型对文案进行仿写和润色;4)语音合成;5)数字人口型同步;6)视频后期处理。文章详细介绍了如何使用Python和Hugging Face开源模型搭建环境,并重点展示了视频下载、语音识别(采用Whisper模型)以及文案仿写(使用Qwen1.5-7B-Chat模型)等核心模块的代码实现。所有处理均针对M3芯片Mac优

AI天才研究院 1149

探索观影新体验:Watchlist——你的私人电影管家

探索观影新体验:Watchlist——你的私人电影管家 在数字时代,保持对喜爱电影的追踪不再是件易事。Watchlist,一款精巧的Android应用,它为你解决了这个难题。通过Watchlist,不仅能轻松记录看过的电影,还能浏览预告片、阅读评论、查看电影图片,让电影爱好者们的观影之旅更加丰富多彩。 技术视角下的Watchlist 核心库与技术栈 Watchlist背后的魔法来源于一系列精选的A...

gitblog_00414的博客 900

课堂练习及课后作业2.1:外部中断

本关任务:通过相关知识以及实验回答:版本 1 内核的第 6 次时钟中断发生时,断点和恢复点(指令地址)分别是多少?本关任务:修改版本 0 内核,使得每发生 100 次时钟中断,就在屏幕上输出一个字符‘t’和当时的进程号,如“t(0)”表示0号进程运行时发生了时钟中断。本关任务:通过实际操作回答在输出第一行 0/1 字符的过程中(如下图所示),共发生了几次时钟中断?本关任务:修改版本 1 内核源码,使得每次时钟中断发生时,都在屏幕上输出字符‘t’。分析版本1内核,找到第一次时钟中断的恢复点地址。

Junds0的博客 1万+

HarmonyOS 6 效果实现手势 GestureRecognizer 长按双击滑动多种自定义手势监听冲突识别适配指南

HarmonyOS(鸿蒙操作系统)是华为推出的分布式操作系统,其应用开发框架提供了基于 ArkTS 语言的声明式 UI 编程范式。ArkTS 在 TypeScript 的基础上进行了扩展与约束,引入了一套面向 UI 声明的装饰器系统,包括 、、、、、 等,使开发者能够以接近 Web 前端框架(如 React、Vue)的心智模型来构建原生应用界面。声明式 UI 的核心思想是"状态驱动视图"。开发者只需声明界面在不同状态下的样子,框架会自动根据状态变化进行差异比较(diff)并更新 DOM 树。这种范式相比传统

wilbur1688的博客 568

【原理图PCB专题】案例:双排0.5mm间距座子转单排0.5mm间距座子Layout方案分析

本文提供一种分析思路,并通过实际案例来进行Layout方案分析的讲解。

一点硬件 456

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Google Play测试AI图片搜索:代码证据与开发者应对指南

视觉搜索正在成为人工智能应用落地的重要方向,它通过计算机视觉模型解析图片中的界面元素、文字和布局特征,进而匹配相关信息。这一技术的核心原理是将图片转化为可搜索的特征向量,与文本搜索相比,它能处理更直观、更难以用关键词描述的需求。在应用商店场景中,视觉搜索能够帮助用户通过截图或拍摄照片快速找到目标应用,同时为开发者带来新的流量分发变量。当前,Google Play商店被发现正在测试AI图片搜索功能,代码层面的字符串资源和接口调用痕迹显示了这一原型的雏形。对于从事ASO优化的开发者而言,这意味着应用截图和图标不

weixin_34055787的博客 351

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

开支记账管理应用基于HarmonyOS API 24实战解析配置驱动体现在通过 Record 映射表将业务配置与逻辑代码分离,使得分类、颜色、图标等可变因素集中管理

在移动互联网与智能穿戴设备高度普及的今天,"习惯养成"已经从一个模糊的自我管理理念,演变为一个可量化、可追踪、可视化的数字化产品赛道。越来越多的人希望借助手中的智能终端,把"早起、冥想、阅读、运动"这些抽象的自律行为,转化为一条条清晰的数据曲线和一张张可触摸的打卡卡片。而鸿蒙生态(HarmonyOS)凭借其跨设备协同、分布式软总线以及声明式 UI 开发框架 ArkUI,为这类注重"轻量化交互 + 即时反馈"的生活方式类应用提供了极为理想的生长土壤。本应用正是一款面向"晨间场景"深度打磨的习惯追踪工具。它聚焦

2301_79516720的博客 118

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

基于HarmonyOS ArkTS API 24通过new PhotoItem(p)创建一个新的对象并替换数组中的原对象

在任何一个设计精良的应用中,色彩系统都是视觉一致性的基石。bg: string;这段代码定义了一个名为的接口,它包含了11个色彩字段,每个字段都对应应用界面中的一个特定功能角色。primary:主色调,通常用于页面头部、重要按钮等视觉重心区域。在本应用中,主色调选用了深棕色#3E2C23,既呼应了胶片暗房的氛围,又能提供足够的视觉对比度。brown:辅助棕色,用于次级强调元素,如标签背景、评分星星等,与主色调形成层次关系。bg:页面背景色,选用奶油色#F3EBDD。

2501_92985290的博客 951

基于HarmonyOS API 24咖啡品鉴记录应用当CoffeeRecord实例任意属性(如 rating、note 或 flavors 数组元素)发生变更时,状态管理系统追踪到变更路径

在移动互联网与智能穿戴设备高度普及的今天,"习惯养成"已经从一个模糊的自我管理理念,演变为一个可量化、可追踪、可视化的数字化产品赛道。越来越多的人希望借助手中的智能终端,把"早起、冥想、阅读、运动"这些抽象的自律行为,转化为一条条清晰的数据曲线和一张张可触摸的打卡卡片。而鸿蒙生态(HarmonyOS)凭借其跨设备协同、分布式软总线以及声明式 UI 开发框架 ArkUI,为这类注重"轻量化交互 + 即时反馈"的生活方式类应用提供了极为理想的生长土壤。本应用正是一款面向"晨间场景"深度打磨的习惯追踪工具。它聚焦

2301_79516720的博客 273

HarmonyOS 6.1 实战:组件之间通过属性传递(Props Down)和事件回调(Events Up)进行通信,形成单向数据流

鸿蒙操作系统(HarmonyOS)作为面向全场景智慧生活的分布式操作系统,其应用开发框架ArkUI提供了一套全新的声明式UI开发范式。ArkTS作为ArkUI的开发语言,在TypeScript的基础上进行了深度扩展,引入了装饰器、状态管理、自定义组件等一系列核心能力,使得开发者能够以近乎自然语言的方式描述界面结构与交互逻辑。在传统的Android开发中,开发者需要通过XML布局文件定义界面结构,再通过Java/Kotlin代码在运行时查找视图、绑定数据、监听事件。这种命令式的开发模式要求开发者精确描述"怎么

2401_86049470的博客 220
上一篇: Android中仿IOS圆盘时间选择器
下一篇: wxml文件错误,错误信息:未找到页面 pages/index/index对应的wxml文件
Android_gjw
博客等级 码龄11年 9粉丝 89原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值