主Activity类DemoViewPath.java
- packagecom.geolo.android.demoViewPath;
- importandroid.app.Activity;
- importandroid.os.Bundle;
- publicclassDemoViewPathextendsActivity{
- @Override
- protectedvoidonCreate(BundlesavedInstanceState){
- DemoPathdp=newDemoPath(this);
- setContentView(dp);
- super.onCreate(savedInstanceState);
- }
- }
绘图类:DemoPath.java
- packagecom.geolo.android.demoViewPath;
- importandroid.content.Context;
- importandroid.graphics.Bitmap;
- importandroid.graphics.Canvas;
- importandroid.graphics.Paint;
- importandroid.graphics.Path;
- importandroid.view.MotionEvent;
- importandroid.view.View;
- publicclassDemoPathextendsView{
- privatefloatmX,mY;
- privatePathmPath;
- privatePaintmPaint;
- privatestaticfinalfloatTOUCH_TOLERANCE=4;
- privateBitmapmBitmap;
- privateCanvasmCanvas;
- privatePaintmBitmapPaint;
- publicDemoPath(Contextc){
- super(c);
- mPaint=newPaint();//创建画笔渲染对象
- mPaint.setAntiAlias(true);//设置抗锯齿,让绘画比较平滑
- mPaint.setDither(true);//设置递色
- mPaint.setColor(0xFFFF0000);//设置画笔的颜色
- mPaint.setStyle(Paint.Style.STROKE);//画笔的类型有三种(1.FILL2.FILL_AND_STROKE3.STROKE)
- mPaint.setStrokeJoin(Paint.Join.ROUND);//默认类型是MITER(1.BEVEL2.MITER3.ROUND)
- mPaint.setStrokeCap(Paint.Cap.ROUND);//默认类型是BUTT(1.BUTT2.ROUND3.SQUARE)
- mPaint.setStrokeWidth(12);//设置描边的宽度,如果设置的值为0那么边是一条极细的线
- mBitmap=Bitmap.createBitmap(320,480,Bitmap.Config.ARGB_8888);//绘制固定大小的bitmap对象
- mCanvas=newCanvas(mBitmap);//将固定的bitmap对象嵌入到canvas对象中
- mPath=newPath();//创建画笔路径
- mBitmapPaint=newPaint(Paint.DITHER_FLAG);
- }
- @Override
- protectedvoidonDraw(Canvascanvas){
- canvas.drawColor(0xFFAAAAAA);
- canvas.drawBitmap(mBitmap,0,0,mBitmapPaint);
- canvas.drawPath(mPath,mPaint);
- super.onDraw(canvas);
- }
- privatevoidonTouchDown(floatx,floaty){
- mPath.reset();//将上次的路径保存起来,并重置新的路径。
- mPath.moveTo(x,y);//设置新的路径“轮廓”的开始
- mX=x;
- mY=y;
- }
- privatevoidonTouchMove(floatx,floaty){
- floatdx=Math.abs(x-mX);
- floatdy=Math.abs(y-mY);
- if(dx>=TOUCH_TOLERANCE||dy>=TOUCH_TOLERANCE){
- mPath.quadTo(mX,mY,(x+mX)/2,(y+mY)/2);
- mX=x;
- mY=y;
- }
- }
- privatevoidonTouchUp(floatx,floaty){
- mPath.lineTo(mX,mY);//从最后一个指定的xy点绘制一条线,如果没有用moveTo方法,那么起始点表示(0,0)点。
- //committhepathtoouroffscreen
- mCanvas.drawPath(mPath,mPaint);//手指离开屏幕后,绘制创建的“所有”路径。
- //killthissowedon'tdoubledraw
- mPath.reset();
- }
- @Override
- publicbooleanonTouchEvent(MotionEventevent){
- floatx=event.getX();
- floaty=event.getY();
- switch(event.getAction()){
- caseMotionEvent.ACTION_DOWN://手指开始按压屏幕,这个动作包含了初始化位置
- onTouchDown(x,y);
- invalidate();//刷新画布,重新运行onDraw()方法
- break;
- caseMotionEvent.ACTION_MOVE://手指按压屏幕时,位置的改变触发,这个方法在ACTION_DOWN和ACTION_UP之间。
- onTouchMove(x,y);
- invalidate();
- break;
- caseMotionEvent.ACTION_UP://手指离开屏幕,不再按压屏幕
- onTouchUp(x,y);
- invalidate();
- break;
- default:
- break;
- }
- returntrue;
- }
- }
--------------------------------------------------
(1)在我们的应用中,无论绘制什么图形,我们只用到一个画笔。(如果我们将画笔的颜色设置为蓝色,我们画出的矩形、椭圆都将是蓝色的。)
(2)我们需要对画笔进行设置,然后所绘制的图形随之改变,而我们又不想在图形类的draw方法中“new”。
所以,我们需要应用单例模式,保证在我们的应用中只存在一个唯一的画笔实例。
单例画笔类Brush的源码如下:
- packageorg.vhow.paintpad.tools;
- importandroid.graphics.Paint;
- /**
- *UseSingletonmodetocreateBrushclass
- */
- publicclassBrushextendsPaint
- {
- /**
- *Generatetheinstancewhentheclassisloaded
- */
- privatestaticBrushbrush=newBrush();
- /**
- *Maketheconstructorprivate,tostopotherstocreateinstancebythe
- *defaultconstructor
- */
- privateBrush()
- {
- }
- /**
- *Provideastaticmethodthatcanbeaccessbyothers.
- *
- *@returnthesingleinstance
- */
- publicstaticBrushgetPen()
- {
- returnbrush;
- }
- /**
- *resetthebrush
- */
- publicvoidreset()
- {
- brush.setAntiAlias(true);
- brush.setDither(true);
- brush.setColor(0xFF000000);
- brush.setStyle(Paint.Style.STROKE);
- brush.setStrokeJoin(Paint.Join.ROUND);
- brush.setStrokeCap(Paint.Cap.ROUND);
- brush.setStrokeWidth(2);
- }
- }