自定义RadioGroup 实现选择

在Android中通过RadioGroup选择男、女的具体实现以及自定义RadioButton选中和未选中样式 RadioGroup:用于管理多个互斥的。监听选中事件:通过实时响应选择变化。默认选中:在 XML 或代码中设置或check()方法。获取选中值:通过判断用户选择。通过上述步骤,可以快速实现一个简单的性别选择功能。如果自定义样式呢,再看-- 水平排列 -->-- 默认选中 -->重点是radio_button_selector内容如下-- 当未被选中时的背景 -->-- 默认背景 -->radio_button_unchecked和radio_button_checked分别又是。 阅读详情

先来张效果图



去不代码:


package com.example.demo;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.widget.RadioGroup;


/**
 * Created by Administrator on 2017/1/7 0007.
 */
public class SecletDangType extends View {
    //上下文
    private Context mContext;
//画笔
    private Paint mPaint;
//选中的位置
    private int position = 0;
//灰色开始的横坐标
    private int start = 0;
    //灰色结束的横坐标
    private int stop = 0;
    //view 宽度
    private double width;
    //文字的边界
    private Rect mBounds;

    private Paint.FontMetrics mFontMetrics;

    public SecletDangType(Context context) {
        super(context);
    }

    public SecletDangType(Context context, AttributeSet attrs) {
        super(context, attrs);
        mContext = context;
        mPaint = new Paint();
        mPaint.setAntiAlias(true);
        mPaint.setStyle(Paint.Style.FILL);
        mPaint.setColor(Color.RED);
        mPaint.setTextSize(DensityUtil.sp2px(mContext, 16));
        mBounds = new Rect();
        mPaint.getTextBounds("手动", 0, "手动".length(), mBounds);

        mFontMetrics = mPaint.getFontMetrics();
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        width = w;
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        mPaint.setColor(Color.WHITE);
        mPaint.setXfermode(null);
        mPaint.setStyle(Paint.Style.FILL);
        mPaint.setStrokeWidth(10);
        int end = (int) (width / 3);

        Bitmap output = Bitmap.createBitmap(getMeasuredWidth(), getMeasuredHeight(), Bitmap.Config.ARGB_8888);

        Canvas bit = new Canvas(output);

        RectF rectF = new RectF(0, 0, getMeasuredWidth(), getMeasuredHeight());
        //画白色背景
        bit.drawRoundRect(rectF, 20, 20, mPaint);

        mPaint.setColor(Color.parseColor("#DDDDDD"));
        mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_ATOP));

        if (stop > 0) {
            end = stop;
        }
        //画选中矩形
        bit.drawRect(start, 0, end, getMeasuredHeight(), mPaint);

        mPaint.setStyle(Paint.Style.STROKE);
        mPaint.setColor(Color.parseColor("#6B6C6E"));
        //画周围圆角矩形
        bit.drawRoundRect(rectF, 20, 20, mPaint);

        mPaint.setStrokeWidth(3);
        mPaint.setColor(Color.parseColor("#DDDDDD"));
        //画分割线
        bit.drawLine((float) (width * 2 / 3), 5, (float) (width * 2 / 3), getMeasuredHeight() - 5, mPaint);
        bit.drawLine((float) (width / 3), 5, (float) (width / 3), getMeasuredHeight() - 5, mPaint);

        canvas.drawBitmap(output, 0, 0, mPaint);
        mPaint.setStyle(Paint.Style.FILL);
        mPaint.setColor(Color.BLACK);
        mPaint.setStrokeWidth(2);
        //画文字
        float y = getMeasuredHeight() / 2 + (Math.abs(mFontMetrics.ascent) - mFontMetrics.descent) / 2;
        canvas.drawText("不限", (float) ((width / 3 - mBounds.width()) / 2), y, mPaint);
        canvas.drawText("手动", (float) (((width / 3 - mBounds.width()) / 2) + width / 3), y, mPaint);
        canvas.drawText("自动", (float) (((width / 3 - mBounds.width()) / 2) + width * 2 / 3), y, mPaint);
    }

    /**
     * 点击事件
     * @param event
     * @return
     */
    @Override
    public boolean onTouchEvent(MotionEvent event) {

        if (event.getAction() == MotionEvent.ACTION_UP) {
            float x = event.getX();

            if (0 < x && x < width / 3) {
                start = 0;
                stop = (int) (width / 3);
                invalidate();
                position = 0;
            } else if (width / 3 < x && x < width * 2 / 3) {
                start = (int) (width / 3);
                stop = (int) (width * 2 / 3);
                invalidate();
                position = 1;
            } else if (x > width * 2 / 3) {
                start = (int) (width * 2 / 3);
                stop = getMeasuredWidth();
                invalidate();
                position = 2;
            }
        }
        return true;
    }

    public int getPosition() {
        return position;
    }
}

