首页 > 解决方案 > 旋转图像视图

问题描述

我有滚动计数的轮盘赌(ImageView)。当我点击按钮时,轮盘赌开始以 270 度旋转。当我再次点击按钮时,轮盘赌必须加快速度并转得更多。如何实现第一个动画开始后滚动的加速和动画完全结束后的滚动计数减少?

标签: javaandroid

解决方案


我无法准确理解您想要做什么,因为您没有提供任何显示错误的参考代码,但这应该可以满足您的要求,即在您不断单击“旋转”时让图像旋转得更快按钮。

我用过ObjectAnimator

活动主.xml:

    <ImageView
        android:id="@+id/imageView_roulette"
        android:layout_width="300dp"
        android:layout_height="300dp"
        android:src="@mipmap/ic_launcher"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent" />

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Start Rotation"
        app:layout_constraintTop_toBottomOf="@+id/imageView_roulette"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toLeftOf="@+id/buttonStop"
        app:layout_constraintRight_toRightOf="parent"
        />
    <Button
        android:id="@+id/buttonStop"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Stop"
        app:layout_constraintTop_toBottomOf="@+id/imageView_roulette"
        app:layout_constraintLeft_toRightOf="@+id/button"
        app:layout_constraintRight_toRightOf="parent"

        />
</android.support.constraint.ConstraintLayout>

MainActivity.java:

public class MainActivity extends AppCompatActivity {

    Boolean rotating = false;
    Integer durationOfSpin = 3000; //default 3000

    ImageView image;

    ObjectAnimator animation;

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

        Button buttonStart = (Button) findViewById(R.id.button);
        Button buttonStop = (Button) findViewById(R.id.buttonStop);
        image = (ImageView) findViewById(R.id.imageView_roulette);


        buttonStart.setOnClickListener(new Button.OnClickListener() {
            public void onClick(View v) {
                if(!rotating) {
                    rotating = true;
                    animation = ObjectAnimator.ofFloat(
                            image, "rotation", 0, 360);

                    animation.setDuration(durationOfSpin);
                    animation.setInterpolator(new LinearInterpolator());
                    animation.setRepeatCount(Animation.INFINITE);
                    animation.start();

                }else{
                    if(durationOfSpin - 300 > 0) {
                        durationOfSpin -= 300;   //make slightly faster each subsequent click
                    }
                    animation.setDuration(durationOfSpin);

                }
            }
        });

        buttonStop.setOnClickListener(new Button.OnClickListener() {
            //just here so you can cancel your rotation
            public void onClick(View v) {
                if(rotating) {
                    rotating = false;
                    durationOfSpin = 3000;      //set back to default
                    animation.cancel();
                }
            }
        });

    }
}

推荐阅读