用path画一个抽象的树叶
来源:互联网 发布:格罗宁根汉斯大学 知乎 编辑:程序博客网 时间:2024/06/08 15:45
源码地址:https://github.com/X-FAN/LeafView
只是个简单的demo,大家可以参考下
public class PathTestView extends View { private int mWidth; private int mHeight; private int mDuration = 5000; private int mState = 0;//当前状态; private float mFraction; private Paint mPaint; private PathMeasure mPathMeasure; private PathMeasure mPathMeasureLeft; private PathMeasure mPathMeasureRight; private ValueAnimator mAnimator; public PathTestView(Context context) { this(context, null); } public PathTestView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public PathTestView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); initPaint(); initPathAndMeasure(); initAnimator(); } private void initPaint() { mPaint = new Paint(); mPaint.setStrokeWidth(10); mPaint.setStyle(Paint.Style.STROKE); mPaint.setColor(Color.WHITE); } private void initPathAndMeasure() { Path mPathLine = new Path(); Path mPathLeft = new Path(); Path mPathRight = new Path(); mPathLine.lineTo(0, 400); mPathMeasure = new PathMeasure(mPathLine, false); mPathLeft.quadTo(-200, 200, 0, 400);//画贝赛尔曲线 mPathMeasureLeft = new PathMeasure(mPathLeft, false); mPathRight.quadTo(200, 200, 0, 400); mPathMeasureRight = new PathMeasure(mPathRight, false); } private void initAnimator() { mAnimator = ValueAnimator.ofFloat(0f, 1.0f); mAnimator.setDuration(mDuration); mAnimator.setInterpolator(new DecelerateInterpolator()); mAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { mFraction = (float) animation.getAnimatedValue(); invalidate(); } }); mAnimator.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { if (mState < 3) {//更改状态 mState++; } else { mState = 0; } mAnimator = mAnimator.clone();//本来想直接复用mAnimator,但是执行到onAnimationEnd,mAnimator貌似没有立即结束,直接start会有问题, mAnimator.start(); //问题待研究,若有知道具体原因的望告知 } }); mAnimator.start(); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); mWidth = w; mHeight = h; } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.translate(mWidth / 2, mHeight / 2);// 将画布坐标原点移动到中心位置 canvas.scale(1, -1);//翻转y轴 canvas.save(); drawLine(canvas); drawLeaf(canvas); canvas.restore(); } /** * 画叶子的边界 * * @param canvas */ private void drawLeaf(Canvas canvas) { Path dst = new Path(); Path dstRight = new Path(); switch (mState) { case 0: mPathMeasureLeft.getSegment(0, mPathMeasureLeft.getLength() * mFraction, dst, true);//取出要绘制部分的path mPathMeasureRight.getSegment(0, mPathMeasureRight.getLength() * mFraction, dstRight, true); break; case 1: mPathMeasureLeft.getSegment(mPathMeasureLeft.getLength() * mFraction, mPathMeasureLeft.getLength(), dst, true);//取出要绘制部分的path mPathMeasureRight.getSegment(mPathMeasureRight.getLength() * mFraction, mPathMeasureRight.getLength(), dstRight, true); break; case 2: mPathMeasureLeft.getSegment(mPathMeasureLeft.getLength() * (1 - mFraction), mPathMeasureLeft.getLength(), dst, true);//取出要绘制部分的path mPathMeasureRight.getSegment(mPathMeasureRight.getLength() * (1 - mFraction), mPathMeasureRight.getLength(), dstRight, true); break; case 3: mPathMeasureLeft.getSegment(0, mPathMeasureLeft.getLength() * (1 - mFraction), dst, true);//取出要绘制部分的path mPathMeasureRight.getSegment(0, mPathMeasureRight.getLength() * (1 - mFraction), dstRight, true); break; default: break; } canvas.drawPath(dst, mPaint); canvas.drawPath(dstRight, mPaint); } /** * 画主干 */ private void drawLine(Canvas canvas) { Path dst = new Path(); switch (mState) { case 0: mPathMeasure.getSegment(0, mPathMeasure.getLength() * mFraction, dst, true); break; case 1: mPathMeasure.getSegment(mPathMeasure.getLength() * mFraction, mPathMeasure.getLength(), dst, true); break; case 2: mPathMeasure.getSegment(mPathMeasure.getLength() * (1 - mFraction), mPathMeasure.getLength(), dst, true); break; case 3: mPathMeasure.getSegment(0, mPathMeasure.getLength() * (1 - mFraction), dst, true); break; default: break; } canvas.drawPath(dst, mPaint); }}
效果图
0 0
- 用path画一个抽象的树叶
- 扫树叶的小和尚
- 扫树叶的小和尚
- 下落的树叶
- ps树叶的雕刻
- 【JSOI2016】独特的树叶
- 例题:下落的树叶
- 用coreldraw设计树叶
- 编程画出千姿百态的树叶
- 两片树叶的爱情
- 被季节遗弃的树叶
- JZOJ4513. 【JSOI2016】独特的树叶
- 下落的树叶,紫书P159UVa699
- 将二叉树叶子节点用rchild链成一个单链表
- 为生命画一片树叶
- 为生命画一片树叶
- 为生命画一片树叶
- 一个PATH引出的问题
- Unreal 制作一个类场景交互物
- 主机windows虚拟机vmware ubuntu共享文件夹
- 【JZOJ4747】【NOIP2016提高A组模拟9.3】被粉碎的线段树
- 集成友盟分享的时候,其中微博分享,如果没有添加测试账号,就会出现{error userinfo error pos 5}的错误
- angularjs
- 用path画一个抽象的树叶
- eclipse运行java.lang.OutOfMemoryError: PermGen space解决方法
- 使用Spring Security实现权限管理
- 1-8 内存的概念、分类、初始化方法
- Android中自动跳转到系统设置界面
- http://blog.csdn.net/wjzdmr/article/details/39050839
- APP开发中获取当前天气
- LeetCode解题报告 6. ZigZag Conversion[easy]
- 解决SwipeRefreshLayout左右滑动事件冲突的问题