自定义View之Paint - RadialGradient

RadialGradient

RadialGradient即放射性渐变,由中心点向四周逐渐渐变,其颜色渐变是由中心点向四周以线性变化。以达到这样的效果:

这里写图片描述

它有两个构造函数:

  • RadialGradient(float centerX, float centerY, float radius, int[] colors, float[] stops, Shader.TileMode tileMode)
  • RadialGradient(float centerX, float centerY, float radius, int centerColor, int edgeColor, Shader.TileMode tileMode)

双色的放射渐变

先看其对应的构造函数:

  • RadialGradient(float centerX, float centerY, float radius, int centerColor, int edgeColor, Shader.TileMode tileMode)

其各参数的意义如下:

  • centerX:表示渐变中心的X坐标
  • centerY:表示渐变中心的Y坐标
  • radius:表示渐变的半径
  • centerColor:表示
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现这样的自定义View,您可以按照以下步骤进行操作: 1. 创建一个自定义View类,并继承View。 2. 在自定义View类中定义以下属性: - 圆弧的宽度 - 圆弧的半径 - 进度条的最小值和最大值 - 进度条的当前值 - 进度条的颜色 3. 重写onMeasure()方法,以确保View的大小正确。 4. 重写onDraw()方法,绘制圆弧和进度条。要绘制圆弧,可以使用Canvas.drawArc()方法。要绘制进度条,可以使用Canvas.drawLine()方法。 5. 实现触摸事件,以便用户可以拖动进度条。在onTouchEvent()方法中处理DOWN、MOVE和UP事件。在MOVE事件中,计算拖动按钮的位置和当前进度值,并调用invalidate()方法以便重新绘制View。 6. 在绘制进度条时,使用Shader来实现渐变色。您可以使用LinearGradientRadialGradient来创建Shader。使用Shader作为画笔的颜色,以便实现渐变色。 下面是一个简单的示例代码,演示如何实现此自定义View: ``` public class ArcSeekBar extends View { private static final int DEFAULT_ARC_WIDTH = 20; // 默认圆弧宽度 private static final int DEFAULT_ARC_RADIUS = 100; // 默认圆弧半径 private static final int DEFAULT_MIN_VALUE = 0; // 默认最小值 private static final int DEFAULT_MAX_VALUE = 100; // 默认最大值 private static final int DEFAULT_PROGRESS_VALUE = 50; // 默认进度值 private int mArcWidth; // 圆弧宽度 private int mArcRadius; // 圆弧半径 private int mMinValue; // 最小值 private int mMaxValue; // 最大值 private int mProgressValue; // 进度值 private int mProgressColor; // 进度条颜色 private Paint mArcPaint; // 圆弧画笔 private Paint mProgressPaint; // 进度条画笔 private Paint mThumbPaint; // 拖拽按钮画笔 private float mThumbX; // 拖拽按钮的X坐标 public ArcSeekBar(Context context) { this(context, null); } public ArcSeekBar(Context context, AttributeSet attrs) { super(context, attrs); initAttrs(attrs); initPaints(); } private void initAttrs(AttributeSet attrs) { TypedArray ta = getContext().obtainStyledAttributes(attrs, R.styleable.ArcSeekBar); mArcWidth = ta.getDimensionPixelSize(R.styleable.ArcSeekBar_arcWidth, DEFAULT_ARC_WIDTH); mArcRadius = ta.getDimensionPixelSize(R.styleable.ArcSeekBar_arcRadius, DEFAULT_ARC_RADIUS); mMinValue = ta.getInt(R.styleable.ArcSeekBar_minValue, DEFAULT_MIN_VALUE); mMaxValue = ta.getInt(R.styleable.ArcSeekBar_maxValue, DEFAULT_MAX_VALUE); mProgressValue = ta.getInt(R.styleable.ArcSeekBar_progressValue, DEFAULT_PROGRESS_VALUE); mProgressColor = ta.getColor(R.styleable.ArcSeekBar_progressColor, Color.RED); ta.recycle(); } private void initPaints() { mArcPaint = new Paint(); mArcPaint.setStyle(Paint.Style.STROKE); mArcPaint.setStrokeWidth(mArcWidth); mArcPaint.setColor(Color.GRAY); mArcPaint.setAntiAlias(true); mProgressPaint = new Paint(); mProgressPaint.setStyle(Paint.Style.STROKE); mProgressPaint.setStrokeWidth(mArcWidth); mProgressPaint.setAntiAlias(true); mThumbPaint = new Paint(); mThumbPaint.setStyle(Paint.Style.FILL); mThumbPaint.setColor(mProgressColor); mThumbPaint.setAntiAlias(true); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int width = getPaddingLeft() + getPaddingRight() + mArcRadius * 2; int height = getPaddingTop() + getPaddingBottom() + mArcRadius * 2; setMeasuredDimension(resolveSize(width, widthMeasureSpec), resolveSize(height, heightMeasureSpec)); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); // 绘制圆弧 canvas.drawArc(getArcRectF(), 135, 270, false, mArcPaint); // 绘制进度条 mProgressPaint.setShader(createGradientShader()); canvas.drawLine(getArcCenterX(), getArcCenterY(), mThumbX, getArcCenterY(), mProgressPaint); // 绘制拖拽按钮 canvas.drawCircle(mThumbX, getArcCenterY(), mArcWidth / 2f, mThumbPaint); } private RectF getArcRectF() { int left = getPaddingLeft() + mArcWidth / 2; int top = getPaddingTop() + mArcWidth / 2; int right = getMeasuredWidth() - getPaddingRight() - mArcWidth / 2; int bottom = getMeasuredHeight() - getPaddingBottom() - mArcWidth / 2; return new RectF(left, top, right, bottom); } private float getArcCenterX() { return getMeasuredWidth() / 2f; } private float getArcCenterY() { return getMeasuredHeight() / 2f; } private Shader createGradientShader() { int[] colors = {Color.GREEN, mProgressColor}; return new LinearGradient(getArcCenterX(), getArcCenterY() - mArcRadius, getArcCenterX(), getArcCenterY() + mArcRadius, colors, null, Shader.TileMode.CLAMP); } @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: case MotionEvent.ACTION_MOVE: float x = event.getX(); if (x < getPaddingLeft() + mArcRadius) { mThumbX = getPaddingLeft() + mArcRadius; } else if (x > getMeasuredWidth() - getPaddingRight() - mArcRadius) { mThumbX = getMeasuredWidth() - getPaddingRight() - mArcRadius; } else { mThumbX = x; } mProgressValue = (int) ((mMaxValue - mMinValue) * (mThumbX - getPaddingLeft() - mArcRadius) / (getMeasuredWidth() - getPaddingLeft() - getPaddingRight() - mArcRadius * 2) + mMinValue); invalidate(); return true; case MotionEvent.ACTION_UP: return true; } return super.onTouchEvent(event); } } ``` 在XML布局文件中可以这样使用: ``` <com.example.ArcSeekBar android:layout_width="match_parent" android:layout_height="wrap_content" app:arcWidth="30dp" app:arcRadius="150dp" app:minValue="0" app:maxValue="100" app:progressValue="50" app:progressColor="#ff0000" /> ``` 其中,app:arcWidth、app:arcRadius、app:minValue、app:maxValue、app:progressValue和app:progressColor是自定义的属性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值