Android控件之基础控件——进度条类的view——TextView、Checkbox复选控件、RadioButton单选控件、ToggleButton开关、SeekBar拖动条、menu、弹窗

目录

 

一:view

二:控件通用属性

三:基础控件

处理文本的view——TextView

被点击的view——Button

处理图片的view——ImageView

接收用户信息输入的View——EditText

进度条类的view——ProgressBar

Checkbox复选控件

RadioButton单选控件(多个选项只能选择一个)

ToggleButton开关

SeekBar拖动条

四:三种menu

选项菜单OptionMenu

上下文菜单ContextMenu

弹出菜单PopupMenu

五:三种对话框(弹窗)

AlertDialog

自定义Dialog

附加内容:数组适配器


一:view

Android中每个控件父类都是一个view,view代表屏幕上的一块空白区域,具体显示什么内容交个具体的控件显示,

比如这块区域处理文本内容的view就用控件TextView

 

二:控件通用属性

 

 

三:基础控件


处理文本的view——TextView

相当于java中Swing包中的JLabel,但是功能更加强大,支持文本处理、支持html代码、文本样式处理、链接效果等,除了上面的通用的属性外,还有以下属性

android:text="@string/app_name"//内容
android:textColor="#fff"//文本颜色
android:textSize="30sp"//文本大小
android:lineSpacingMultiplier="2"//行倍距
android:lineSpacingExtra="20sp"//行距
android:singleLine="true"//单行显示
android:ellipsize="end"//三点省略位置
android:focusable="true"//设置焦点
android:focusableInTouchMode="true"//设置触摸时可获取焦点
android:marqueeRepeatLimit="marquee_forever"//设置跑马灯

被点击的view——Button

对于按钮主要是如何注册点击事件,方法有以下四种

    第一种:自定义内部类

    <Button
        android:id="@+id/login_btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="登录"/>

    public class MainActivity extends AppCompatActivity {

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_login);
            //获取按钮
            Button login_btn  =findViewById(R.id.login_btn);
            //按钮login_btn被点击时候的事件,使用自定义内部类实现
            login_btnListener login_btnListener = new login_btnListener();
            login_btn.setOnClickListener(login_btnListener) ;//注册事件监听器
        }
        //自定义一个内部类实现点击事件接口
        class login_btnListener implements View.OnClickListener{

            @Override
            public void onClick(View v) {
                Log.e("tag","点击了login_btn按钮戳发了自定义事件");
            }
        }
    }

   第二种: 匿名内部类

    public class MainActivity extends AppCompatActivity {

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_login);
            Button login_btn  =findViewById(R.id.login_btn);
            login_btn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Log.e("tag","点击了login_btn按钮戳发了自定义事件");
                }
            });
        }
    }

    第三种:当前Activity去实现事件接口

    public class MainActivity extends AppCompatActivity implements View.OnClickListener{//实现了点击事件接口

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_login);
            Button login_btn  =findViewById(R.id.login_btn);
            login_btn.setOnClickListener(this);
        }

        @Override
        public void onClick(View v) {
            Log.e("tag","点击了login_btn按钮戳发了自定义事件");
        }
    }

   第四种: 在布局文件中添加点击事件属性

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="loginClik"
        android:text="登录"/>

    public class MainActivity extends AppCompatActivity{

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_login);

        }

        public void loginClik(View v) {//定义xml中绑定的方法
            Log.e("tag","点击了login_btn按钮戳发了自定义事件");
        }
    }

处理图片的view——ImageView

用来现实和控制图像的控件,可以对他进行放大缩小旋转等,常见属性:

android:src="@mipmap/login"//指定前景资源名称

接收用户信息输入的View——EditText

用于输入文本内容的输入框,常用属性

android:inputType="textPassword"//文本框类型如number、text...
android:hint="请输入密码"//文本框默认内容
android:maxLength="12"//设置文本长度

进度条类的view——ProgressBar

默认的进度条是一个没有刻度、圆形、只是一个不断旋转的动画效果,通过设置style可以显示水平带有刻度的进度条

style="?android:attr/progressBarStyleHorizontal"//设置滚动条样式,这里progressBarStyleHorizontal是水平
android:progress="30"//设置进度值
android:max="200"//设置进度条最大值 默认100
android:indeterminate="true"//设置一直滚动

如何实现滚动条加载,这个相对于xml而言,在java代码中实现比较容易

我们定义带有id的一个滚动条

<ProgressBar
    android:id="@+id/myProgress"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    style="?android:attr/progressBarStyleHorizontal"
    />

