gpt4 book ai didi

android - 在 Canvas 上画一颗心

转载 作者:行者123 更新时间:2023-11-29 01:43:48 25 4
gpt4 key购买 nike

我想在 Canvas 上画一个心形。我发现了不同的数学方程式,但我无法将它们中的任何一个转换成我可以在 onDraw 方法中实现的代码。我希望在这里有一颗类似于这种形状的心:

enter image description here

我追求的形状方程在哪里:

enter image description here

enter image description here

最佳答案

public class HeartShape extends FrameLayout {

private Paint paint;
public HeartShape(@NonNull Context context) {
super(context);
init();
}

private void init() {
paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setColor(Color.RED);
paint.setStyle(Style.STROKE);
setWillNotDraw(false);
}

public HeartShape(@NonNull Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
init();
}

public HeartShape(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}

public HeartShape(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
init();
}

@Override
protected void onDraw(Canvas canvas) {

Path path = createHeartPath(canvas.getClipBounds().right,canvas.getClipBounds().bottom);

canvas.drawPath(path,paint);

super.onDraw(canvas);
}

private Path createHeartPath(int width, int height) {
Path path = new Path();
path.moveTo(0,height/3f);
path.lineTo(width,height/3f);
path.moveTo(width/2f,0f);
path.lineTo(width/2f,height);

float pX = width/2f;
float pY = (height/100f)*33.33f;

float x1 = (width/100f)*50;
float y1 = (height/100f)*5;
float x2 = (width/100f)*90;
float y2 = (height/100f)*10;
float x3 = (width/100f)*90;
float y3 = (height/100f)*33.33f;

path.moveTo(pX,pY);
path.cubicTo(x1, y1, x2, y2, x3, y3);
path.moveTo(x3,pY);

x1 = (width/100f)*90;
y1 = (height/100f)*55f;
x2 = (width/100f)*65;
y2 = (height/100f)*60f;
x3 = (width/100f)*50;
y3 = (height/100f)*90f;

path.cubicTo(x1, y1, x2, y2, x3, y3);
// path.lineTo(pX,pY);


x1 = (width/100f)*50;
y1 = (height/100f)*5;
x2 = (width/100f)*10;
y2 = (height/100f)*10;
x3 = (width/100f)*10;
y3 = (height/100f)*33.33f;

path.moveTo(pX,pY);
path.cubicTo(x1, y1, x2, y2, x3, y3);
path.moveTo(x3,pY);

x1 = (width/100f)*10;
y1 = (height/100f)*55f;
x2 = (width/100f)*35f;
y2 = (height/100f)*60f;
x3 = (width/100f)*50f;
y3 = (height/100f)*90f;

path.cubicTo(x1, y1, x2, y2, x3, y3);
//path.lineTo(pX,pY);

path.moveTo(x3,y3);
path.close();

return path;
}


}

输出

enter image description here

移除画线代码并设置paint.setStyle(Style.FILL);

private Path createHeartPath(int width, int height) {
Path path = new Path();
//path.moveTo(0,height/3f);
//path.lineTo(width,height/3f);
//path.moveTo(width/2f,0f);
//path.lineTo(width/2f,height);

float pX = width/2f;
float pY = (height/100f)*33.33f;

float x1 = (width/100f)*50;
float y1 = (height/100f)*5;
float x2 = (width/100f)*90;
float y2 = (height/100f)*10;
float x3 = (width/100f)*90;
float y3 = (height/100f)*33.33f;

path.moveTo(pX,pY);
path.cubicTo(x1, y1, x2, y2, x3, y3);
path.moveTo(x3,pY);

x1 = (width/100f)*90;
y1 = (height/100f)*55f;
x2 = (width/100f)*65;
y2 = (height/100f)*60f;
x3 = (width/100f)*50;
y3 = (height/100f)*90f;

path.cubicTo(x1, y1, x2, y2, x3, y3);
path.lineTo(pX,pY);


x1 = (width/100f)*50;
y1 = (height/100f)*5;
x2 = (width/100f)*10;
y2 = (height/100f)*10;
x3 = (width/100f)*10;
y3 = (height/100f)*33.33f;

path.moveTo(pX,pY);
path.cubicTo(x1, y1, x2, y2, x3, y3);
path.moveTo(x3,pY);

x1 = (width/100f)*10;
y1 = (height/100f)*55f;
x2 = (width/100f)*35f;
y2 = (height/100f)*60f;
x3 = (width/100f)*50f;
y3 = (height/100f)*90f;

path.cubicTo(x1, y1, x2, y2, x3, y3);
path.lineTo(pX,pY);

path.moveTo(x3,y3);
path.close();

return path;
}

enter image description here

我们可以修改 createHeartPath() 方法的逻辑/绘图物理以获得更好的输出,欢迎提出新的建议和更改。

关于android - 在 Canvas 上画一颗心,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22775442/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com