0

ImageView在一个地方有 4 个 s RelativeLayout,所以它们都堆叠在一起。所有这些ImageView都为我的拖动侦听器注册,以使它们成为“放置目标”。它们显示的图像都是部分透明的,因此当它们全部放在彼此的顶部时,它们似乎是一个单一的图像。

屏幕上的其他地方有 4 个彩色图像“适合”到上面圆圈中的 4 个图像中的每一个。现在,当我将彩色图像拖到圆圈上并放下它们时,唯一ImageView得到放置的就是 XML 代码中列出的四个中的最后一个。大概这个是“顶部”,因此是唯一一个获得丢弃事件通知的。

不知何故,我需要找到放置发生的位置并选择ImageView该位置存在的所有 s,以便我可以查看是否存在正确的“放置目标”并相应地更新那个。关于如何实现这一点,我有两个想法:

  1. 我需要在发生下降的 X、Y 位置获取所有 s 的数组ImageView,然后找到一个具有不透明像素的数组,这是我正在拖动的块的正确目标。
  2. 当 drop 发生时,如果当前的“drop target”ImageView不是匹配的那个,我需要检查ImageViewcurrent 中的所有其他 s,RelativeLayout看看我那里是否有正确的。

不幸的是,我不知道如何完成其​​中任何一个。我的问题本质上是,在堆叠ImageViews 时我是否错过了一个更简单的选择,如果我没有,那么我如何才能完成上述两个想法中的任何一个。


这是图像的示例,圆圈的这 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();

但我不确定从这里如何检查其他ImageViews 在其中有什么意义。

4

1 回答 1

0

我最终选择了第二种选择:

“2.当drop发生时,如果当前的”drop target”ImageView不是与该片匹配的,我需要检查当前RelativeLayout中的所有其他ImageView,看看我那里是否有正确的。”

答案最终比我想象的要容易,为了让所有其他ImageView的 s 在同一个地方,我只需要与父母核对以获得 present ImageViews 的列表(在 ViewGroup 中可用)然后遍历我设置的标签以寻找匹配项:

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;

    // In this case the "dropTarget" is the "top most" ImageView of my stacked circles
    // I can create a ViewGroup of the parent of this ImageView (which is the 
    // RelativeLayout) in order to check all the children (other ImageViews)
    ViewGroup vg = (ViewGroup) dropTarget.getParent();

    Object tag = dropped.getTag();

    // Now I can iterate through each of the children (ImageViews) in the ViewGroup
    // looking to see if the dragged puzzle piece is a match for one of the "drop"
    // ImageViews
    for(int i = 0; i<vg.getChildCount(); i++){
        ImageView temp = (ImageView) vg.getChildAt(i);
        Object dtag = temp.getTag();
            if(dtag.toString().equals(tag.toString())){
                // Then we have a match! Place the piece
于 2013-10-07T19:29:29.370 回答