public class MainActivity extends AppCompatActivity{//实现了点击事件接口

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
        final ProgressBar progressBar = findViewById(R.id.myProgress);
        //Android4.o之后不能在线程中直接操作控件 但是进度条是个特列
        new Thread(){
            @Override
            public void run(){
                for (int i = 0; i < 100; i++) {
                    progressBar.setProgress(i);
                    try {
                        Thread.sleep(30);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }.start();
    }
}

Checkbox复选控件

1个常用属性:默认是否选中

android:checked="true"

3个常用方法:设置选中方法、是否选中方法、选中状态监听方法

<CheckBox
    android:id="@+id/checkbox"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="篮球"
    android:checked="true" />


public class IndexActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        CheckBox checkBox = findViewById(R.id.checkbox);
        checkBox.setChecked(false);//设置选中方法
        final boolean flag=checkBox.isChecked();//是否选中方法
        Log.d("TAG","选中没有"+flag);
//选中状态监听方法
        checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                //业务处理代码
                Log.d("Tag","选中状态"+isChecked);
            }
        });
    }
}

RadioButton单选控件(多个选项只能选择一个)

与checkbox相比

通过点击无法变为未选中、一组RadioButton同时只能选中一个、大部分ui框架中都以圆形表示

需要放在RadioGroup中使用

<RadioGroup
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">
    <RadioButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="男"/>
    <RadioButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="女"/>
</RadioGroup>

ToggleButton开关

常用属性:

android:textOff="关"

android:textOn="开"

android:checked="true"//状态

<ToggleButton
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textOff="关"
    android:textOn="开"
    android:checked="true"/>

常用方法:基本使用和上面的一样

setChecked(boolean)

setOnCheckedChangeListener()

SeekBar拖动条

常用属性

android:max="100" //拖动条长度

android:progress="30"//拖动条起始位置

案例代码:

<SeekBar
    android:id="@+id/seekbar"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:max="100"
    android:progress="30" />

常用方法:

seekBar.setProgress(50);//设置进度

seekBar.getProgress(); //获取进度

seekBar.setOnSeekBarChangeListener()//拖动条监听

案例代码:

public class IndexActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        SeekBar seekBar  =findViewById(R.id.seekbar);
        seekBar.setProgress(50);
        seekBar.getProgress();
        seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            //实时获取位置
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                Log.d("目前","位置"+seekBar.getProgress());
            }

            //拉动开始位置
            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {
                Log.d("start","位置"+seekBar.getProgress());
            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {
                Log.d("end","位置"+seekBar.getProgress());
            }
        });
    }
}

四:三种menu

选项菜单OptionMenu

Android3.0之后,选项菜单出现在顶部的操作栏中,如下图有两种方式。直接将选项放在操作栏中或者将选项放置在三个点里,点击某个按钮出现的菜单选项

项目res目录右键new,选择Android Resource Directory,创建一个menu类型的资源文件夹

案例代码:(当然我们也可以在AS中通过拖拽完成)

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:title="保存"
        app:showAsAction="always" />
    <item
        android:title="新建"/>
    <item android:title="更多">
        <menu >
            <item android:title="分享" />
            <item android:title="收藏" />
        </menu>
    </item>
</menu>

几个重要的属性

//直接显示在操作栏中,而不是三点里面

app:showAsAction="always"

//同时设置图标和显示方式,只会显示在操作栏中

android:icon="@mipmap/bg"

app:showAsAction="always"

//既要显示图标又要显示字体如下

android:icon="@mipmap/bg"
app:showAsAction="always|withText"

 

显示在Activity中

上面我们定义好了菜单,如何放置到界面中?java代码如下

public class IndexActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
    //创建OptionMenu
    @Override
    public boolean onCreateOptionsMenu(Menu menu){
        //加载菜单资源
        getMenuInflater().inflate(R.menu.demomenu,menu);
        return true;
    }
    //菜单选中的逻辑处理的方法
    @Override
    public boolean onOptionsItemSelected(MenuItem item){
        switch (item.getItemId()){
            case R.id.save:
                Toast.makeText(this,"保存成功",Toast.LENGTH_SHORT).show();
                break;
            case R.id.share:
                Toast.makeText(this,"分享成功",Toast.LENGTH_SHORT).show();
                break;
        }
        return super.onOptionsItemSelected(item);
    }
}

上下文菜单ContextMenu

通过长按界面中的某个view不放,屏幕中间弹出ContextMenu,效果如下。但是ContextMenu所属者是某个按钮控件,OptionMenu是Activity

页面代码demomenu.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:title="保存"
        android:id="@+id/save"
        />
    <item
        android:id="@+id/create"
        android:title="新建"/>

