我正在尝试创建一个绘图应用程序,应用程序将能够沿着屏幕上的触摸路径绘制不同的笔刷纹理。
到目前为止我做了什么:
以下是我的自定义视图的代码:
public class TestDrawingView extends View{
private Bitmap mBitmapBrush;
private Vector2 mBitmapBrushDimensions;
private List<Vector2> mPositions = new ArrayList<Vector2>(100);
public TestDrawingView(Context context) {
super(context);
// TODO Auto-generated constructor stub
// load your brush here
mBitmapBrush = BitmapFactory.decodeResource(context.getResources(), R.drawable.test_sand_brush);
mBitmapBrushDimensions = new Vector2(10, 10);
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;
}
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;
}
}
我已从此问题How to make custom brush for canvas in android?
中获取此示例代码 我使用的纹理图像:
我得到了什么结果:
我想要实现的结果:
非常感谢任何帮助。
答案 0 :(得分:3)
在每个注册的触摸位置上绘制一个位图是一个良好的开端,但为了创建像您在此处看到的那样的平滑效果,您在这里需要更多逻辑。我将概述一些步骤供您实施:
Math.atan2(p2.y - p1.y, p2.x - p1.x);
这应该可以让你开始,虽然你可能希望在线与自身相交的情况下实现更复杂的逻辑 - 在这种情况下你可能希望拥有(或构建)一个&#34;交叉点&#34;位图并使用更多逻辑来识别何时发生这种情况以及如何相应地旋转位图。