Android 绘制时使用预览绘制直线
我有一个画线的应用程序。当我按下屏幕时,我的手指划过并停止触摸,它画了一条线。我想知道当我在屏幕上划手指的时候,我怎么能看到我画的线 这是我画线的代码:Android 绘制时使用预览绘制直线,android,canvas,Android,Canvas,我有一个画线的应用程序。当我按下屏幕时,我的手指划过并停止触摸,它画了一条线。我想知道当我在屏幕上划手指的时候,我怎么能看到我画的线 这是我画线的代码: public class DrawingView extends View { private Path drawPath; private Paint drawPaint; private Paint canvasPaint; private int paintColor=Color.BLACK; p
public class DrawingView extends View {
private Path drawPath;
private Paint drawPaint;
private Paint canvasPaint;
private int paintColor=Color.BLACK;
private Canvas drawCanvas;
private Bitmap canvasBitmap;
float tX;
float tY;
public DrawingView(Context context, AttributeSet attrs){
super(context, attrs);
setupDrawing();
}
private void setupDrawing(){
drawPath=new Path();
drawPaint=new Paint();
drawPaint.setColor(paintColor);
drawPaint.setAntiAlias(true);
drawPaint.setStrokeWidth(1);
drawPaint.setStyle(Paint.Style.STROKE);
drawPaint.setStrokeJoin(Paint.Join.ROUND);
drawPaint.setStrokeCap(Paint.Cap.ROUND);
canvasPaint=new Paint(Paint.DITHER_FLAG);
}
protected void onSizeChanged(int w, int h, int oldw, int oldh){
super.onSizeChanged(w, h, oldw, oldh);
canvasBitmap=Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
drawCanvas=new Canvas(canvasBitmap);
}
protected void onDraw(Canvas canvas){
canvas.drawBitmap(canvasBitmap, 0, 0, canvasPaint);
canvas.drawPath(drawPath, drawPaint);
}
private void touch_start(float x, float y){
drawPath.reset();
drawPath.moveTo(x, y);
mX=x;
mY=y;
}
private void touch_move(float x, float y){
float dx=Math.abs(x-mX);
float dy=Math.abs(y-mY);
if(dx>=TOUCH_TOLERANCE||dy>=TOUCH_TOLERANCE){
mX=x;
mY=y;
}
}
private void touch_up(){
drawPath.lineTo(mX, mY);
drawCanvas.drawPath(drawPath, drawPaint);
drawPath.reset();
}
public boolean onTouchEvent(MotionEvent event){
tX=event.getX();
tY=event.getY();
switch(event.getAction()){
case MotionEvent.ACTION_DOWN:
touch_start(tX,tY);
break;
case MotionEvent.ACTION_MOVE:
touch_move(tX,tY);
break;
case MotionEvent.ACTION_UP:
touch_up();
break;
default:
return false;
}
invalidate();
return true;
}
}
请试试这个…请给出完整的类别代码…我刚刚用完整的类别代码编辑了代码它画了一条“自由手”线,而不是一条直线。我想我没有具体说明,对不起,这只是徒手画的线。。你只是在移动的时候画了一条线。。一旦跑起来,它就会抽空,但我需要直的。如果没有预览,它会画一条直线,我想预览这条直线。这不是一条完美的直线,但我认为对于该应用程序来说已经足够了。谢谢
public class DrawingView extends View {
private static final float TOUCH_TOLERANCE = 0;
private Path drawPath;
private Paint drawPaint;
private Paint canvasPaint;
private int paintColor=Color.BLACK;
private Canvas drawCanvas;
private Bitmap canvasBitmap;
float tX;
float tY;
private float mX;
private float mY;
private float a,b;
public DrawingView(Context context, AttributeSet attrs){
super(context, attrs);
setupDrawing();
}
private void setupDrawing(){
drawPath=new Path();
drawPaint=new Paint();
drawPaint.setColor(paintColor);
drawPaint.setAntiAlias(true);
drawPaint.setStrokeWidth(1);
drawPaint.setStyle(Paint.Style.STROKE);
drawPaint.setStrokeJoin(Paint.Join.ROUND);
drawPaint.setStrokeCap(Paint.Cap.ROUND);
canvasPaint=new Paint(Paint.DITHER_FLAG);
}
protected void onSizeChanged(int w, int h, int oldw, int oldh){
super.onSizeChanged(w, h, oldw, oldh);
canvasBitmap=Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
drawCanvas=new Canvas(canvasBitmap);
}
protected void onDraw(Canvas canvas){
canvas.drawBitmap(canvasBitmap, 0, 0, canvasPaint);
canvas.drawPath(drawPath, drawPaint);
}
private void touch_start(float x, float y){
drawPath.reset();
drawPath.moveTo(x, y);
mX=x;
mY=y;
a=x;
b=y;
}
private void touch_move(float x, float y){
float dx=Math.abs(x-mX);
float dy=Math.abs(y-mY);
if(dx>=TOUCH_TOLERANCE||dy>=TOUCH_TOLERANCE){
mX=x;
mY=y;
}
drawPath.lineTo(mX, mY);
//invalidate();
}
private void touch_up(float tX2, float tY2){
drawPath.lineTo(mX, mY);
//drawCanvas.drawPath(drawPath, drawPaint);
drawCanvas.drawLine(a, b, tX2, tY2, drawPaint);
drawPath.reset();
}
public boolean onTouchEvent(MotionEvent event){
tX=event.getX();
tY=event.getY();
switch(event.getAction()){
case MotionEvent.ACTION_DOWN:
touch_start(tX,tY);
break;
case MotionEvent.ACTION_MOVE:
touch_move(tX,tY);
break;
case MotionEvent.ACTION_UP:
touch_up(tX,tY);
break;
default:
return false;
}
invalidate();
return true;
}
}