Android VerticalSeekBar竖直进度条的使用及问题总结

本文总结了如何在Android项目中实现一个竖直进度条VerticalSeekBar,包括自定义VerticalSeekBar.java,配置color.xml和attrs.xml,以及在SettingItemView中应用。在开发过程中遇到的XML可见性问题、滚动条干扰和点击事件冲突等问题,通过修改代码和添加注解成功解决。
摘要由CSDN通过智能技术生成

注:下文中SettingItemView源代码(由于涉及信息安全,个人私密博客,与本文总结的进度条并没有多少关联,仅供自己review)

需求简单描述:
在项目中有多个自定义的卡片SettingItemView(也是一个自定义View),其中一个卡片中要使用到一个竖直的进度条。
我们这边要实现的,就是设计一个自定义的竖直进度条,并且只在这一个卡片中显示出来。
这边需要
(1)自定义一个VerticalSeekBar.java文件
(2)在values文件中的color.xmlattrs.xml中添加(1)中需要的对应属性
(3)在卡片的xml中放入自定义的VerticalSeekBar,调整位置及visivility等属性。
(这边就是放入自定义的卡片SettingItemView对应的setting_item.xml中,因为后续需要总结的开发过程中的问题还会涉及到这个卡片,所以这边提一下)

综上,核心代码就是VerticalSeekBar.javacolor.xmlattrs.xml,然后就可以把自定义的VerticalSeekBar直接在需要的卡片的xml文件中直接应用即可。

先直接放代码:

(1)VerticalSeekBar.java

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;


import androidx.annotation.Nullable;


public class VerticalSeekBar extends View {
   

    int maxValue;
    int minValue;
    int currentValue;
    int count;
    float eachHeight;
    float yCoordinate;

    Paint backgroundPaint;
    OnChangeListener listener;

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

    public VerticalSeekBar(Context context, @Nullable AttributeSet attrs) {
   
        this(context, attrs, 0);
    }

    public VerticalSeekBar(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
   
        super(context, attrs, defStyleAttr);

        TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.VerticalSeekBar);
        maxValue = typedArray.getInteger(R.styleable.VerticalSeekBar_max_value, 7);
        minValue = typedArray.getInteger(R.styleable.VerticalSeekBar_min_value, 1);
        currentValue = minValue;
        backgroundPaint = new Paint();
        backgroundPaint.setColor(getResources().getColor(R.color.grey1));
        backgroundPaint.setAntiAlias(true);

        typedArray.recycle();
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
   
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        int widthMode = MeasureSpec.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现一个锥形进度条,可以使用Canvas绘制渐变效果。下面是一个简单的示例代码: ```java public class ConeProgressBar extends View { private Paint paint; private int progress = 0; private int max = 100; private int width, height; public ConeProgressBar(Context context) { super(context); init(); } public ConeProgressBar(Context context, AttributeSet attrs) { super(context, attrs); init(); } public ConeProgressBar(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } private void init() { paint = new Paint(); paint.setAntiAlias(true); paint.setStyle(Paint.Style.FILL); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); width = MeasureSpec.getSize(widthMeasureSpec); height = MeasureSpec.getSize(heightMeasureSpec); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); // 计算进度条的角度 float angle = (float) progress / max * 360; // 创建一个渐变画笔 Shader shader = new SweepGradient(width / 2, height / 2, Color.BLUE, Color.GREEN); paint.setShader(shader); // 绘制一个圆形 canvas.drawCircle(width / 2, height / 2, width / 2, paint); // 绘制一个扇形 paint.setShader(null); paint.setColor(Color.WHITE); canvas.save(); canvas.rotate(-90, width / 2, height / 2); canvas.drawArc(new RectF(0, 0, width, height), 0, angle, true, paint); canvas.restore(); } public void setProgress(int progress) { this.progress = progress; invalidate(); } public int getMax() { return max; } public void setMax(int max) { this.max = max; } } ``` 在这个示例中,我们创建了一个继承自View的自定义控件ConeProgressBar。在控件的构造函数中,我们初始化了画笔,并设置了画笔的一些基本属性。 在onMeasure()方法中,我们获取了控件的宽度和高度。 在onDraw()方法中,我们首先计算了进度条的角度,然后创建了一个渐变画笔,并使用drawCircle()方法绘制了一个圆形。 接着,我们使用drawArc()方法绘制了一个扇形,表示进度条的进度。在绘制扇形之前,我们还用save()和restore()方法保存和恢复了画布的状态,这样可以保证绘制出来的扇形是竖直方向向上的。 最后,我们提供了setProgress()和setMax()方法,用于设置进度条的进度和最大值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值