【问题标题】:How to rotate an image in Android and stop it randomly on button pressed如何在Android中旋转图像并在按下按钮时随机停止
【发布时间】:2015-11-02 12:41:18
【问题描述】:

我试图在我的 android 应用程序中制作一个简单的命运之轮。这将是一个带有人名的圆形图像。当按下它下方的按钮时,图像将开始旋转(围绕其中心)。轮换需要在随机时间后停止,所以它并不总是相同的人名。现在我只使用带有 1-2-3-4 的图像,如下所示。

Output example

我几乎查看了有关此的所有主题,但无法弄清楚如何使其随机化。目前它总是停在同一个角度,例如总是停在数字 1。

我目前的代码:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_who, container, false);


   final ImageView alberto = (ImageView)view.findViewById(R.id.alberto);
    Button spin =(Button)view.findViewById(R.id.spin);

    final RotateAnimation anim = new RotateAnimation(0f,generateRandomNumber(), Animation.RELATIVE_TO_SELF, 0.5f,
            Animation.RELATIVE_TO_SELF, 0.5f);
    anim.setFillAfter(true);
    anim.setDuration(1000);


    spin.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            alberto.startAnimation(anim);
        }
    });

    return view;
}

public float generateRandomNumber() {

    Random rand = new Random();
    int randomNum = rand.nextInt((360 - 0) + 1);

    return (float)randomNum;
}

}

所以基本上我给 RotateAnimation 一个随机数,所以它在停止旋转的地方并不总是相同的。但这不起作用,因为就像我说的那样,它总是在 nr 1 上停止。我发现如果我改变动画的持续时间,输出就不一样了!因此,我尝试在持续时间内输入一个随机数,但这也不起作用。顺便说一句,我检查了其他帖子说它是随机的,但不是。

在理想情况下,动画开始快,慢下来,然后停止。

感谢提前分配!!!

【问题讨论】:

    标签: android random rotation imageview rotateanimation


    【解决方案1】:

    您可以尝试以下方法:

    private static final float BASE_ROTATION_DEGREES = 3600;
    private static final int DURATION = 1000;
    
    //...
    
    spin.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            float deg = alberto.getRotation() + BASE_ROTATION_DEGREES + ((float)Math.random() * 360F);
            alberto.animate().rotation(deg).setDuration(DURATION)
                .setInterpolator(new AccelerateDecelerateInterpolator());
        }
    });
    

    您也可以将插值器更改为其他内容以获得不同的效果。

    编辑: 已编辑以解决只有第一次旋转超过一圈的问题。请注意,这意味着旋转值会很快变高!不应该构成问题,但值得牢记。

    另一个编辑: Sample app/source code here 如果你想看看。这在我的模拟器上运行良好。

    【讨论】:

    • 您好 PPartisan,感谢您回答我的问题!你帮我解决了我的问题,现在旋转是随机的。我不得不将持续时间更改为 4000 以更好地注意插值器;)我第二次按下旋转按钮时它不再旋转了,只是一点点。关于为什么会这样的任何想法???它不应该做同样的事情吗?
    • @user2455311 嗨,您能否将实现此方法的代码粘贴到您的 OP 中,并发表评论以便我看一下?我已经对此进行了测试,它似乎按预期工作,谢谢。
    • 嗨,我正在使用你的代码,我唯一改变的是 BASE_ROTATION_DEGREES 到 5000 和 DURATION 到 5500。正常情况下,当再次按下按钮时它应该再次执行相同的动画。也许是因为我在片段中(在 oncreateView 中)这样做?
    • @user2455311 好吧,我想我知道发生了什么。因为动画实际上影响了视图的旋转属性,所以您需要将下一个旋转添加到已经存在的旋转(或在开始旋转之前将旋转重置为零)。我会更新我的答案。
    • @user2455311 我实际上整理了一个示例应用程序来进一步测试您描述的问题,并认为如果您想下载它或查看源代码,我不妨将它放在 GitHub 上。 Here's the link
    猜你喜欢
    • 2021-08-19
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多