android自定义View创建一个Path绘制多边形,贝塞尔曲线,
2015-09-17 19:34
791 查看
自定义View绘制多变形
1.在绘制多变形中Path非常重要,它可以连接指定点,从而实现绘制多变形的目的。也可以添加圆形路径和弧度路径以及矩形路径,最后调用canvas.drawPath将路径画出来就可以了2.在路径上添加文本需要调用 canvas.drawTextOnPath()方法,第一个参数是文本内容,第二个参数是路径,第三个表示添加文本的起始位置距路径的距离,第四个参数表示的是在路径的上方还是下方,第5个参数是Paint
3.绘制贝塞尔曲线时,有两种方法,一种是Path.quadTo()方法,该方法有四个参数,前两个参数是设置参考点,后两个参数设置终点,在调用该方法之前还应该设置一个起点(Path.moveTo()方法设置起点)。
4.绘制贝塞尔曲线的另一种方法是Path.rQuadTo()方法,该方法是以当前点(无论当前点在哪个位置)为原点重新构建一个坐标系,进行绘制贝塞尔曲线,前两个参数是设置参考点,后两个参数设置终点。同样调用该方法之前还应该设置一个起点‘
代码实现
public class Angle extends View { private int width; private int heigth; private Paint mPaintNormal; private Paint mPaintPoint; private Path mPathRect; private Path mPathCircle; private Path mPathBser; private Path mPathBserLang; public static final int REFRESH=0x55; private int count=0; private Handler handler=new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what){ case REFRESH: count+=5;//count的作用是为了让波浪线动起来 if (count>100) { count = 0; } handler.sendEmptyMessageDelayed(REFRESH,50); invalidate(); break; } } }; public Angle(Context context) { super(context); } public Angle(Context context, AttributeSet attrs) { super(context, attrs); mPaintNormal=new Paint(); mPaintNormal.setColor(Color.BLACK); mPaintNormal.setStyle(Paint.Style.STROKE); mPaintNormal.setAntiAlias(true); mPaintNormal.setTextSize(20); mPaintPoint=new Paint(); mPaintPoint.setColor(Color.BLUE); mPaintPoint.setAntiAlias(true); mPaintPoint.setStyle(Paint.Style.STROKE); mPaintPoint.setStrokeWidth(8); mPathRect=new Path(); mPathCircle=new Path(); mPathBser=new Path(); mPathBserLang=new Path(); handler.sendEmptyMessage(REFRESH); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); width=getDefaultSize(getSuggestedMinimumWidth(), widthMeasureSpec); heigth=getDefaultSize(getSuggestedMinimumHeight(), heightMeasureSpec); setMeasuredDimension(width,heigth); Log.d("length","宽度是"+width); Log.d("length","高度是"+heigth); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); //画一个三角形或者多边形 mPathRect.moveTo(200,0);//起点 mPathRect.lineTo(0,200);//起点到这个点(第二个点) mPathRect.lineTo(300,200);//第二个点到第三个点 mPathRect.close();//效果和mPath.lineTo(200,200);//将最后到达的点和第一个点连接起来 canvas.drawPath(mPathRect,mPaintNormal);//画出路径 //画一个圆 mPathCircle.addCircle(500,120,100, Path.Direction.CCW);//最后一个参数是方向 canvas.drawPath(mPathCircle,mPaintNormal); canvas.drawTextOnPath("在路径上写字",mPathCircle,0,0,mPaintNormal);//在指定的路径上写上文字 //绘制贝塞尔曲线 mPathBser.moveTo(100,350);//设置起点 mPathBser.quadTo(400,100,500,300);//前两个参数是设置参考点,后两个参数是设置结束点 canvas.drawPath(mPathBser,mPaintNormal); canvas.drawPoint(100,400,mPaintPoint);//画点 canvas.drawPoint(400,100,mPaintPoint); canvas.drawPoint(500,300,mPaintPoint); //利用贝塞尔曲线绘制动态波浪 mPathBserLang.reset(); mPathBserLang.moveTo(count,500); //循环绘制波浪线 for (int i=0;i<10;i++) { //这两个绘制贝塞尔曲线会连接成为一个波浪线 mPathBserLang.rQuadTo(20, 6, 50, 0);//rquadTo是按照该点(即count,500这个点)为原点进行绘制操作 mPathBserLang.rQuadTo(20, -6, 50, 0);//上一个绘制完成后的终点,成为该rQuadTo的起点(即原点)重新开始绘制 } canvas.drawPath(mPathBserLang,mPaintNormal); canvas.drawCircle(360,500,60,mPaintPoint); } }
相关文章推荐
- 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的文字
- 深入理解Android的startservice和bindservice
- Activity总结
- Android中GridView使用
- Android Studio中aidl文件生成java文件
- Android Make脚本简记
- Arcgis For Android 实现元素屏幕居中