/////////繼承SurfaceView 的類
public class PaintView extends SurfaceView implements Runnable,SurfaceHolder.Callback {
private float mX;
private float mY;
private Paint mPaint = null;
private Path mPath = null;
// 線程結束標誌位
boolean mLoop = true;
SurfaceHolder mSurfaceHolder = null;
Canvas mCanvas;
public PaintView(Context context, AttributeSet arr) {
super(context , arr);
mSurfaceHolder = this.getHolder();//獲取holder
mSurfaceHolder.addCallback(this);
mSurfaceHolder.setFormat(PixelFormat.OPAQUE);//不透明
//mSurfaceHolder.setFormat(PixelFormat.RGB_565);
//mSurfaceHolder.setFormat(PixelFormat.RGBA_8888);
this.setFocusable(true);
// setZOrderOnTop(true);//放到最頂層
mPaint = new Paint();
mPath = new Path();
mPaint.setAntiAlias(true);
mPaint.setStyle(Style.STROKE);
mPaint.setStrokeWidth(5);
mPaint.setColor(mPaintColor);
mPaint.setStrokeCap(Paint.Cap.ROUND); //圓頭
mPaint.setDither(true);//消除拉動,使畫面圓滑
mPaint.setStrokeJoin(Paint.Join.ROUND); //結合方式,平滑
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
// TODO Auto-generated method stub
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
// TODO Auto-generated method stub
new Thread(this).start();//啓動線程
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
mLoop = false; //結束線程
}
@Override
public void run() {
while (mLoop==true) {
Draw();
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
// 繪圖
private void Draw() {
try{
mCanvas = mSurfaceHolder.lockCanvas();
mCanvas.drawPath(mPath, mPaint); ////
}catch (Exception e){
}finally {
if (mCanvas !=null) {
mSurfaceHolder.unlockCanvasAndPost(mCanvas);
}
}
}
@Override
public boolean onTouchEvent(MotionEvent event)
{
switch (event.getAction())
{
case MotionEvent.ACTION_DOWN:
touchDown(event);
break;
case MotionEvent.ACTION_MOVE:
touchMove(event);
}
//更新繪製
invalidate();
return true;
}
//手指點下屏幕時調用
private void touchDown(MotionEvent event)
{
//隱藏之前的繪製
// mPath.reset(); //
float x = event.getX();
float y = event.getY();
mX = x;
mY = y;
//mPath繪製的繪製起點
mPath.moveTo(x, y);
}
//手指在屏幕上滑動時調用
private void touchMove(MotionEvent event)
{
final float x = event.getX();
final float y = event.getY();
final float previousX = mX;
final float previousY = mY;
final float dx = Math.abs(x - previousX);
final float dy = Math.abs(y - previousY);
//兩點之間的距離大於等於3時,生成貝塞爾繪製曲線
if (dx >= 3 || dy >= 3)
{
//設置貝塞爾曲線的操作點爲起點和終點的一半
float cX = (x + previousX) / 2;
float cY = (y + previousY) / 2;
//二次貝塞爾,實現平滑曲線;previousX, previousY爲操作點,cX, cY爲終點
mPath.quadTo(previousX, previousY, cX, cY);
//第二次執行時,第一次結束調用的座標值將作爲第二次調用的初始座標值
mX = x;
mY = y;
}
}
////橡皮擦
private void setEraser(){
mPaint = new Paint();
mPath = new Path();
mPaint.setAntiAlias(true);
mPaint.setStyle(Style.STROKE);
mPaint.setStrokeWidth(50);
// mPaint.setColor(mPaintColor);
mPaint.setStrokeCap(Paint.Cap.ROUND); //圓頭
mPaint.setDither(true);//消除拉動,使畫面圓滑
mPaint.setStrokeJoin(Paint.Join.ROUND); //結合方式,平滑
mPaint.setAlpha(0); ////
mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
}
}
////////在Activity中顯示以上視圖
setContentView(new PaintView(this));
用SurfaceView實現的畫板,書寫和擦除
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.