Move an Image in circular path in android

后端 未结 1 700
别跟我提以往
别跟我提以往 2020-12-03 09:06

I am having an Image, I wanted to move it in circular path onClick() event of button without animation,

I don\'t know how to do it.. Any help??


1条回答
  •  萌比男神i
    2020-12-03 09:10

    I think you have two options here: either you create a custom animation, or you create your ImageView and then use a surface to draw it along the path yourself.

    The first option is much easier, and will probably give better results given that in the Animation class the timing is handled for you with Interpolators (Linear time, start fast, end normal, etc). I strongly advice you to write the custom animation, as I don't see why you would not want to use the Animation class (animating an image is exactly what you want).

    Edit: I took some time and implemented the following. It's not spotless, but does animate the image in a circular path.

    Activity:

    public class MainActivity extends Activity {
    
        private ImageView image;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            image = (ImageView) findViewById(R.id.image);
    
            image.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Animation anim = new MyAnimation(image, 100);
                    anim.setDuration(3000);
                    image.startAnimation(anim);
                }
            });
        }
    
    }
    

    Animation class:

    public class MyAnimation extends Animation {
    
        private View view;
        private float cx, cy;           // center x,y position of circular path
        private float prevX, prevY;     // previous x,y position of image during animation
        private float r;                // radius of circle
        private float prevDx, prevDy;
    
    
        /**
         * @param view - View that will be animated
         * @param r - radius of circular path
         */
        public MyAnimation(View view, float r){
            this.view = view;
            this.r = r;
        }
    
        @Override
        public boolean willChangeBounds() {
            return true;
        }
    
        @Override
        public void initialize(int width, int height, int parentWidth, int parentHeight) {
            // calculate position of image center
            int cxImage = width / 2;
            int cyImage = height / 2;
            cx = view.getLeft() + cxImage;
            cy = view.getTop() + cyImage;
    
            // set previous position to center
            prevX = cx;
            prevY = cy;
        }
    
        @Override
        protected void applyTransformation(float interpolatedTime, Transformation t) {
            if(interpolatedTime == 0){
                t.getMatrix().setTranslate(prevDx, prevDy);
                return;
            }
    
            float angleDeg = (interpolatedTime * 360f + 90) % 360;
            float angleRad = (float) Math.toRadians(angleDeg);
    
            // r = radius, cx and cy = center point, a = angle (radians)
            float x = (float) (cx + r * Math.cos(angleRad));
            float y = (float) (cy + r * Math.sin(angleRad));
    
    
            float dx = prevX - x;
            float dy = prevY - y;
    
            prevX = x;
            prevY = y;
    
            prevDx = dx;
            prevDy = dy;
    
    
            t.getMatrix().setTranslate(dx, dy);
        }
    }
    

    XML Layout:

    
    
    
        
    
    
    

    You probably need to tweak it here and there to get what you want exactly, but this can be a basis for that.

    0 讨论(0)
提交回复
热议问题