SweepGradient 改变开始和结束颜色的位置
SweepGradient change position of start and end color
我想创建一个从 底部 -> 左侧 -> 顶部 -> 右侧渐变的 CircleView。
所以我使用 canvas 和 SweepGradient
像这样
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Paint paint = new Paint();
int[] colors = {Color.GREEN, Color.RED};
float[] positions = {0, 1};
SweepGradient gradient = new SweepGradient(100, 100, colors, positions);
paint.setShader(gradient);
canvas.drawCircle(100, 100, 100, paint);
}
但是默认顺序是 right -> bottom -> left -> top 但我想要 bottom -> left -> top -> right
我试过将位置更改为
float[] positions = {0.25f, 1.25f};
但它只适用于AndroidStudio的Preview
,当我在真实设备中运行时,它显示的结果与positions = {0, 1}
相同
如何从 bottom -> left -> top -> right
像这样制作 SweepGradient
渐变
---更新---
我们可以像这样使用 setLocalMatrix
for SweepGradient
来旋转渐变
Matrix matrix = new Matrix();
matrix.setRotate(90, 100, 100);
gradient.setLocalMatrix(matrix);
在画圆之前旋转 canvas。
public class CircleView extends View {
private Paint paint;
public CircleView(Context context) {
super(context);
init();
}
public CircleView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public CircleView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
public void init() {
paint = new Paint();
int[] colors = {Color.GREEN, Color.RED};
float[] positions = {0, 1};
SweepGradient gradient = new SweepGradient(100, 100, colors, positions);
paint.setShader(gradient);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.save();
canvas.rotate(90, 100, 100);
canvas.drawCircle(100, 100, 100, paint);
canvas.restore();
}
}
编辑-1:
@pkskink is to use setLocalMatrix
建议的替代方法如下:
public void init() {
int[] colors = {Color.GREEN, Color.RED};
float[] positions = {0, 1};
Matrix matrix = new Matrix();
matrix.postRotate(90, 100, 100);
Shader gradient = new SweepGradient(100, 100, colors, positions);
gradient.setLocalMatrix(matrix);
paint = new Paint();
paint.setShader(gradient);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawCircle(100, 100, 100, paint);
}
我想创建一个从 底部 -> 左侧 -> 顶部 -> 右侧渐变的 CircleView。
所以我使用 canvas 和 SweepGradient
像这样
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Paint paint = new Paint();
int[] colors = {Color.GREEN, Color.RED};
float[] positions = {0, 1};
SweepGradient gradient = new SweepGradient(100, 100, colors, positions);
paint.setShader(gradient);
canvas.drawCircle(100, 100, 100, paint);
}
但是默认顺序是 right -> bottom -> left -> top 但我想要 bottom -> left -> top -> right 我试过将位置更改为
float[] positions = {0.25f, 1.25f};
但它只适用于AndroidStudio的Preview
,当我在真实设备中运行时,它显示的结果与positions = {0, 1}
如何从 bottom -> left -> top -> right
像这样制作 SweepGradient
渐变
---更新---
我们可以像这样使用 setLocalMatrix
for SweepGradient
来旋转渐变
Matrix matrix = new Matrix();
matrix.setRotate(90, 100, 100);
gradient.setLocalMatrix(matrix);
在画圆之前旋转 canvas。
public class CircleView extends View {
private Paint paint;
public CircleView(Context context) {
super(context);
init();
}
public CircleView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public CircleView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
public void init() {
paint = new Paint();
int[] colors = {Color.GREEN, Color.RED};
float[] positions = {0, 1};
SweepGradient gradient = new SweepGradient(100, 100, colors, positions);
paint.setShader(gradient);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.save();
canvas.rotate(90, 100, 100);
canvas.drawCircle(100, 100, 100, paint);
canvas.restore();
}
}
编辑-1:
@pkskink is to use setLocalMatrix
建议的替代方法如下:
public void init() {
int[] colors = {Color.GREEN, Color.RED};
float[] positions = {0, 1};
Matrix matrix = new Matrix();
matrix.postRotate(90, 100, 100);
Shader gradient = new SweepGradient(100, 100, colors, positions);
gradient.setLocalMatrix(matrix);
paint = new Paint();
paint.setShader(gradient);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawCircle(100, 100, 100, paint);
}