【问题标题】:How to get correct ImageviewId after rotation of layout如何在布局旋转后获得正确的 ImageviewId
【发布时间】:2017-04-21 09:39:03
【问题描述】:

我有一个 2*2/3*3/4*4... ImageView 的布局。其中一些随机着​​色如下:

对于 Imageview 的随机颜色之一,我有使用此代码:

Random random = new Random();

        id = array_image1.get(random.nextInt(array_image1.size()));


        ObjectAnimator animator = ObjectAnimator.ofInt(findViewById(id), "backgroundResource", R.drawable.original_img, R.drawable.org_state).setDuration(1500);

        animator.setStartDelay(1500);
        animator.setEvaluator(new ArgbEvaluator());
        animator.start();

我正在像这样处理彩色 ImageView 上的一些点击事件:

     for (int i = 0; i < array_image11.size(); ++i) {
                final int btn = array_image11.get(i);

                findViewById(btn).setOnClickListener(new View.OnClickListener() {
                    public void onClick(View v) {

                        if ((findViewById(id)).equals(findViewById(btn)))
                        //Inform the user the button has been clicked
                        {

   //forward
   findViewById(id).setBackgroundResource(R.drawable.original_img);

     }else {

                           //backward
                            Toast.makeText(StaticSpatial.this, "wrong", Toast.LENGTH_SHORT).show();

                    }
                });
            }

以上都没有问题。

但是当我像这样添加随机旋转动画代码时:

            int n;
            int[] a=new int[]{1,2};
            final Random rnd = new Random();
            n=a[rnd.nextInt(a.length)];
            if(n==1)
            {
                 ObjectAnimator rotateAnimator = ObjectAnimator.ofFloat(l4, View.ROTATION, 0, 90);
                rotateAnimator.setDuration(2000); // miliseconds
                rotateAnimator.start();n);


            }
            else
            {
              ObjectAnimator rotateAnimator = ObjectAnimator.ofFloat(l4, View.ROTATION, 0, 90);
                rotateAnimator.setDuration(2000); // miliseconds
                rotateAnimator.start();
            }

旋转后的图像看起来像这样(即彩色 Imageview 改变它的位置):

添加此旋转动画代码后,我的 clickEvent 无法获得正确的 ImageView id。 即当imageview改变它的位置时,他们的id应该与那个位置一致。但 imageview id 保持在同一个位置。

那么如何在旋转后获取所需的ImageviewId

更新:

在使用 azizbekian 的答案后(现在使用 animator 而不是动画),我找到了正确的 image-view id ,但只是第一次。 即第一次 Activity 启动时效果很好,但是当我要去一个新视图(比如 3*3)并再次返回到这个视图(2*2)时,它返回错误的图像视图 ID,直到 Activity 再次重新启动。请参阅我的更新代码以获取参考。

工作和问题说明:

我已经说过Imageview的矩阵有很多,例如2 * 2/3 * 3/4 * 4.....所以当我们启动Application时首先加载2 * 2的imageview矩阵,然后单击奇数彩色图像视图进入 3*3 矩阵,但是当我们单击奇数彩色图像视图以外的其他颜色时,它会进入下一级,例如 3*3。因此,当应用程序第一次启动时,当我单击奇数彩色图像视图时,它会进入 3*3 矩阵,但是当单击除奇数彩色图像视图以外的其他颜色后再次返回 2*2 时。然后当我们再次单击彩色图像视图时,它不会获得正确的图像 ID。如果还有其他问题请询问?

如何解决这个问题?

【问题讨论】:

  • 至少你们给出了反对的理由..
  • but when I'm going to a new view, and return back again to this view 这是什么意思?也许值得分享一个代码?整理您的代码,删除与问题无关的所有内容(cmets、空格),给我们(您问题的读者)一个简洁、可重复、干净的问题。
  • 这意味着正如我已经说过的Imageview有很多matix,例如2 * 2/3 * 3/4 * 4.....所以当我们启动应用程序时首先加载2 * 2图像视图的矩阵,当我们单击奇数彩色图像视图时,它会转到 3*3 矩阵,但是当我们单击奇数彩色图像视图以外的其他颜色时,它会进入下一级,例如 3*3。因此,当我第一次单击奇数彩色图像视图时,当应用程序第一次启动时它进入 3*3 矩阵,但是当单击奇数彩色图像视图以外的其他颜色后再次返回 2*2 时。然后当我们再次单击彩色图像视图时,它不会获得正确的图像 ID。
  • 如果您有任何其他疑问请询问?
  • 你怎么去 3*3 又来 2*2 请分享那个代码。

标签: java android android-layout android-animation animator


【解决方案1】:

ImageView 改变它的位置时,它们的 id 应该与那个位置一致。但是 ImageView id 保持在相同的位置。

那是因为您使用的是Animation,这实际上并不会改变您View 的位置。它是什么造成了动画的错觉,所以它只会改变视图的矩阵,但不会对视图进行布局更改。

使用Animator API 代替Animation

更新

鉴于此动画xml:

<set xmlns:android="schemas.android.com/apk/res/android">
    <rotate
        android:fromDegrees="0" 
        android:toDegrees="90" 
        android:pivotX="50%" 
        android:pivotY="50%" 
        android:duration="2000" /> 
</set> 

这可以替换为以下内容:

ObjectAnimator rotateAnimator = ObjectAnimator.ofFloat(yourView, View.ROTATION, 0, 90);
rotateAnimator.setDuration(2000);
rotateAnimator.start();

更新:

只需在每次加载视图(或布局)时将旋转设置为零,如下所示:

mylayoutname.setRotation(0);

因为旋转后它不会自动归零,直到活动停止。

【讨论】:

  • 你能不能给演示一下。
  • 发布您的R.anim.clockwise
  • schemas.android.com/apk/res/android"> schemas.android.com/apk/res/android" android: fromDegrees="0" android:toDegrees="90" android:pivotX="50%" android:pivotY="50%" android:duration="2000" >
【解决方案2】:

也许您可以将 ImageView 的 Id 存储在 List 或 Array 中,并将当前颜色的 ImageView 的 Id 存储在一个单独的变量中,而不是使用旋转,当您必须旋转时,您可以简单地从列表/数组(不包括当前着色的),从前一个中删除颜色并为新的着色。
顺便说一句,当您有 3x3、5x5、7x7 等布局时,中间的 ImageView 是否从不着色?因为在这些情况下,旋转不会改变任何东西(至少在视觉上)。我的意思是,旋转适用于在 2x2 正方形的布局中选择一个随机正方形,但在任何其他情况下都无效。您需要随机选择正方形还是需要始终通过旋转来选择它们? (我希望我的意思很清楚......)

【讨论】:

    猜你喜欢
    • 2016-02-28
    • 1970-01-01
    • 2021-06-30
    • 1970-01-01
    • 1970-01-01
    • 2020-02-28
    • 2020-11-07
    • 1970-01-01
    相关资源
    最近更新 更多