首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在画布上画一颗心

在画布上画一颗心
EN

Stack Overflow用户
提问于 2014-04-01 01:57:00
回答 2查看 6.7K关注 0票数 3

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

我所追求的形状方程:

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-04-01 03:28:59

Android绘图api不提供绘制任意方程曲线的工具。如果您愿意离开为心脏找到的特定功能形式,您可以使用三次Bezier曲线绘制心脏(没有颜色影响),这些曲线得到api的支持。您将创建一个Path,然后使用它的cubicTo方法添加曲线段。然后,您将使用Path来呈现Canvas#drawPath

要使用立方Bezier曲线来获得心脏形状,请看一看这个例子 (碰巧在JavaScript中,但是这个想法应该很容易移植到Android)。

我不知道什么是最好的方法是创建一个颜色梯度的心脏形状。我的建议是使用Bezier曲线定义心脏的内部和外部边界,并将其设置为Paint的剪辑区域。然后,您可以使用该Paint进行梯度填充,以限制绘制梯度的位置。

票数 2
EN

Stack Overflow用户

发布于 2020-04-15 10:32:04

代码语言:javascript
运行
复制
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;
    }


}

Output

删除绘图行代码并设置paint.setStyle(Style.FILL);

代码语言:javascript
运行
复制
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;
}

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22775442

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档