Android自定义View之图形图像工具类Path的特殊用法
2015-09-17 19:53
591 查看
概述:
没什么好说的。Demo
新建一个自定义Viewpublic class MyPathView extends View { private int width; private int height; private Paint mPaint; private Path mPath; private Paint mPaintPoint; private Paint mPaintText; private boolean isAdd = true; public MyPathView(Context context) { super(context); } public MyPathView(Context context, AttributeSet attrs) { super(context, attrs); mPaint = new Paint(); mPaint.setColor(Color.GREEN); mPaint.setStyle(Paint.Style.STROKE); mPaint.setTextSize(50); mPaint.setAntiAlias(true); mPaintPoint = new Paint(); mPaintPoint.setAntiAlias(true); mPaintPoint.setColor(Color.RED); mPaintPoint.setStyle(Paint.Style.STROKE); //mPaintPoint.setStrokeWidth(10); mPaintText = new Paint(); mPaintText.setAntiAlias(true); mPaintText.setColor(Color.BLACK); mPaintText.setTextAlign(Paint.Align.CENTER); mPaintText.setTextSize(20); mPath = new Path(); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); width = getDefaultSize(getSuggestedMinimumWidth(),widthMeasureSpec); height = getDefaultSize(getSuggestedMinimumHeight(),heightMeasureSpec); setMeasuredDimension(width,height); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); //画一个三角形 mPath.moveTo(100, 100);//起始位置 mPath.lineTo(0, 200);//从起始位置移动到此位置 mPath.lineTo(200, 200);//从上一位置移动到下一位置 mPath.close();//前面只画了两条边,调用close()可以让三角形自动闭合 canvas.drawPath(mPath, mPaint);//把path经历的轨迹画出来 } }
画一个圆,沿着圆写一段文字,修改onDraw()方法:
/*画一个圆,并沿着圆写一段文字*/ //参数依次为:圆心x坐标,圆心y坐标,圆的半径,CW顺时针(CCW逆时针)方向 mPath.addCircle(width / 2, height / 2, 300, Path.Direction.CW); canvas.drawPath(mPath, mPaint); //沿着path的轨迹写一段文字 canvas.drawTextOnPath("我要沿着圆形写文字", mPath, 0, 0, mPaint); canvas.drawPath(mPath, mPaint);
演示结果:
贝塞尔曲线:
贝塞尔曲线也可以叫做贝济埃曲线或者贝兹曲线,它由线段与节点组成,节点是可拖动的支点,线段像可伸缩的皮筋。一般的矢量图形软件常利用贝塞尔曲线来精确画出曲线。
Android提供的贝塞尔曲线绘制接口
在Android开发中,要实现贝塞尔曲线其实还是很简单的,因为Android已经给我们提供了相关接口,但此接口方法,藏于Path类中(android.graphics.Path)。此方法如下: quadTo(float x1, float y1, float x2, float y2) Since: API Level 1 参数说明: x1:操作点的x坐标 y1:操作点的y坐标 x2:结束点的x坐标 y2:结束点的y坐标
mPath.moveTo(100, 100); //画一条贝塞尔曲线,参数依次为:控制点的x坐标,控制点的y坐标,结束点的x坐标,结束点的y坐标 mPath.quadTo(100, 400, 300, 300); canvas.drawPath(mPath, mPaint); canvas.drawPoint(100, 100, mPaintPoint); canvas.drawPoint(100, 400, mPaintPoint); canvas.drawPoint(300, 300, mPaintPoint); //会出以上贝塞尔曲线的起始点、控制点、结束点 canvas.drawText("起始点", 100, 100, mPaintText); canvas.drawText("控制点", 100, 400, mPaintText); canvas.drawText("结束点", 300, 300, mPaintText);
演示结果:
用path绘制动态贝塞尔曲线——模拟水面:
public class MyPathView extends View { private int width; private int height; private Paint mPaint; private Path mPath; private Paint mPaintPoint; private Paint mPaintText; private int size = 0; private int count; private boolean isAdd = true; private static final int START_W***E = 0x21; private Handler handler = new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what){ case START_W***E: count+=5; if(count>=80){ count=0; } if (isAdd){ size++; if(size>10){ isAdd = false; } }else{ size--; if(size<=-10){ isAdd =true; } } invalidate(); sendEmptyMessageDelayed(START_W***E,100); break; } } }; public MyPathView(Context context) { super(context); } public MyPathView(Context context, AttributeSet attrs) { super(context, attrs); mPaint = new Paint(); mPaint.setColor(Color.GREEN); mPaint.setStyle(Paint.Style.STROKE); mPaint.setTextSize(50); mPaint.setAntiAlias(true); mPaintPoint = new Paint(); mPaintPoint.setAntiAlias(true); mPaintPoint.setColor(Color.RED); mPaintPoint.setStyle(Paint.Style.STROKE); //mPaintPoint.setStrokeWidth(10); mPaintText = new Paint(); mPaintText.setAntiAlias(true); mPaintText.setColor(Color.BLACK); mPaintText.setTextAlign(Paint.Align.CENTER); mPaintText.setTextSize(20); mPath = new Path(); handler.sendEmptyMessageDelayed(START_W***E,1000); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); width = getDefaultSize(getSuggestedMinimumWidth(),widthMeasureSpec); height = getDefaultSize(getSuggestedMinimumHeight(),heightMeasureSpec); setMeasuredDimension(width,height); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); /* 画一条个模拟流动的波浪 */ mPath.reset(); //当count增大时,重绘会显示向前流动效果 mPath.moveTo(count, 200); //size的从大到小从小到大变化,重绘时会产生波浪起伏效果 for(int i=0;i<10;i++) { /* rQuadTo()方法每次都会自动移动到下一位置,参数依次为水平幅度, 垂直幅度,水平位移,处置位移 */ mPath.rQuadTo(20, size, 40, 0); mPath.rQuadTo(20, -size, 40, 0); } canvas.drawPath(mPath,mPaintPoint); canvas.drawCircle(width / 2, 200, 100, mPaint); } }
结果演示:
相关文章推荐
- Android图片加载优化--图片缓存
- Android 笔记8
- Android下使用全局变量
- Android5.0源码开发之launcher切换语言后Folder和ShortcutT没有切换到当前语言
- Android开发环境的演变
- android自定义View创建一个Path绘制多边形,贝塞尔曲线,
- Activity显示关闭动画
- android异步加载AsyncTask
- Caused by: android.view.InflateException: Binary XML file line #11: Error inflating class android-su
- Android设备唯一性判断
- Android文字自动横向滚动的TextView(文字长度不够也可以)
- Android推荐书目文章(实时更新....)
- 【转】android fragment 博客 学习
- android 开发环境
- Android0917<二十一>(自定义的View、绘制简单图形、Bitmap)(二)
- Arcgis For Android实现比例尺
- Android-ListActivity单击事件的响应
- Android 自定义View——Path的使用
- iOS中objecive-c语言和android中java语言的区别
- Android自由选择TextView的文字