动画系列:java代码实现图片缩放动画

  • 缩放动画的核心难题,不在于怎么设置动画,而在于如何拿到图片的中心点。缩放动画的默认焦点是图片的左上角,也就是说,图片是向右下拉伸的。我们必须想办法拿到图片的中心位置坐标。

  • Gif图弄起来,比较麻烦,后续补上。先体验下焦点在左上角的情况:
public class MainActivity extends AppCompatActivity {

    ImageView iv;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        iv = findViewById(R.id.iv);
        ScaleAnimation scaleAnimation2 = new ScaleAnimation(1f, 2f, 1f, 2f,
                ScaleAnimation.ABSOLUTE,
                iv.getWidth() / 2f,
                ScaleAnimation.ABSOLUTE,
                iv.getHeight() / 2f);
        scaleAnimation2.setDuration(2000);
        //设置动画结束之后的状态是否是动画开始时的状态,true,表示是保持动画开始时的状态
        scaleAnimation2.setFillBefore(true);
        //设置reverse的效果是先放大,再缩小。设置restart的效果是先放大,瞬间变小,再放大。
        scaleAnimation2.setRepeatMode(ScaleAnimation.REVERSE);
        scaleAnimation2.setRepeatCount(ScaleAnimation.INFINITE);
        iv.startAnimation(scaleAnimation2);
    }
}

是不是发现,焦点在左上角?iv.getWidth()拿到的是0。不多BB,放大招了。

  • 最终解决方案

public class MainActivity extends AppCompatActivity {
    ImageView iv;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        iv = findViewById(R.id.iv);
        iv.post(new Runnable() {
            @Override
            public void run() {
                ScaleAnimation scaleAnimation2 = new ScaleAnimation(1f, 2f, 1f, 2f,
                        ScaleAnimation.ABSOLUTE,
                        iv.getWidth() / 2f,
                        ScaleAnimation.ABSOLUTE,
                        iv.getHeight() / 2f);
                scaleAnimation2.setDuration(2000);
                //设置动画结束之后的状态是否是动画开始时的状态,true,表示是保持动画开始时的状态
                scaleAnimation2.setFillBefore(true);
                //设置reverse的效果是先放大,再缩小。设置restart的效果是先放大,瞬间变小,再放大。
                scaleAnimation2.setRepeatMode(ScaleAnimation.REVERSE);
                scaleAnimation2.setRepeatCount(ScaleAnimation.INFINITE);
                iv.startAnimation(scaleAnimation2);
            }
        });
    }
}

上一篇:Luogu4389 付公主的背包


下一篇:学习开源项目MyDiary第一天