可能重复的How to make custom brush for canvas in android?
你好朋友,
我为创建适用于油漆应用的这种画笔而感到困惑,但没有找到与此相关的任何东西。
我是绘画/画布的新手,所以我对完成的基本操作不了解,但是对于像创建画笔这样的效果,我没有像如何创建/实现它的任何知识。有人为此提供示例或代码吗?
我的应用程序需要这种类型的画笔,一个简单的示例需要理解:
谢谢。
我想没有简单的方法。我发现this discussion,尤其是以下帖子很有趣:
专业计算机图形学从不容易。这就是为什么很少有人真正解决它。更糟糕的是,专业技术很少发表。我不知道你有多努力渴望获得它,但我会给你一些启示。所以,如果你想要,您可以学习,开发并获得最佳方法。如果看起来也一样为您而努力,请耐心等待。
当今制作书法毛笔的专业方法就像那:
主曲线是平滑的,因为它是基于样条线绘制的。至得到更专业的结果,构造两个样条曲线:一个使用您在样条线上获得的点(例如,来自鼠标事件)另一个使用样条控制点之类的点。所以您绘制的曲线是从这些插值生成的曲线两个样条线。这样,您就可以绘制“主曲线”。
您还应该有一个“主厚度”,必须在上面有一个变化应用。该厚度变化是根据你想要的结果。更常见的书法笔刷就是就像您链接的图像一样:弯曲的区域通常更细比平直的这是更常见的类型,因为大多数设计人员使用平板电脑绘图时会得到这种结果,因此程序模仿这种行为。通常这种效果通常是使用基于母版的二阶导数的函数计算花键。厚度变化幅度可以是可配置的值。
细而尖的曲线尖端是在额外的计算中得出的。有时甚至平滑厚度也是一个好主意样条曲线或某种“天花板功能”的变化。
如果您把所有事情做对了,那么您就厚了(当然是封闭的)在您的手中弯曲。使用您可以使用的最佳填充算法进行绘制开发。如果可以,请使用抗锯齿。
所有这些技术都可以在用户移动鼠标。您获得的积分越多,您进行的计算就越多进行,但是效果很好,因为您已经进行的大多数计算都是仍然有效。通常,您只需要重构一小部分(最后一个)。
最后一个建议:永远不要使用函数回归进行2D平滑处理方法,除非您的观点真的代表一个函数(所以您需要尽可能地保留要点的“数学意义”)。我可以不能想象有一种较慢的方法来平滑没有特殊之处的点语义。唯一的例外是当您的分数非常稀疏时输入顺序无关紧要,但是当有人在用画笔绘画。
您可以通过在画布上绘制位图纹理来实现此效果。我从共享的图像中裁剪了一些纹理,并将其用作画布中的纹理:-
纹理图像:-
这是我的观看课:-
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上看到完整的源代码>
尽管为时已晚,我想分享一些东西。这可能会帮助某人。在下面的链接中,针对HTML canvas的JavaScript代码讨论了各种画笔技术。您要做的就是将JavaScript代码转换为您期望的代码。将JavaScript Canvas代码转换为Android Canvas代码非常简单。