旋转布局后如何获得正确的ImageviewId
How to get correct ImageviewId after rotation of layout
我的布局有 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)并且 return 再次回到这个视图(2*2)时,它 return 图像视图 ID 错误,直到 Activity 重新启动 again.see 我更新的参考代码
工作及问题说明:
我已经说过Imageview的矩阵有很多,比如2*2/3*3/4*4.....所以我们在启动Application的时候先加载2*2的imageview矩阵,当我们单击奇数彩色图像视图,它会转到 3*3 矩阵,但是当我们单击非奇数彩色图像视图时,它会进入下一个级别,比如 3*3.So 当应用程序第一次启动时,当我单击奇数彩色图像视图时,它会转到 3 *3 矩阵但是当 return 在点击非奇数颜色 imageview.and 之后再次在 2*2 上时,当我们再次点击彩色图像视图时,它无法获得正确的图像 ID。如果还有其他问题请问?
如何解决这个问题?
When ImageView changes it's position, their id should go with that position. But ImageView id remains at same position.
那是因为您正在使用 Animation
,这实际上不会改变您的 View
的位置。它是什么造成了动画的错觉,所以它只改变了那个视图的矩阵,但不对视图执行布局更改。
使用Animator
API instead of 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);
因为旋转后它不会自动转到零度,直到 activity 停止。
也许您可以将 ImageView 的 ID 存储在列表或数组中,并将当前着色的 ImageView 的 ID 存储在单独的变量中,而不是使用旋转,当您必须旋转时,您可以简单地 select 来自 List/Array 的一个随机 ImageView(不包括当前着色的那个),移除前一个的颜色并为新的着色。
顺便说一句,当您有 3x3、5x5、7x7 等布局时,中间的 ImageView 是否从未着色?因为在那些情况下,旋转不会改变任何东西(至少在视觉上)。我的意思是,旋转适用于在 2x2 正方形布局中选择随机正方形,但在任何其他情况下均无效。您需要随机选择方块还是需要始终轮流选择? (我希望我的意思是清楚的...)
我的布局有 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)并且 return 再次回到这个视图(2*2)时,它 return 图像视图 ID 错误,直到 Activity 重新启动 again.see 我更新的参考代码
工作及问题说明:
我已经说过Imageview的矩阵有很多,比如2*2/3*3/4*4.....所以我们在启动Application的时候先加载2*2的imageview矩阵,当我们单击奇数彩色图像视图,它会转到 3*3 矩阵,但是当我们单击非奇数彩色图像视图时,它会进入下一个级别,比如 3*3.So 当应用程序第一次启动时,当我单击奇数彩色图像视图时,它会转到 3 *3 矩阵但是当 return 在点击非奇数颜色 imageview.and 之后再次在 2*2 上时,当我们再次点击彩色图像视图时,它无法获得正确的图像 ID。如果还有其他问题请问?
如何解决这个问题?
When ImageView changes it's position, their id should go with that position. But ImageView id remains at same position.
那是因为您正在使用 Animation
,这实际上不会改变您的 View
的位置。它是什么造成了动画的错觉,所以它只改变了那个视图的矩阵,但不对视图执行布局更改。
使用Animator
API instead of 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);
因为旋转后它不会自动转到零度,直到 activity 停止。
也许您可以将 ImageView 的 ID 存储在列表或数组中,并将当前着色的 ImageView 的 ID 存储在单独的变量中,而不是使用旋转,当您必须旋转时,您可以简单地 select 来自 List/Array 的一个随机 ImageView(不包括当前着色的那个),移除前一个的颜色并为新的着色。
顺便说一句,当您有 3x3、5x5、7x7 等布局时,中间的 ImageView 是否从未着色?因为在那些情况下,旋转不会改变任何东西(至少在视觉上)。我的意思是,旋转适用于在 2x2 正方形布局中选择随机正方形,但在任何其他情况下均无效。您需要随机选择方块还是需要始终轮流选择? (我希望我的意思是清楚的...)