理论学习了 Android Path 类之后,对 Path 类的属性方法都有所了解,写两个例子实践一下。理论与实践结合嘛。
实例1,五环 + 文字:
源码:
package com.example.pathstudy; import android.app.Activity; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Path; import android.os.Bundle; import android.view.View; public class PathStudyActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(new PathStudyView(getApplicationContext())); } private class PathStudyView extends View { public PathStudyView(Context context) { super(context); // TODO Auto-generated constructor stub } @Override protected void onDraw(Canvas canvas) { // TODO Auto-generated method stub // super.onDraw(canvas); canvas.drawColor(Color.WHITE); Paint mPaint = new Paint(); mPaint.setStyle(Paint.Style.STROKE); mPaint.setStrokeWidth(20); int originX = 0; int originY = 0; int offsetX = 0; int offsetY = 0; int offsetLengthX = 240; int offsetLengthY = 110; float circleX = 150; float circleY = 200; float radius = 100; // first circle mPaint.setColor(Color.BLUE); Path mPath = new Path(); mPath.addPath(getDrawCirclePath(circleX, circleY, radius)); canvas.drawPath(mPath, mPaint); // second circle mPaint.setColor(Color.BLACK); canvas.save(); offsetX = originX + offsetLengthX; canvas.translate(offsetX, offsetY); mPath.reset(); mPath.addPath(getDrawCirclePath(circleX, circleY, radius)); canvas.drawPath(mPath, mPaint); canvas.restore(); // thid circle mPaint.setColor(Color.RED); canvas.save(); offsetX += offsetLengthX; canvas.translate(offsetX, offsetY); mPath.reset(); mPath.addPath(getDrawCirclePath(circleX, circleY, radius)); canvas.drawPath(mPath, mPaint); canvas.restore(); // forth circle mPaint.setColor(Color.YELLOW); canvas.save(); offsetX = originX + offsetLengthX / 2; offsetY = originY + offsetLengthY; canvas.translate(offsetX, offsetY); mPath.reset(); mPath.addPath(getDrawCirclePath(circleX, circleY, radius)); canvas.drawPath(mPath, mPaint); canvas.restore(); // fifth circle mPaint.setColor(Color.GREEN); canvas.save(); offsetX += offsetLengthX; canvas.translate(offsetX, offsetY); mPath.reset(); mPath.addPath(getDrawCirclePath(circleX, circleY, radius)); canvas.drawPath(mPath, mPaint); canvas.restore(); // draw text kevinems.com // fifth circle mPaint.setColor(Color.BLACK); mPaint.setStyle(Paint.Style.FILL); mPaint.setTextSize(100); mPaint.setStrokeWidth(5); String websiteStr = "kevinems.com"; canvas.drawText(websiteStr, 110, 500, mPaint); canvas.restore(); } private Path getDrawCirclePath(float x, float y, float radius) { Path mPath = new Path(); mPath.setFillType(Path.FillType.EVEN_ODD); mPath.addCircle(x, y, radius, Path.Direction.CCW); return mPath; } } }
实例2,可以随意绘画 path 的手写板:
源码:
package com.example.view; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Path; import android.util.Log; import android.view.MotionEvent; import android.view.View; public class PathView extends View { private static final String LOG_TAG = "PathView"; private Path mPath; private Paint mPaint; private float mPosX; private float mPosY; public PathView(Context context) { super(context); // TODO Auto-generated constructor stub init(); } private void init() { // TODO Auto-generated method stub mPath = new Path(); mPaint = new Paint(); mPaint.setColor(Color.GREEN); mPaint.setStyle(Paint.Style.STROKE); mPaint.setStrokeWidth(5); } @Override protected void onDraw(Canvas canvas) { // TODO Auto-generated method stub // super.onDraw(canvas); Log.i(LOG_TAG, "onDraw"); canvas.drawColor(Color.WHITE); canvas.drawPath(mPath, mPaint); } @Override public boolean onTouchEvent(MotionEvent event) { // TODO Auto-generated method stub // return super.onTouchEvent(event); int action = event.getAction(); float x = event.getX(); float y = event.getY(); switch (action) { case MotionEvent.ACTION_DOWN: mPath.moveTo(x, y); break; case MotionEvent.ACTION_MOVE: mPath.quadTo(mPosX, mPosY, x, y); invalidate(); break; default: break; } mPosX = x; mPosY = y; return true; } }