- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试绘制一个由渐变填充的圆弧
下图就是我想要的
下图是我现在的样子
正如你在图片中看到的,我的渐变开始得太早了
我知道为什么会这样
如果我完成圆弧形成一个圆,我会得到这个
正如我们所见,渐变从 90 度开始。但是我的弧度是从135度画出来的,扫到270度
我的问题是如何让渐变从 135 度开始扫到 270 度?可以吗
到目前为止,这是我进行扫描渐变的方法
public void setProgressColourAsGradient(boolean invalidateNow) {
SweepGradient sweepGradient = new SweepGradient(baseArcRect.centerX(), baseArcRect.centerY(),progressGradientColourStart,progressGradientColourEnd);
//Make the gradient start from 90 degrees
Matrix matrix = new Matrix();
matrix.setRotate(90,baseArcRect.centerX(), baseArcRect.centerY());
sweepGradient.setLocalMatrix(matrix);
progressFillPaint.setShader(sweepGradient);
if (invalidateNow) {
invalidate();
}
}
我找不到任何 API 来告诉 SweepGradient 从哪里开始。
我已将所有代码添加到附录部分
感谢阅读!
评论 1
我尝试将旋转设置为 135 度
附录A ArcWithGradient View
public class ArcWithGradient extends View {
private Paint progressFillPaint;
private RectF baseArcRect;
private int progressGradientColourStart;
private int progressGradientColourEnd;
/**
* Thickness of the arc
*/
private int thickness;
public ArcWithGradient(Context context) {
super(context);
init();
}
public ArcWithGradient(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
init();
}
public ArcWithGradient(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init() {
progressGradientColourStart = ContextCompat.getColor(getContext(), R.color.pinnacle_gradient_start);
progressGradientColourEnd = ContextCompat.getColor(getContext(), R.color.pinnacle_gradient_end);
thickness = UiUtils.dpToPx(getContext(), 25);
//We do not want a colour for this because we will set a gradient
progressFillPaint = CanvasUtil.makeStrokePaint(UiUtils.dpToPx(getContext(), 25), -1);
baseArcRect = new RectF(0, 0, 0, 0);
setProgressColourAsGradient(false);
}
@Override
protected void onSizeChanged(int width, int height, int oldw, int oldh) {
super.onSizeChanged(width, height, oldw, oldh);
//Ensures arc is within the rectangle
float radius = Math.min(width, height) / 2;//
//I do radius - thickness so that the arc is within the rectangle
float baseArcLeft = ((width / 2) - (radius - thickness));
float baseArcTop = ((height / 2) - (radius - thickness));
float baseArcRight = ((width / 2) + (radius - thickness));
float baseArcBottom = ((height / 2) + (radius - thickness));
baseArcRect.set(baseArcLeft, baseArcTop, baseArcRight, baseArcBottom);
//Recalculate the gradient
setProgressColourAsGradient(false);
}
@Override
protected void onDraw(Canvas canvas) {
canvas.drawArc(baseArcRect, 135, 270, false, progressFillPaint);
}
public void setProgressColourAsGradient(boolean invalidateNow) {
SweepGradient sweepGradient = new SweepGradient(baseArcRect.centerX(), baseArcRect.centerY(),progressGradientColourStart,progressGradientColourEnd);
//Make the gradient start from 90 degrees
Matrix matrix = new Matrix();
matrix.setRotate(90,baseArcRect.centerX(), baseArcRect.centerY());
sweepGradient.setLocalMatrix(matrix);
progressFillPaint.setShader(sweepGradient);
if (invalidateNow) {
invalidate();
}
}
}
附录 B UiUtils
public class UiUtils {
public static int dpToPx(Context ctx, float dp) {
return Math.round(dp * ctx.getResources().getDisplayMetrics().density);
}
}
附录 C CanvasUtil
public class CanvasUtil {
public static Paint makeStrokePaint(int width, int color) {
Paint paint = new Paint();
paint.setAntiAlias(true);
paint.setStrokeCap(Paint.Cap.SQUARE);
paint.setStrokeWidth(width);
paint.setStyle(Paint.Style.STROKE);
paint.setColor(color);
return paint;
}
public static Paint makeFillPaint(int color) {
Paint paint = new Paint();
paint.setAntiAlias(true);
paint.setStyle(Paint.Style.FILL);
paint.setColor(color);
return paint;
}
最佳答案
正如@pskink 在评论中提到的,您需要使用SweepGradient
构造函数,它接受一个颜色列表和一个位置列表。 positions 参数是一个 float 数组,指示颜色应开始的 360 度百分比。
在我的示例中,我将 Canvas 旋转 115 度,然后为我的拱形绘制一个 310 度的扫描角。第一种颜色从 0 度角开始(因为 Canvas 已旋转),渐变以 310 度角到达第二种颜色,因此它与拱形的扫描角相匹配。外圈显示蓝色一直持续到 360 度,但蓝色从 310 度开始。
class SweepGradientView @JvmOverloads constructor(
context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
): View(context, attrs, defStyleAttr) {
private val archPaint = Paint(Paint.ANTI_ALIAS_FLAG).apply {
style = Paint.Style.STROKE
strokeWidth = 32 * context.resources.displayMetrics.density
}
private val archBounds = RectF()
private val archInset = 72 * context.resources.displayMetrics.density
private val gradientColors = intArrayOf(Color.MAGENTA, Color.BLUE)
private val gradientPositions = floatArrayOf(0/360f, 310/360f)
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
val width = MeasureSpec.getSize(widthMeasureSpec)
val height = MeasureSpec.getSize(heightMeasureSpec)
val size = Math.min(width, height)
setMeasuredDimension(size, size)
}
override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) {
super.onSizeChanged(w, h, oldw, oldh)
archPaint.shader = SweepGradient(width / 2f, height / 2f, gradientColors, gradientPositions)
archBounds.set(archInset, archInset, width.toFloat() - archInset, height.toFloat() - archInset)
}
override fun onDraw(canvas: Canvas) {
super.onDraw(canvas)
val cx = width / 2f
val cy = height / 2f
canvas.save()
canvas.rotate(115f, cx, cy)
canvas.drawArc(archBounds, 0f, 310f, false, archPaint)
canvas.drawCircle(cx, cy, width / 2.2f, archPaint)
canvas.restore()
}
}
关于java - Android:Canvas Arc,Sweep Gradient Start Angle可以改吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44504601/
我正在将我的项目从 Angular 7 迁移到 10。当我尝试编译项目时,我已将其导入为 import { AgmJsMarkerClustererModule } from '@agm/js-mar
我正在将我的项目从 Angular 7 迁移到 10。当我尝试编译项目时,我已将其导入为 import { AgmJsMarkerClustererModule } from '@agm/js-mar
当我们单击 ul 中的列表项下拉列表时,我必须将 fa-angle-left 更改为 fa-angle-down。请引用下面的代码。 Section 1 Secti
我有来自风向标的风向数据,数据以 0 到 359 度表示。 我想将其转换为具有 16 个不同方向的文本格式(罗盘玫瑰)。 基本上我想知道是否有一种快速灵活的方法可以将角度读数缩放到 16 字符串数组以
我注意到在单元格的右下角有一个小直角。 我的理解是这个小“直角”意味着列范围的结束。 我很确定我没有使用正确的 Excel 措辞。 如何删除直角指示器或在最后一个单元格之后输入更多数据,以便电子表格知
我正在使用 DevExpress v.10.2,并希望在 XtraReport 上显示带有 Angle 的 XRLabel。如果我正在使用 Designer,它工作正常。但现在我想在运行时执行此操作,
我想知道给定角度在哪个轴四分之一处以最有效的方式 第 1 季度:Alpha > 0 && Alpha 90 && Alpha 180 && Alpha 270 && Alpha 0 && an
我想使用 ROI 将图像中找到的多边形复制到新图像中。我希望这个多边形完全适合新图像。到目前为止,我使用了 ROI,但我注意到角度没有被考虑在内,一旦我旋转我希望检测的物体,这就会给我带来不好的结果。
从 MinAreaRect 的函数来看,它是否返回 0-360 度范围内的角度?我不确定,因为我有一个方向为 90 度左右的物体,但我一直得到 -1 或 -15 度。这可能是 openCV 错误吗?
让我首先说明我的数学很糟糕。 我正在尝试重新定位和旋转一个矩形。但是,我需要从一个不是 0,0 的点旋转矩形,而是根据它的坐标移动了多远。我确定这没有多大意义,所以我做了一些草图来帮助解释我需要什么。
我正在尝试使用 JavaScript 来旋转对象。当它改变方向时,我只需添加或减去 Angle 值即可。 Angle += 0.1; 或 Angle -= 0.1; 我的问题是,当对象完成完整旋转时,
为什么转义尖括号 > 会表现出类似前瞻的行为? 需要说明的是,我知道尖括号不需要转义。 问题是,如何解释模式以产生显示的匹配项 ## match bracket, with or without un
我读取了一个 csv 文件并将其转换为包含 2 个文本列的 pandas 数据框。在一列中,我有多行这种形式: suggested- action>YesNo " option1 option2 o
我做了很多研究,但真的找不到我应该如何使用四元数来执行以下操作: 我有源方向和目标方向,我试图找到从一个方向到另一个方向的特定角度(例如 10 度)的四元数。 我想了解四元数,也想避免万向节锁定,所以
这个问题与另一个 stackoverflow 讨论有关 distance between long&lat points 这是得票最多的答案中的代码: /* * Calculate distance
我想了解更多关于KeyPoints的知识,谁能告诉我什么是 关键点::角度 在 OpenCV 文档中提到角度是计算关键点的方向(如果不适用则为 -1)。我无法想象那是什么。那么谁能告诉我这是什么意思或
考虑以下示例 Simulink (Download example)系统: 输入是一个幅度和一个不断增加的角度,它将返回两个正弦,如预期的实部和虚部: 从实部和虚部计算幅度是没有问题的。获取域中的角度
我在通过 OCR 处理发票的程序中发现了一个有趣的问题。 在一步中,我对图像进行了歪斜校正,现在我有了一个特定的用例。 原始文件(解密): 旋转文件(解密): 我本以为旋转大约是 -15 度,但程序告
如果你尝试下面的代码段 import numpy as np import numpy.ma as ma a = np.random.random(100) + 1j*np.random.random
我正在尝试使用批处理脚本动态创建一个小的 XML 文件,但在编写以尖括号开头和结尾的行时遇到问题。 1) 如果我做类似的事情: set foo=^ echo %foo% > test.txt 这导致
我是一名优秀的程序员,十分优秀!