</menu>

java代码

public class IndexActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //给按钮注册选项
        registerForContextMenu(findViewById(R.id.btn));
    }

    //创建ContextMenu
    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
        getMenuInflater().inflate(R.menu.demomenu,menu);
    }

    //菜单选项方法
    @Override
    public boolean onContextItemSelected(@NonNull MenuItem item) {
        switch (item.getItemId()){
            case R.id.save:
                Toast.makeText(this,"保存",Toast.LENGTH_SHORT).show();
                break;
            case R.id.create:
                Toast.makeText(this,"创建成功",Toast.LENGTH_SHORT).show();
                break;
        }
        return  super.onContextItemSelected(item);
    }
}

如何实现长按按钮,菜单选项出现在顶部菜单栏中,也就是开发中常说的上下文模式

页面代码demomenu.xml一样

java代码如下

public class IndexActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //为按钮设置上下文操作模式
        //第一步实现ActionMode CallBack
        //第二步view的长按事件去启动上下文操作模式
        findViewById(R.id.btn).setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                startActionMode(callback);
                return false;
            }
        });
    }

    ActionMode.Callback callback = new ActionMode.Callback() {
        //创建方法,启动上下文操作模式之后调用
        @Override
        public boolean onCreateActionMode(ActionMode mode, Menu menu) {
            getMenuInflater().inflate(R.menu.demomenu,menu);
            return true;
        }

        //创建方法之后调用
        @Override
        public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
            return false;
        }

        //菜单选项点击之后执行
        @Override
        public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
            switch (item.getItemId()){
                case R.id.save:
                    Toast.makeText(IndexActivity.this,"保存",Toast.LENGTH_SHORT).show();
                    break;
                case R.id.create:
                    Toast.makeText(IndexActivity.this,"创建成功",Toast.LENGTH_SHORT).show();
                    break;
            }
            return true;
        }

        //上下文结束时候调用
        @Override
        public void onDestroyActionMode(ActionMode mode) {

        }
    };
}

弹出菜单PopupMenu

点击某个控件,菜单选项出现在指定菜单的下方

xml代码一样

java代码如下

public class IndexActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //弹出菜单
        final Button button = findViewById(R.id.btn);
        findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
           @Override
           public void onClick(View v) {
              //实例化一个弹出菜单,第一个参数环境上下文,第二个参数依附于哪个控件下方
              PopupMenu menu = new PopupMenu(IndexActivity.this,button);
              //加载菜单资源,
               menu.getMenuInflater().inflate(R.menu.demomenu,menu.getMenu());
               //设置点击监听器
               menu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
                   @Override
                   public boolean onMenuItemClick(MenuItem item) {
                       switch (item.getItemId()){
                           case R.id.save:
                               Toast.makeText(IndexActivity.this,"保存",Toast.LENGTH_SHORT).show();
                               break;
                           case R.id.create:
                               Toast.makeText(IndexActivity.this,"创建成功",Toast.LENGTH_SHORT).show();
                               break;
                       }
                       return true;
                   }
               });
               //显示
               menu.show();
           }
        });
    }


}

五:三种对话框(弹窗)

AlertDialog

用于给用户传递信息、提示信息、或者警告用户操作

主要的方法setTitle、 setMessage、create、show

public class IndexActivity extends AppCompatActivity {
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
//按钮的点击方法
    public  void  myClick(View view){
        //AlertDialog的构造器方法是protected,所以不能直接使用,我们通过builder创建
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle("提示");
        builder.setMessage("确定退出?");
        builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int i) {
                finish();
            }
        });
        builder.setNegativeButton("取消",null);
        builder.show();//显示窗口
    }
}

自定义Dialog

自定义弹窗的样式以及布局,同时具有弹窗所有的功能

界面activity_mydialog.xml文件如下

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@mipmap/mydialog"
    android:gravity="center_horizontal">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="你确定要退出吗?"
        android:textColor="#000"
        android:textStyle="bold"
        android:textSize="25sp"
        android:layout_marginTop="240dp"/>
    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:layout_marginTop="55dp">
        <Button
            android:id="@+id/yes"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="确  定"
            android:textStyle="bold"
            android:background="#83c122"
            android:textSize="16dp"
            android:layout_margin="10dp"/>
        <Button
            android:id="@+id/cancel"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="退  出"
            android:textStyle="bold"
            android:background="#83c122"
            android:textSize="16dp"
            android:layout_margin="10dp"/>

    </LinearLayout>

</LinearLayout>

对于界面的布局文件,在styles.xml定义如下

