我ImageView
在一个地方有 4 个 s RelativeLayout
,所以它们都堆叠在一起。所有这些ImageView
都为我的拖动侦听器注册,以使它们成为“放置目标”。它们显示的图像都是部分透明的,因此当它们全部放在彼此的顶部时,它们似乎是一个单一的图像。
屏幕上的其他地方有 4 个彩色图像“适合”到上面圆圈中的 4 个图像中的每一个。现在,当我将彩色图像拖到圆圈上并放下它们时,唯一ImageView
得到放置的就是 XML 代码中列出的四个中的最后一个。大概这个是“顶部”,因此是唯一一个获得丢弃事件通知的。
不知何故,我需要找到放置发生的位置并选择ImageView
该位置存在的所有 s,以便我可以查看是否存在正确的“放置目标”并相应地更新那个。关于如何实现这一点,我有两个想法:
- 我需要在发生下降的 X、Y 位置获取所有 s 的数组
ImageView
,然后找到一个具有不透明像素的数组,这是我正在拖动的块的正确目标。 - 当 drop 发生时,如果当前的“drop target”
ImageView
不是匹配的那个,我需要检查ImageView
current 中的所有其他 s,RelativeLayout
看看我那里是否有正确的。
不幸的是,我不知道如何完成其中任何一个。我的问题本质上是,在堆叠ImageView
s 时我是否错过了一个更简单的选择,如果我没有,那么我如何才能完成上述两个想法中的任何一个。
这是图像的示例,圆圈的这 4 个“部分”中的每一个都是具有透明背景的单独图像:
我用来将它们放在一起的截断 XML 代码是:
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
>
<ImageView
android:id="@+id/circlepuz1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:adjustViewBounds="false"
android:src="@drawable/circle_part1"
android:layout_gravity="center_horizontal"
android:tag="bottom_right" />
<ImageView
android:id="@+id/circlepuz2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@id/circlepuz1"
android:layout_alignRight="@id/circlepuz1"
android:layout_alignTop="@id/circlepuz1"
android:layout_alignBottom="@id/circlepuz1"
android:scaleType="fitXY"
android:src="@drawable/circle_part2"
android:tag="bottom_left" />
...
Every other ImageView is the same id+1, allignXXX=@id/circlepuz1
当前的 Java 放置代码是:
case DragEvent.ACTION_DROP:
//handle the dragged view being dropped over a target view
View view = (View) draggedView.getLocalState();
//stop displaying the view where it was before it was dragged
view.setVisibility(View.INVISIBLE);
//view dragged item is being dropped on
ImageView dropTarget = (ImageView) dropTargetView;
//view being dragged and dropped
ImageView dropped = (ImageView) view;
// I name the "drag" ImageView's tag and the "drop" ImageView's tag the same thing
// so if they match, I know the piece is in the right place
Object tag = dropped.getTag();
Object dtag = dropTarget.getTag();
if(tag.toString() != dtag.toString()){ // piece was in the wrong place
Log.d(TAG, tag.toString() + " was not " + dtag.toString());
view.setVisibility(View.VISIBLE);
}
else { // piece is in the right place
dropTarget.setImageDrawable(dropped.getDrawable());
}
我想循环最后一次if
/else
检查ImageView
同一布局中的每一个以查看是否存在正确的布局,我尝试了类似的方法:
// Attempt to get the new ImageView
//ImageView test = (ImageView) findViewById(dropTarget.getNextFocusDownId());
这根本不起作用。另一个想法是获得“drop”的 X 和 Y,这很容易做到:
String toastText = "X: " + draggedView.getX() + "\nY:" + draggedView.getY();
Toast.makeText(getApplicationContext(), toastText, Toast.LENGTH_LONG).show();
但我不确定从这里如何检查其他ImageView
s 在其中有什么意义。