Rotating image. Animation list or animated rotate? (Android)

前端 未结 6 789
甜味超标
甜味超标 2020-11-30 21:17

I want to create a rotating progress image, and wonder what\'s the best way to proceed. I can make it work with an animation list with for example 12 images changing every 1

6条回答
  •  情深已故
    2020-11-30 21:56

    Rotate drawable suggested by Praveen won't give you control of frame count. Let's assume you want to implement a custom loader which consists from 8 sections:

    gif_icon

    Using animation-list approach, you need to create 8 frames rotated by 45*frameNumber degrees manually. Alternatively, you can use 1st frame and set rotation animation to it:

    progress_icon

    File res/anim/progress_anim.xml:

    
    
    

    File MainActivity.java

    Animation a = AnimationUtils.loadAnimation(getContext(), R.anim.progress_anim);
    a.setDuration(1000);
    imageView.startAnimation(a);
    

    This will give you smooth animation instead of 8-stepped. To fix this we need to implement custom interpolator:

    a.setInterpolator(new Interpolator() {
        private final int frameCount = 8;
    
        @Override
        public float getInterpolation(float input) {
            return (float)Math.floor(input*frameCount)/frameCount;
        }
    });
    

    Also you can create a custom widget:

    File res/values/attrs.xml:

    
    
        
            
            
        
    
    

    File ProgressView.java:

    public class ProgressView extends ImageView {
    
        public ProgressView(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
            setAnimation(attrs);
        }
    
        public ProgressView(Context context, AttributeSet attrs) {
            super(context, attrs);
            setAnimation(attrs);
        }
    
        public ProgressView(Context context) {
            super(context);
        }
    
        private void setAnimation(AttributeSet attrs) {
            TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.ProgressView);
            int frameCount = a.getInt(R.styleable.ProgressView_frameCount, 12);  
            int duration = a.getInt(R.styleable.ProgressView_duration, 1000);
            a.recycle();
    
            setAnimation(frameCount, duration);
        }
    
        public void setAnimation(final int frameCount, final int duration) {
            Animation a = AnimationUtils.loadAnimation(getContext(), R.anim.progress_anim);
            a.setDuration(duration);
            a.setInterpolator(new Interpolator() {
    
                @Override
                public float getInterpolation(float input) {
                    return (float)Math.floor(input*frameCount)/frameCount;
                }
            });
            startAnimation(a);
        }
    }
    

    File activity_main.xml:

    
    

    File res/anim/progress_anim.xml: listed above

提交回复
热议问题