如何在android

时间:2015-11-03 06:21:01

标签: android user-interface animation android-animation user-experience

This看到Dribbble,它似乎就像一些SVG的东西,它很酷,我喜欢它!所以这是我的问题:

如何使用60 FPS在Android中制作这个动画?

如果有一个地方我可以在没有IMAGE文件的情况下做到这一点?

谢谢!

1 个答案:

答案 0 :(得分:0)

请你试试下面的代码可能会有效。

   public class MyButton extends Button {

            private float mDownX;
            private float mDownY;

            private float mRadius;

            private Paint mPaint;
            private Path mPath = new Path();
            private Path mPath2 = new Path();

            public MyButton(final Context context) {
                super(context);
                init();
            }

            public MyButton(final Context context, final AttributeSet attrs) {
                super(context, attrs);
                init();
            }

            public MyButton(final Context context, final AttributeSet attrs,
                            final int defStyle) {
                super(context, attrs, defStyle);
                init();
            }

            private void init() {
                mPaint = new Paint();
                mPaint.setAlpha(100);
            }

            @Override
            public boolean onTouchEvent(@NonNull final MotionEvent event) {
                if (event.getActionMasked() == MotionEvent.ACTION_UP) {
                    mDownX = event.getX();
                    mDownY = event.getY();

                    ObjectAnimator animator = ObjectAnimator.ofFloat(this,
                            "radius", 0, getWidth() * 3.0f);
                    animator.setInterpolator(new AccelerateInterpolator());
                    animator.setDuration(400);
                    animator.start();
                }
                return super.onTouchEvent(event);
            }

            public void setRadius(final float radius) {
                mRadius = radius;
                if (mRadius > 0) {
                    RadialGradient radialGradient = new RadialGradient(mDownX,
                            mDownY, mRadius * 3, Color.TRANSPARENT, Color.BLACK,
                            Shader.TileMode.MIRROR);
                    mPaint.setShader(radialGradient);
                }
                invalidate();
            }

            @Override
            protected void onDraw(@NonNull final Canvas canvas) {
                super.onDraw(canvas);

                mPath2.reset();
                mPath2.addCircle(mDownX, mDownY, mRadius, Path.Direction.CW);

                canvas.clipPath(mPath2);

                mPath.reset();
                mPath.addCircle(mDownX, mDownY, mRadius / 3, Path.Direction.CW);

                canvas.clipPath(mPath, Region.Op.DIFFERENCE);

                canvas.drawCircle(mDownX, mDownY, mRadius, mPaint);
            }
        }