是否可以将动画师附加到路径?有没有其他方法在画布上绘制动画线条?在我发布之前我搜索了这个,但没有任何关于这一点.在这里和这里的另外两个帖子有解决方案,并不适合我.
我在onDraw方法中发布我的代码以指定我想要的内容.
paint.setStyle(Paint.Style.STROKE); paint.setStrokeWidth(2); paint.setColor(Color.BLACK); Path path = new Path(); path.moveTo(10, 50); // THIS TRANSFORMATIONS TO BE ANIMATED!!!!!!!! path.lineTo(40, 50); path.moveTo(40, 50); path.lineTo(50, 40); // and so on... canvas.drawPath(path, paint);
有任何想法吗????
您可以按时间转换画布,即:
class MyView extends View { int framesPerSecond = 60; long animationDuration = 10000; // 10 seconds Matrix matrix = new Matrix(); // transformation matrix Path path = new Path(); // your path Paint paint = new Paint(); // your paint long startTime; public MyView(Context context) { super(context); // start the animation: this.startTime = System.currentTimeMillis(); this.postInvalidate(); } @Override protected void onDraw(Canvas canvas) { long elapsedTime = System.currentTimeMillis() - startTime; matrix.postRotate(30 * elapsedTime/1000); // rotate 30° every second matrix.postTranslate(100 * elapsedTime/1000, 0); // move 100 pixels to the right // other transformations... canvas.concat(matrix); // call this before drawing on the canvas!! canvas.drawPath(path, paint); // draw on canvas if(elapsedTime < animationDuration) this.postInvalidateDelayed( 1000 / framesPerSecond); } }
试试这个:
class PathDrawable extends Drawable implements AnimatorUpdateListener { private Path mPath; private Paint mPaint; private ValueAnimator mAnimator; public PathDrawable() { mPath = new Path(); mPaint = new Paint(); mPaint.setColor(0xffffffff); mPaint.setStrokeWidth(5); mPaint.setStyle(Style.STROKE); } public void startAnimating() { Rect b = getBounds(); mAnimator = ValueAnimator.ofInt(-b.bottom, b.bottom); mAnimator.setDuration(1000); mAnimator.addUpdateListener(this); mAnimator.start(); } @Override public void draw(Canvas canvas) { canvas.drawPath(mPath, mPaint); } @Override public void setAlpha(int alpha) { } @Override public void setColorFilter(ColorFilter cf) { } @Override public int getOpacity() { return PixelFormat.TRANSLUCENT; } @Override public void onAnimationUpdate(ValueAnimator animator) { mPath.reset(); Rect b = getBounds(); mPath.moveTo(b.left, b.bottom); mPath.quadTo((b.right-b.left)/2, (Integer) animator.getAnimatedValue(), b.right, b.bottom); invalidateSelf(); } }
测试它添加你的onCreate方法:
TextView view = new TextView(this); view.setText("click me"); view.setTextColor(0xffcccccc); view.setGravity(Gravity.CENTER); view.setTextSize(48); final PathDrawable d = new PathDrawable(); view.setBackgroundDrawable(d); OnClickListener l = new OnClickListener() { @Override public void onClick(View v) { d.startAnimating(); } }; view.setOnClickListener(l); setContentView(view);