<!--自定义弹窗样式 -->
<style name="mydialog" parent="android:style/Theme.Dialog">
    <item name="android:windowNoTitle">true</item><!--弹窗没有标题-->
    <item name="android:windowBackground">@android:color/transparent</item><!--弹窗背景透明-->
</style>

java类如下

//自定义类继承Dialog
public class MydialogActivity extends Dialog {

    public MydialogActivity(@NonNull Context context, int themeResId) {
        super(context, themeResId);
        //设置布局为对话框
        super.setContentView(R.layout.activity_mydialog);
        findViewById(R.id.yes).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                System.exit(0);
            }
        });
        findViewById(R.id.cancel).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dismiss();
            }
        });

    }
}

主类中引用

public class IndexActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
    public  void  myClick(View view){
        MydialogActivity md = new MydialogActivity(this,R.style.mydialog);
        md.show();
    }
}

当我们点击了btn之后的效果如下

如下图中间出现的全选 粘贴 就是PopupWindow,

activity_popupwindow.xml如下

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal" android:layout_width="match_parent"
    android:layout_height="match_parent">
    <Button
        android:id="@+id/cut"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="剪切"/>
    <Button
        android:id="@+id/copy"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="复制"/>
</LinearLayout>

java代码

public class IndexActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
    public  void  myClick(View view){
        //弹窗的view对象
        View v = LayoutInflater.from(this).inflate(R.layout.activity_popupwindow,null);
        //创建实例 参数1用在弹窗中的view参数2弹窗宽高参数3是否获取焦点
        final PopupWindow popupWindow = new PopupWindow(v,280,80,true);
        //设置背景(可选操作)
        popupWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));//背景透明
        //设置能响应外部点击事件
        popupWindow.setOutsideTouchable(true);
        //设置响应点击事件
        popupWindow.setTouchable(true);
        //显示参数1锚,让弹窗在锚点下方显示,参数2 3相对于锚在x y方向的偏移量
        popupWindow.showAsDropDown(view,100,50);
        v.findViewById(R.id.cut).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(IndexActivity.this,"剪切成功",Toast.LENGTH_SHORT).show();
                popupWindow.dismiss();
            }
        });
        v.findViewById(R.id.copy).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(IndexActivity.this,"复制成功",Toast.LENGTH_SHORT).show();
                popupWindow.dismiss();
            }
        });

    }
}
附加功能----增加动画,需要附加的代码如下

mytranslate_anim在styles中定义如下

<!--动画样式-->
<style name="mytranslate_anim">
    <item name="android:windowEnterAnimation">@anim/mytranslate</item>
</style>

其中>@anim/mytranslate是定义好的动画资源,方法如下右键res目录,Android resources directory

创建一个anim文件夹

在当前这个anim目录中定义动画资源mytranslate.xml代码如下

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <!--translate移动动画 alpha透明动画 rotate旋转动画 scale缩放动画-->
    <translate
        android:fromXDelta="0"
        android:toXDelta="0"
        android:fromYDelta="300"
        android:toYDelta="0"
        android:duration="2"/><!--持续时间-->
</set>
 

附加内容:数组适配器

java内容

public class IndexActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
    public  void  myClick(View view){
        final String[] items ={"java","c","c++"};
        ArrayAdapter adapter = new ArrayAdapter(this,android.R.layout.simple_dropdown_item_1line,items);
        AlertDialog.Builder builder = new AlertDialog.Builder(this)
                .setTitle("请选择")
                //参数1适配器对象,也就是弹窗中数据显示样式的规则器,这里使用数组适配器
//参数2监听器
                .setAdapter(adapter, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int i) {
                        Toast.makeText(IndexActivity.this,items[i],Toast.LENGTH_SHORT).show();
                        dialog.dismiss();
                    }
                });
        builder.show();
    }
}

实现带有自定义样式的是数组适配器

自定array_item_layout.xml如下

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal" android:layout_width="match_parent"
    android:layout_height="match_parent">
    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@mipmap/star"/>
    <TextView
        android:id="@+id/item_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
</LinearLayout>

java代码如下

之前的

ArrayAdapter adapter = new ArrayAdapter(this,android.R.layout.simple_dropdown_item_1line,items);

替换为下面代码即可,指定自定义的界面R.layout.array_item_layout,把数组加入到指定的位置R.id.item_text

ArrayAdapter adapter = new ArrayAdapter(this,R.layout.array_item_layout,R.id.item_text,items);

文章首发地址:www.javayihao.top
文章首发公众号:java一号

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

程序三两行

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

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

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

打赏作者

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

抵扣说明:

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

余额充值