您的位置:首页 > 移动开发 > Android开发

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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: