Android view circular motion (counterclockwise and clockwise rotation)

Turn counterclockwise

thought

Customize Animation, define the radius by yourself, which is equivalent to the position of the original control as (0,0), calculate the new position according to each angle interval, and change with time
legend

Turn counterclockwise

public class VenusCircleAnimation extends Animation {
    
    

    private int radii;
    public VenusCircleAnimation(int radii) {
    
    
        this.radii = radii;
    }

    @Override
    protected void applyTransformation(float interpolatedTime, Transformation t) {
    
    
        //根据取值范围 确定圆周运动的角度范围。360-0
        float d = 360 * interpolatedTime;//interpolatedTime 取值范围 0-1,表示时间
        if (d > 360) {
    
     //算法二
            d = d-360;
        }
        int[] ps = getNewLocation((int) d, radii);//
        t.getMatrix().setTranslate(ps[0], ps[1]);
    }

    public int[] getNewLocation(int newAngle, int r) {
    
    
        int newAngle1;
        int newX = 0, newY = 0;
        if (newAngle >= 0 && newAngle <= 90) {
    
    
            // Math.PI/180得到的结果就是1°,然后再乘以角度得到角度
            newX = (int) ( - (r * Math.cos(newAngle * Math.PI / 180)));
            newY = (int) (r * Math.sin(newAngle * Math.PI / 180));
        } else if (newAngle >= 90 && newAngle <= 180) {
    
    // 90-180
            newAngle1 = 180 - newAngle;
            newX = (int)  (r * Math.cos(newAngle1 * Math.PI / 180));
            newY = (int)  (r * Math.sin(newAngle1 * Math.PI / 180));
        } else if (newAngle >= 180 && newAngle <= 270) {
    
    //180-270
            newAngle1 = 270 - newAngle;
            newX = (int)  (r * Math.sin(newAngle1 * Math.PI / 180));
            newY = (int) ( - (r * Math.cos(newAngle1 * Math.PI / 180)));
        } else if (newAngle >= 270) {
    
    //270-360
            newAngle1 = 360 - newAngle;
            newX = (int) ( - (r * Math.cos(newAngle1 * Math.PI / 180)));
            newY = (int) ( - (r * Math.sin(newAngle1 * Math.PI / 180)));
        }
        return new int[]{
    
    newX, newY};
    }

}

Clockwise

public class CircleAnimation extends Animation {
    
    

    private int radii;

    public CircleAnimation(int radii) {
    
    
        this.radii = radii;
    }

    @Override
    protected void applyTransformation(float interpolatedTime, Transformation t) {
    
    
        float d = 360 * interpolatedTime ;
        if (d > 360) {
    
    
            d = d - 360;
        }
        int[] ps = getNewLocation((int) d, radii);//
        t.getMatrix().setTranslate(ps[0], ps[1]);
    }


    public int[] getNewLocation(int newAngle, int r) {
    
    
        int newAngle1;
        int newX = 0, newY = 0;
        if (newAngle >= 0 && newAngle <= 90) {
    
    
            newX = (int)  (r * Math.sin(newAngle * Math.PI / 180));
            newY = (int) ( - (r * Math.cos(newAngle * Math.PI / 180)));
        } else if (newAngle >= 90 && newAngle <= 180) {
    
    // 90-180
            newAngle1 = 180 - newAngle;
            newX = (int)  (r * Math.sin(newAngle1 * Math.PI / 180));
            newY = (int)  (r * Math.cos(newAngle1 * Math.PI / 180));
        } else if (newAngle >= 180 && newAngle <= 270) {
    
    //180-270
            newAngle1 = 270 - newAngle;
            newX = (int) ( - (r * Math.cos(newAngle1 * Math.PI / 180)));
            newY = (int)  (r * Math.sin(newAngle1 * Math.PI / 180));
        } else if (newAngle >= 270 && newAngle <= 360) {
    
    //270-360
            newAngle1 = 360 - newAngle;
            newX = (int) ( - (r * Math.sin(newAngle1 * Math.PI / 180)));
            newY = (int) ( - (r * Math.cos(newAngle1 * Math.PI / 180)));
        }
        return new int[]{
    
    newX, newY};
    }
}

use

		CircleAnimation animationw = new CircleAnimation(m);
        animationw.setDuration(d);
        animationw.setRepeatCount(-1);
        animationw.setInterpolator(new LinearInterpolator());
        imageView.startAnimation(animationw);

Guess you like

Origin blog.csdn.net/yabayaoya/article/details/115027010