Android 使用贝塞尔和PathMeasure绘画心形路径

来源:互联网 发布:淘宝美工的营销手段 编辑:程序博客网 时间:2024/05/21 09:19

效果图如下:

有时候我们需要绘画一些复杂的路径,就需要用到贝塞尔曲线

同时,我们希望展示绘画过程,就需要用到PathMeasure

下面就是一个简单的例子。

public class HeartView extends View {    public HeartView(Context context) {        super(context);    }    private Paint paint;    private ValueAnimator av;    private float mLength;    private PathMeasure pm;    private Path mPath;    public HeartView(Context context, @Nullable AttributeSet attrs) {        super(context, attrs);        init();    }    private void init() {        paint =new Paint(Paint.ANTI_ALIAS_FLAG);        paint.setColor(Color.BLUE);        paint.setStyle(Paint.Style.STROKE);        paint.setStrokeWidth(5);        //-------------这里是绘制心形,大家可以自己画任何曲线---------------------------        mPath = new Path();        mPath.moveTo(396-50,313);        mPath.cubicTo(207-50,114, 339-50,46, 396-50,111);        mPath.cubicTo(453-50, 46,585-50, 114,396-50,313);        //----------------------------------------------        pm =new PathMeasure(mPath,false);//false表示是否强制闭合路径                av = ValueAnimator.ofFloat(0,pm.getLength());        av.setDuration(5000);        av.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {            @Override            public void onAnimationUpdate(ValueAnimator animation) {                mLength= (float) animation.getAnimatedValue();                invalidate();            }        });    }    @Override    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {        super.onMeasure(widthMeasureSpec, heightMeasureSpec);    }    public HeartView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);    }    @Override    protected void onDraw(Canvas canvas) {        super.onDraw(canvas);        canvas.save();        Path path = new Path();        //path.reset();        //这里需要lineTo才会绘画图像,据说是openGl的一个BUG        path.lineTo(0,0);        //这个方法的意思是取路径片段,0是指从头截取,mLength是指截取的长度        pm.getSegment(0,mLength,path,true);        canvas.drawPath(path,paint);       // canvas.drawPath(mPath,paint);        canvas.restore();    }    public void start() {        av.start();    }}

简单明了,就不多做解释咯。



---仅作备份,方便以后查阅--

原创粉丝点击