android で線を引くようなアニメーションを行う方法について
リポジトリはこちらですgithub.com
とりあえず今回は四角形を描きます
public class PathAnimationView extends View { private Path mPath; private PathMeasure mMeasure; public PathAnimationView(Context context) { super(context); init(); } public PathAnimationView(Context context, AttributeSet attrs) { super(context, attrs); init(); } public PathAnimationView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } private void init() { Path path = new Path(); path.moveTo(50, 50); path.lineTo(50, 100); path.lineTo(100, 100); path.lineTo(100, 50); path.lineTo(50, 50); mPath = path; } }
あとで path の長さを取得して animation させるので、ここで pathMeasure に path をセットしておきます
また、 Lollipop より低い version の場合、正常に描画されない場合があるので、Hardware Acceleration を切ります
private void init() { Path path = new Path(); path.moveTo(50, 50); path.lineTo(50, 100); path.lineTo(100, 100); path.lineTo(100, 50); path.lineTo(50, 50); PathMeasure measure = new PathMeasure(); measure.setPath(path, false); if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { setLayerType(View.LAYER_TYPE_SOFTWARE, null); } mPath = path; mMeasure = measure; }
onDraw の中身は普通に描画する場合と特に変わりません
objectAnimator を使って、0.0-1.0 までの各地点で path を切り出してそれを描画します
@Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); Paint paint = new Paint(); paint.setAntiAlias(true); paint.setColor(getResources().getColor(android.R.color.black)); paint.setStrokeWidth(5); paint.setStyle(Paint.Style.STROKE); canvas.drawPath(mPath, paint); }
objectAnimator の部分
private void setProgress(float progress) { mPath.reset(); mMeasure.getSegment(0.0f, mMeasure.getLength() * progress, mPath, true); invalidate(); } public void startAnimation() { ObjectAnimator animator = ObjectAnimator.ofFloat(this, "progress", 0.0f, 1.0f); animator.setDuration(5000); animator.start(); }
あとはこの view を追加して startAnimation() を呼び出す