旋转图像。动画列表还是动画旋转?(安卓)

16 浏览
0 Comments

旋转图像。动画列表还是动画旋转?(安卓)

我想创建一个旋转进度图像,想知道最好的方法是什么。我可以用动画列表让12张图片每100毫秒更换一次,这样可以很好地工作,但为每个尺寸和分辨率创建12张图片会很麻烦:












我认为一个更简单的解决方案是为每个分辨率使用一个图像,而是为每个帧旋转它。在平台资源(android-sdk-windows/platforms...)中,我发现文件drawable/search_spinner.xml中的animated-rotate,但是如果我复制代码,就会出现编译器错误,它抱怨android:framesCount和android:frameDuration(在Eclipse中使用Google APIs 2.2):


我还尝试过使用重复的旋转动画(在anim资源文件夹中使用),但实际上我更喜欢动画列表版本的外观。那么解决这个问题的推荐方法是什么?

admin 更改状态以发布 2023年5月23日
0
0 Comments

您需要创建一个像下面这样的可绘制xml文件:

代码:


0
0 Comments

Praveen提出的旋转drawable无法让你控制帧数。假设你想要实现一个由8个部分组成的自定义加载器:

gif_icon

使用animation-list方法,你需要手动创建8个按45*frameNumber度旋转的帧。或者,你可以使用第一个帧并对其设置旋转动画:

progress_icon

文件res/anim/progress_anim.xml:



文件MainActivity.java:

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

这将给你平滑的动画,而不是8步骤的。为了解决这个问题,我们需要实现自定义插值器:

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

你也可以创建一个自定义控件:

文件res/values/attrs.xml:



    
        
        
    

文件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);
    }
}

文件activity_main.xml:


文件res/anim/progress_anim.xml:如上所述

0