Android绘制一条线来跟随你的手指
根据这个问题的答案: Android绘制一条线来跟随你的手指
我尝试了我的解决方案(参见代码),但我得到的形状像意大利面。如何摆脱以前的线? 我想在Microsoft Paint中绘制一条直线。
这是我的代码:
@Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: downx = event.getX(); downy = event.getY(); invalidate(); break; case MotionEvent.ACTION_MOVE: upx = event.getX(); upy = event.getY(); mCanvas.drawLine(downx, downy, upx, upy, mPaint); invalidate(); break; case MotionEvent.ACTION_UP: upx = event.getX(); upy = event.getY(); mCanvas.drawLine(downx, downy, upx, upy, mPaint); invalidate(); break; } return true; }
谢谢你们!
PS:这不是重复的问题,我在上面解释过!
您不应该在onTouchEvent
绘制,不要存储对canvas
的引用,将drawLine
移动到
@Override protected void onDraw(Canvas canvas) { ... }
invalidate()
将为您调用draw()
,然后调用onDraw()
。
通常:使用onTouchEvent
和onClick
等UI事件来修改视图的状态,然后从这些事件中调用invalidate()
并实现onDraw
以便它始终呈现对象的状态。
FingerLine.java
import android.content.Context; import android.graphics.*; import android.graphics.Paint.Style; import android.support.annotation.NonNull; import android.util.AttributeSet; import android.view.*; public class FingerLine extends View { private final Paint mPaint; private float startX; private float startY; private float endX; private float endY; public FingerLine(Context context) { this(context, null); } public FingerLine(Context context, AttributeSet attrs) { super(context, attrs); mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); mPaint.setStyle(Style.STROKE); mPaint.setColor(Color.RED); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.drawLine(startX, startY, endX, endY, mPaint); } @Override public boolean onTouchEvent(@NonNull MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: startX = event.getX(); startY = event.getY(); // Set the end to prevent initial jump (like on the demo recording) endX = event.getX(); endY = event.getY(); invalidate(); break; case MotionEvent.ACTION_MOVE: endX = event.getX(); endY = event.getY(); invalidate(); break; case MotionEvent.ACTION_UP: endX = event.getX(); endY = event.getY(); invalidate(); break; } return true; } }
activity_main.xml中
MainActivity.java
import android.app.Activity; import android.os.Bundle; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } }
结果
注意 :我正在使用
,但我认为这不会有所作为。
您需要在线条绘制代码调用Canvas.drawColor(Color.WHITE)
之前在onDraw()函数中重置View的背景颜色,将WHITE替换为您的背景颜色。 或者你可以在任何其他代码之前调用onDraw()中的super.onDraw(canvas)
函数。
很抱歉缺少示例,我是通过手机写的。
这是使线条跟随手指的解决方案。 (之后不会消失)
import android.content.Context; import android.graphics.*; import android.graphics.Paint.Style; import android.support.annotation.NonNull; import android.util.AttributeSet; import android.view.*; public class FingerLine extends View { private final Paint mPaint; private float startX; private float startY; private float endX; private float endY; public Canvas mCanvas; public FingerLine(Context context) { this(context, null); mBitmap = Bitmap.createBitmap(width, width, Bitmap.Config.ARGB_8888); }else { mBitmap = Bitmap.createBitmap(height, height, Bitmap.Config.ARGB_8888); } mCanvas = new Canvas(mBitmap); } public FingerLine(Context context, AttributeSet attrs) { super(context, attrs); mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); mPaint.setStyle(Style.STROKE); mPaint.setColor(Color.RED); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.drawLine(startX, startY, endX, endY, mPaint); } @Override public boolean onTouchEvent(@NonNull MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: startX = event.getX(); startY = event.getY(); invalidate(); break; case MotionEvent.ACTION_MOVE: endX = event.getX(); endY = event.getY(); invalidate(); break; case MotionEvent.ACTION_UP: endX = event.getX(); endY = event.getY(); mcanvas.drawLine(startX, startY, endX, endY, mPaint); invalidate(); break; } return true; } }