import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.os.Bundle;
import android.view.Display;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.view.WindowManager;
/**
* 用双缓冲实现画板。 缺点:onTouchEvent的时候不能实时显示所画的轨迹,要用户手离开屏幕时候才画出来
*/
public class Tuya_demoActivity extends Activity {
private MyView myView;
private int screenWidth;
private int screenHeight;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
WindowManager windowManager = getWindowManager();
Display display = windowManager.getDefaultDisplay();
screenWidth = display.getWidth();
screenHeight = display.getHeight();
LayoutParams params = new LayoutParams(screenWidth, screenHeight);
myView = new MyView(this);
this.addContentView(myView, params);
}
public class MyView extends View {
private Bitmap cacheMap;
private Canvas cacheCanvas;
private Path path;
private Paint paint;
private float preX;
private float preY;
public MyView(Context context) {
super(context);
this.cacheMap = Bitmap.createBitmap(screenWidth, screenHeight,
Config.ARGB_8888);
this.cacheCanvas = new Canvas();
this.cacheCanvas.setBitmap(cacheMap);
this.cacheCanvas.drawColor(Color.WHITE);
this.path = new Path();
this.paint = new Paint(Paint.DITHER_FLAG);
this.paint.setAntiAlias(true);
this.paint.setColor(Color.RED);
this.paint.setStyle(Paint.Style.STROKE);
this.paint.setStrokeWidth(3);
}
@Override
public void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawBitmap(cacheMap, 0, 0, new Paint());
}
@Override
public boolean onTouchEvent(MotionEvent event) {
float x = event.getX();
float y = event.getY();
System.out.println(x + " " + y);
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
this.preX = x;
this.preY = y;
path.moveTo(x, y);
break;
case MotionEvent.ACTION_MOVE:
path.quadTo(preX, preY, x, y);
this.preX = x;
this.preY = y;
break;
case MotionEvent.ACTION_UP:
this.cacheCanvas.drawPath(path, paint);
path.reset();
break;
default:
break;
}
this.invalidate();
return true;
}
}
}
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.os.Bundle;
import android.view.Display;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.view.WindowManager;
/**
* 用双缓冲实现画板。 缺点:onTouchEvent的时候不能实时显示所画的轨迹,要用户手离开屏幕时候才画出来
*/
public class Tuya_demoActivity extends Activity {
private MyView myView;
private int screenWidth;
private int screenHeight;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
WindowManager windowManager = getWindowManager();
Display display = windowManager.getDefaultDisplay();
screenWidth = display.getWidth();
screenHeight = display.getHeight();
LayoutParams params = new LayoutParams(screenWidth, screenHeight);
myView = new MyView(this);
this.addContentView(myView, params);
}
public class MyView extends View {
private Bitmap cacheMap;
private Canvas cacheCanvas;
private Path path;
private Paint paint;
private float preX;
private float preY;
public MyView(Context context) {
super(context);
this.cacheMap = Bitmap.createBitmap(screenWidth, screenHeight,
Config.ARGB_8888);
this.cacheCanvas = new Canvas();
this.cacheCanvas.setBitmap(cacheMap);
this.cacheCanvas.drawColor(Color.WHITE);
this.path = new Path();
this.paint = new Paint(Paint.DITHER_FLAG);
this.paint.setAntiAlias(true);
this.paint.setColor(Color.RED);
this.paint.setStyle(Paint.Style.STROKE);
this.paint.setStrokeWidth(3);
}
@Override
public void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawBitmap(cacheMap, 0, 0, new Paint());
}
@Override
public boolean onTouchEvent(MotionEvent event) {
float x = event.getX();
float y = event.getY();
System.out.println(x + " " + y);
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
this.preX = x;
this.preY = y;
path.moveTo(x, y);
break;
case MotionEvent.ACTION_MOVE:
path.quadTo(preX, preY, x, y);
this.preX = x;
this.preY = y;
break;
case MotionEvent.ACTION_UP:
this.cacheCanvas.drawPath(path, paint);
path.reset();
break;
default:
break;
}
this.invalidate();
return true;
}
}
}
打算做一个随手画的小应用。里用了双缓冲写了一个测试类,可是画的时候不会实时显示出来,要用户抬起手时才画上去。
而不用双缓冲的话,就很难实现后期要做的一个功能:撤消操作。
现在有点纠结。
等我想到方法了再发上来吧。
|