Java 沿画布上的路径绘制位图
我正在尝试创建一个绘图应用程序,该应用程序将能够沿屏幕上的触摸路径绘制不同的笔刷纹理。Java 沿画布上的路径绘制位图,java,android,drawing,android-canvas,Java,Android,Drawing,Android Canvas,我正在尝试创建一个绘图应用程序,该应用程序将能够沿屏幕上的触摸路径绘制不同的笔刷纹理。 到目前为止我所做的: 以下是我的自定义视图的代码: public class TestDrawingView extends View{ private Bitmap mBitmapBrush; private Vector2 mBitmapBrushDimensions; private List<Vector2> mPositions = new ArrayList<Vector2&
到目前为止我所做的:
以下是我的自定义视图的代码:
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;
}
}
公共类TestDrawingView扩展视图{
私人位图mBitmapBrush;
专用矢量2 MbitMapBushDimensions;
私有列表位置=新的ArrayList(100);
公共TestDrawingView(上下文){
超级(上下文);
//TODO自动生成的构造函数存根
//把刷子放在这里
mBitmapBrush=BitmapFactory.decodeResource(context.getResources(),R.drawable.test\u sand\u brush);
mBitmapBrushDimensions=新矢量2(10,10);
立根基色(0xFFFFFF);
}
@凌驾
受保护的void onDraw(画布){
super.onDraw(帆布);
用于(矢量2位置:位置){
canvas.drawBitmap(mBitmapBrush,pos.x,pos.y,null);
}
}
@凌驾
公共布尔onTouchEvent(运动事件){
int action=event.getAction();
开关(动作){
case MotionEvent.ACTION\u移动:
final float posX=event.getX();
final float posY=event.getY();
add(新向量2(posX-mBitmapBrushDimensions.x/2,posY-mBitmapBrushDimensions.y/2));
使无效();
}
返回true;
}
私有静态最终类向量2{
公共向量2(浮点x,浮点y){
这个.x=x;
这个。y=y;
}
公开最终浮动x;
公开最终浮动;
}
}
我从这个问题中提取了这个示例代码我使用的纹理图像:
我得到的结果:
我想要达到的结果:
非常感谢您的帮助。在每个已注册的触摸位置绘制一个位图是一个良好的开端,但是为了创建像您在此处看到的那样平滑的效果,您需要在此处增加一些逻辑性。我将为您概述一些实施步骤:
Math.atan2(p2.y-p1.y,p2.x-p1.x)知道角度代码>
这应该让您开始了,尽管您可能希望在线自身相交的情况下实现更复杂的逻辑-在这种情况下,您可能希望拥有(或构造)一个“相交”位图,并使用更多的逻辑来确定何时发生这种情况以及如何相应地旋转位图。@aoeu()请分享你对此的看法。谢谢你的快速回复,你的回答似乎真的很有帮助。我正在尝试上述所有步骤。你的回答很有帮助。但是,如果您能提供一些更有用的示例代码,这将更有帮助。