仿IOS分段选择器(自定义RadioGroup) 通过自定义RadioGroup,RadioButton的样式,实现最简易的仿IOS分段选择器 立即下载

相关推荐

Android 自定义RadioGroup布局,修改源码自定义控件

Android 自定义RadioGroup布局,修改源码自定义控件。RadioGroup组里面可以包含不同的布局,布局里面RadioButton。用了递归查找RadioButton。欢迎下载示例代码。

Element Plus 实例详解(八)___Radio 单选框

Element Plus Radio 单选框功能,1、基础用法,2、禁用状态,3、单选框组,4、按钮样式 5、带有边框,四、官方资料中的各参数说明

逆境清醒的博客 1万+

ANSYS CFX 自定义函数数据导入实战指南

本文详细介绍了在ANSYS CFX中实现自定义函数数据导入的完整流程与实战技巧。通过具体案例,指导用户如何将外部实验或计算数据(如材料属性随温度变化)导入CFX,创建可调用的函数,并正确关联到仿真模型中,从而显著提升仿真的真实性与准确性。

v6b7n8m9q0的博客 702

Element-UI整理(二):表单

目录 Radio 单选框 Checkbox 多选框 Input 输入框 InputNumber 计数器 Select 选择器 Cascader 级联选择器 Switch 开关 Slider 滑块 TimePicker 时间选择器 DatePicker 日期选择器 DateTimePicker 日期时间选择器 Upload 上传 Rate 评分 ColorPicker 颜色选择器 Transfer 穿梭框 Form 表单 内容 Radio Radio Attributes: 参数 说明 类型 可选

喜狼狼与灰太杨的博客 2334

无监督学习初探:K-Means聚类与主成分分析(PCA)

K-Means适用于快速分组,但对数据分布敏感,可结合轮廓系数评估质量。PCA通过特征值分解实现线性降维,需注意非线性场景的替代方案(如UMAP)。进阶方向:聚类:谱聚类、高斯混合模型(GMM)处理复杂形状。降维:t-SNE、自编码器处理非线性结构。

weixin_69882801的博客 1453

手把手教你设计低噪声前置放大电路:从光电二极管到X射线探测器的实战配置

本文实战指南详细解析了低噪声前置放大电路的设计,重点针对光电二极管和X射线探测器等微弱信号源。文章深入对比了跨阻放大器与电荷灵敏放大器的核心架构、噪声优化策略及PCB布局技巧,手把手指导从电路选型、仿真验证到调试测试的全流程,助力工程师构建精准可靠的信号链。

tech5的博客 512

Element组件(基础组件和配置组件)

buttonbutton添加样式:2.渲染没有边框(text)和背景色(bg)的按钮添加样式同上格式:2. //在图标后面添加内容3. //在图标前面添加内容需要添加style添加color=" " :dark="isDark"js中添加Border边框Container布局容器:外层容器:顶栏容器。:侧边栏容器。:主要区域容器。

weixin_68915174的博客 3065

