如何在android中创建这种类型的画笔用于绘画

问题描述 投票:9回答:3

可能重复的How to make custom brush for canvas in android?

你好朋友,

我为创建适用于油漆应用的这种画笔而感到困惑,但没有找到与此相关的任何东西。

我是绘画/画布的新手,所以我对完成的基本操作不了解,但是对于像创建画笔这样的效果,我没有像如何创建/实现它的任何知识。有人为此提供示例或代码吗?

我的应用程序需要这种类型的画笔,一个简单的示例需要理解:

“在此处输入图像描述”

谢谢。

android paint android-canvas brush
3个回答
8
投票

我想没有简单的方法。我发现this discussion,尤其是以下帖子很有趣:

专业计算机图形学从不容易。这就是为什么很少有人真正解决它。更糟糕的是,专业技术很少发表。我不知道你有多努力渴望获得它,但我会给你一些启示。所以,如果你想要,您可以学习,开发并获得最佳方法。如果看起来也一样为您而努力,请耐心等待。

当今制作书法毛笔的专业方法就像那:

主曲线是平滑的,因为它是基于样条线绘制的。至得到更专业的结果,构造两个样条曲线:一个使用您在样条线上获得的点(例如,来自鼠标事件)另一个使用样条控制点之类的点。所以您绘制的曲线是从这些插值生成的曲线两个样条线。这样,您就可以绘制“主曲线”。

您还应该有一个“主厚度”,必须在上面有一个变化应用。该厚度变化是根据你想要的结果。更常见的书法笔刷就是就像您链接的图像一样:弯曲的区域通常更细比平直的这是更常见的类型,因为大多数设计人员使用平板电脑绘图时会得到这种结果,因此程序模仿这种行为。通常这种效果通常是使用基于母版的二阶导数的函数计算花键。厚度变化幅度可以是可配置的值。

细而尖的曲线尖端是在额外的计算中得出的。有时甚至平滑厚度也是一个好主意样条曲线或某种“天花板功能”的变化。

如果您把所有事情做对了,那么您就厚了(当然是封闭的)在您的手中弯曲。使用您可以使用的最佳填充算法进行绘制开发。如果可以,请使用抗锯齿。

所有这些技术都可以在用户移动鼠标。您获得的积分越多,您进行的计算就越多进行,但是效果很好,因为您已经进行的大多数计算都是仍然有效。通常,您只需要重构一小部分(最后一个)。

最后一个建议:永远不要使用函数回归进行2D平滑处理方法,除非您的观点真的代表一个函数(所以您需要尽可能地保留要点的“数学意义”)。我可以不能想象有一种较慢的方法来平滑没有特殊之处的点语义。唯一的例外是当您的分数非常稀疏时输入顺序无关紧要,但是当有人在用画笔绘画。


3
投票

您可以通过在画布上绘制位图纹理来实现此效果。我从共享的图像中裁剪了一些纹理,并将其用作画布中的纹理:-

enter image description here

纹理图像:-

enter image description here

这是我的观看课:-

import java.util.ArrayList;
import java.util.List;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.view.MotionEvent;
import android.view.View;

import com.serveroverload.dali.R;

public class CanvasBrushDrawing extends View {
    private Bitmap mBitmapBrush;
    private Vector2 mBitmapBrushDimensions;

    private List<Vector2> mPositions = new ArrayList<Vector2>(100);

    private static final class Vector2 {
        public Vector2(float x, float y) {
            this.x = x;
            this.y = y;
        }

        public final float x;
        public final float y;
    }

    public CanvasBrushDrawing(Context context) {
        super(context);

// load your brush here
        mBitmapBrush = BitmapFactory.decodeResource(context.getResources(), R.drawable.ic_launcher);
        mBitmapBrushDimensions = new Vector2(mBitmapBrush.getWidth(), mBitmapBrush.getHeight());

        setBackgroundColor(0xffffffff);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        for (Vector2 pos : mPositions) {
            canvas.drawBitmap(mBitmapBrush, pos.x, pos.y, null);
        }
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {

        int action = event.getAction();
        switch (action) {
        case MotionEvent.ACTION_MOVE:
            final float posX = event.getX();
            final float posY = event.getY();
            mPositions.add(new Vector2(posX - mBitmapBrushDimensions.x / 2, posY - mBitmapBrushDimensions.y / 2));
            invalidate();
        }

        return true;
    }
}

您可以在活动中使用此视图:-

setContentView(new CanvasBrushDrawing(MainActivity.this));

现在,您只需要设计师提供更好的纹理文件即可。希望对您有所帮助

您可以在Git repo https://github.com/hiteshsahu/Dali-PaintBox上看到完整的源代码>


0
投票

尽管为时已晚,我想分享一些东西。这可能会帮助某人。在下面的链接中,针对HTML canvas的JavaScript代码讨论了各种画笔技术。您要做的就是将JavaScript代码转换为您期望的代码。将JavaScript Canvas代码转换为Android Canvas代码非常简单。

© www.soinside.com 2019 - 2024. All rights reserved.