学而实习之 不亦乐乎

Android 中 Bitmap 类 与 Path 类的使用

2023-08-23 07:57:19

一、Path类的应用

在实际应用中我们可以调用 Canvas 的 drawPath() 方法即可绘制图形,为了实现丰富的绘制效果,Android 还定义了一个 PathEffect 系列类(ComposePathEffect, CornerPathEffect, DashPathEffect, DiscretePathEffect, PathDashPathEffect, SumPathEffect)

1、Path类的构造方法

Path();
Path(Path src);

2、Path类的一些常用方法

部分方法    用法说明

public void addArc (RectF oval, float startAngle, float sweepAngle) 绘制弧形路径
public void addCircle (float x, float y, float radius, Path.Direction dir)  绘制圆形路径
public void addOval (RectF oval, Path.Direction dir)    绘制椭圆路径
public void lineTo (float x, float y)   把(x,y)连接到一起成为一条折线
public void moveTo (float x, float y)

二、实例

绘制跟随路径显示的字符串

public class MyPathView extends View {

    final String STR_TITLE="跟随路径显示的字符串";
    Path[] paths=new Path[3];
    Paint paint;

    public MyPathView(Context ctx){
        super(ctx);

        paths[0]=new Path();
        paths[0].moveTo(0,0);
        for(int i=1;i<7;i++){
            //随机生成7个点的Y坐标并将他们炼成一条路径
            paths[0].lineTo(i*30,(float)Math.random()*30);
        }

        paths[1]=new Path();
        RectF rectF=new RectF(0,0,200,120);
        paths[1].addOval(rectF,Path.Direction.CCW);

        paths[2]=new Path();
        paths[2].addArc(rectF,60,180);

        //初始化画笔
        paint=new Paint();
        paint.setAntiAlias(true);
        paint.setColor(Color.GREEN);
        paint.setStrokeWidth(1);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        canvas.drawColor(Color.WHITE);
        canvas.translate(40, 40);

        //从右边开始绘制即右对齐
        paint.setTextAlign(Paint.Align.RIGHT);
        paint.setTextSize(20);

        //绘制路径
        paint.setStyle(Paint.Style.STROKE);
        canvas.drawPath(paths[0], paint);
        paint.setStyle(Paint.Style.FILL);
        canvas.drawTextOnPath(STR_TITLE, paths[0], -8, 20, paint);//沿着路径绘制文字

        //画布下移120
        canvas.translate(0,60);
        paint.setStyle(Paint.Style.STROKE);
        canvas.drawPath(paths[1], paint);
        paint.setStyle(Paint.Style.FILL);
        canvas.drawTextOnPath(STR_TITLE, paths[1], -20,20,paint);

        canvas.translate(0,120);
        paint.setStyle(Paint.Style.STROKE);
        canvas.drawPath(paths[2], paint);
        paint.setStyle(Paint.Style.FILL);
        canvas.drawTextOnPath(STR_TITLE,paths[2],-10,20,paint);
    }
}