Jetson编译安装pycuda

可使用nvcc --version查看是否有信息输出,若没有,且安装cuda的情况下,需要手动将CUDA 的路径添加到环境变量中。编译生成_pvt_struct.cpython-38-aarch64-linux-gnu.so文件。基于jetson orin nano jetpack512模块上安装pycuda。4、获取pycuda源码(版本根据实际情况获取)2、进入conda环境并安装cuda工具包。9、若未检测出来需要清除并强制编译。7、编译成功后安装pycuda。5、配置编译并设置环境变量。

qq_48175141的博客 972

用RadioGroup自定义选项卡

1、新建android 空项目TestDemo。 2、新建MainActivity.class //在代码中实现下划线 //方法一: TextView textView = (TextView)findViewById(R.id.tv_test); textView.setText(Html.fromHtml(""+"0123456"+"")); //方法二: textview.ge

朗朗的博客 3337

RANSAC地面点分割:从原理到C++实战优化

本文深入解析RANSAC算法在点云地面分割中的原理与C++实战优化,涵盖动态迭代次数、自适应阈值等关键技巧,通过并行计算和内存访问优化提升性能,适用于激光雷达点云处理。

weixin_29015051的博客 277

AIGC实战——多模态模型DALL.E 2

DALL.E 2 是 OpenAI 提出的一个大规模文本生成图像模型,可以根据文本提示生成各种风格的逼真图像。它通过将预训练模型 CLIP 与 GLIDE 中的扩散模型架构相结合完成任务。它还具有其他应用,例如通过文本提示编辑图像和提供给定图像的变体。虽然它也有一些局限性,例如不一致的文本渲染和属性绑定,但 DALL.E 2 是仍然一个非常强大的AI模型,推动了生成模型的发展。

盼小辉丶的博客 1万+

自定义RadioGroup实现单选完整示例

MainActivity如下: package cc.testradiogroup; import android.os.Bundle; import android.widget.RadioButton; import android.widget.RadioGroup; import android.widget.RadioGroup.OnCheckedChangeListener; im

谷哥的小弟 3863

【STM32项目】基于STM32设计的震动马达超声波电机高频震动——高级定时器PWM互补输出带死区控制__资料编号3

实现高级定时器互补输出带死区控制,实现震动/超声波电机/马达,高频震动。使用 STM32F103 芯片输出两路互补 PWM,并带有死区和刹车控制功能。定时器 1 通道 1 及其互补通道输出PWM,且带死区控。当定时器 1 的刹车输入引脚被拉高时,产生刹车时间,即定时器 8 停止输出 PWM。当刹车输入引脚被拉高时,通道 1 和通道 2 将从有波形输入状态转换成无效电平状态。

嵌入式阿齐Archie 6742

android radiogroup里面可以放其他控件吗,Android自定义View组合控件:自定义RadioGroup实现的分段选择控件,分段选择...

项目需求,自己实现分段选择控件,写的不足之处,希望体谅......但是我觉得好多项目都有,挺实用的具体实现不好描述,可参考demo,查看源码*效果图topcontrol.gif分析1.简单的组合控件2.用代码绘制StateListDrawable、GradientDrawable、ColorStateList使用1.在项目gradle中添加allprojects {repositories {.....

weixin_34109927的博客 449

深度强化学习调参技巧:以DQN、DDPG、TD3、PPO、SAC等算法为例

深度强化学习调参技巧:以D3QN、DDPG、TD3、PPO、SAC算法为例

丨汀、的博客 3443

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

IOS自定义RadioGroup

实现与android平台上相同的RadioGroup控件 //使用是只需要实现RadioGroup代理即可完成监听事件 [1].[图片] EBF2792E-4CB0-4318-B6B8-7CBA0E1E2DE5.png 跳至 [1] [2] [2].[代码] Objective-C 跳至 [1] [2] ? 1

zzbnalbp 1225

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

RadioGroup - android自定义RadioGroup实现可以添加多种布局

使用时修改两处: 1  /** 查找radioButton控件 */     public RadioButton findRadioButton(ViewGroup group) {                   RadioButton resBtn = null;         int len = group.getChildCount();         for (i

Android移动开发者的专栏 2351

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

RadioGroup实现类似ios的分段选择(UISegmentedControl)控件

在ios7中有一种扁平风格的控件叫做分段选择控件UISegmentedControl,控件分为一排,横放着几个被简单线条隔开的按钮,每次点击只能选择其中一个按钮,他类似于tabbar但是又稍微有点区别,新版的qq手机客户端就用到了这种控件。 但是在android中并没有现成的控件可用,不过android中有着功能类似但UI相差很大的RadioGroup控件,可以通过定义RadioGroup的...

{丸の子} 115

android 自定义tab_自定义RadioGroup实现TabLayout

自定义RadioGroup实现TabLayout先来看一下效果图:其实核心功能就两个:1、选中后改变字体颜色及加上下标2、事件回调实现思路:1、通过向RadioGroup中添加RadioButton实现Tab的填充2、通过设置设置特定属性去除选择按钮效果3、通过使用Selector控制RadioButton的字体及下标具体实现准备下标的drawable:<?xml version="1.0"...

weixin_39517357的博客 182

Android自定义有动画效果,用于选择的Layout

Android自定义有动画效果,用于选择的Layout public class SelectLayout extends LinearLayout { private AnimationSet mInAnime; private AnimationSet mOutAnime; private A...

weixin_34273481的博客 121

Android 自定义View实现多行RadioGroup (MultiLineRadioGroup)

一、项目概况   我们都知道RadioGroup可以实现选择框,但它有一个局限性,由于它是继承自LinearLayout的,所以只能有一个方向,横向或者纵向;但有时候仅一行的RadioGroup并不能满足实际的需求,比如在一行的宽度下显示不完所有的选项,设计上又不允许左右滑动,这时候RadioGroup就不能满足这样的功能设计了;基于此,我写了这个MultiLineRadioGroup并且开源出

技术成就梦想 829

自定义RadioGroup实现TabLayout

先来看一下效果图: 其实核心功能就两个: 1、选中后改变字体颜色及加上下标 2、事件回调 实现思路: 1、通过向RadioGroup中添加RadioButton实现Tab的填充 2、通过设置设置特定属性去除选择按钮效果 3、通过使用Selector控制RadioButton的字体及下标 具体实现 准备下标的drawable: <?xml version="1.0" encoding="ut...

QyLost 412

Android RadioGroup 换行, 支持多行多列

/*  * Copyright (C) 2006 The Android Open Source Project  *  * Licensed under the Apache License, Version 2.0 (the "License");  * you may not use this file except in compliance with the License.

iloveaman的专栏 1712

网格RadioGroup实现

RadioGroup只能横向和垂直展示RadioButton,然后设计师们就经常要求我们网格展示。比如要实现如下的效果: 那要怎么做呢,采用继承RadioGroup,重新绘制里面的内容,上代码: 定义所需属性 attrs: <declare-styleable name="GridRadioGroup"> <attr name="numColumns" form...

u012693479的博客 1109

Extjs radioGroup 取值 赋值

var radiogroup= new Ext.form.RadioGroup({ fieldLabel : "性别", items : [{ boxLabel : '男', inputValue : '1',

HN_LKL的专栏 833

android 多行布局,Android实现RadioGroup的多行多列布局且互斥

1.自定义viewpublic class MyRadioGroupContainer extends LinearLayout {private RadioGroup.OnCheckedChangeListener mCheckChangeListener;private RadioGroup lastRadioGroup;private RadioGroup.OnCheckedChangeLi...

weixin_28761455的博客 629
上一篇: android view bitmap
下一篇: RecycleView 底部监听
younger_android
博客等级 码龄10年 10粉丝 30原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值