2013-07-09 40 views
2

我不确定我的问题是否可以理解。我的布局中有一个ImageViewGroupViewGroupGridView相当,我有物品,可以拖放。 现在我有兴趣将图片上的ViewGroup的项目拖动到图片上,但是每次尝试时,这些项目似乎都有较低的Z-index,因为图片背后消失了。是否有可能将ViewGroups项目放在ViewGroups兄弟之前?

我已经尝试与bringToFrontViewGroup及其项目的组合,但没有任何工作。现在我的问题是,是否有可能将viewgroups项目放在viewgroups兄弟之前。有没有人有这方面的经验?

我的XML看起来是这样的,其中GridView是我Viewgroup ...图像的图像资源和可见性代码设置:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/relative_gridview_layout" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:tag="@string/tag_fragment_GridView" 
android:background="#FFF" 
android:orientation="vertical" > 

<ImageView 
    android:id="@+id/img" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_alignParentTop="true" 
    android:visibility="gone" /> 


<de.test.GridView 
    android:id="@+id/grid_view1" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_below="@id/img" 
    android:background="#FFF" 
    android:gravity="center" 
    android:numColumns="auto_fit" 
    android:stretchMode="none" 
    android:tag="grid_view_tag" > 
</de.test.GridView> 

编辑: 我使用BaseAdapter来显示布局,因为我有一个动态数量的页面,可以使用这个库https://github.com/openaphid/android-flip翻转。

创建类似下面的布局:

public View loadView(final View view, final int position) { 

    final GridView dgv = (GridView) view 
      .findViewById(R.id.grid_view1); 


    dgv.setOnItemClickListener(new OnItemClickListener() { 
     @Override 
     public void onItemClick(android.widget.AdapterView<?> arg0, View v, 
       int position, long arg3) { 

      // Simple click listener for the items... 



     } 
    }); 

    dgv.getViewTreeObserver().addOnGlobalLayoutListener(
      new OnGlobalLayoutListener() { 

       @Override 
       public void onGlobalLayout() { 
        if (Build.VERSION.SDK_INT < 16) { 
         dgv.getViewTreeObserver() 
           .removeGlobalOnLayoutListener(this); 
        } else { 
         dgv.getViewTreeObserver() 
           .removeOnGlobalLayoutListener(this); 
        } 

        int displayHeight = view.getHeight(); 
        int displayWidth = view.getWidth(); 


         dgv.initChilds(displayWidth, displayHeight, 
           2, 
           2); 
        } else { 
         mImage = (ImageView) view 
           .findViewById(R.id.img); 
         mImage.getLayoutParams().height = displayHeight/2; 

         mImage.setImageResource(R.drawable.bild); 


         dgv.initChilds(displayWidth, 
           displayHeight/2, 2, 
           2); 
        } 

        updateGridView(); 
       } 

      }); 

    mList.add(view); 

    return view; 
} 

的initChilds() - 方法确定的ViewGroup的每个项目的大小。我想将viewgroup项目设置在前面,当它被longclick选中时。该longclicklistener看起来像这样:

@Override 
public boolean onLongClick(View view) { 

    draggedItem = getDraggedView(); draggedItem.bringToFront(); 
    callback.bringGridToFront();    

    return true; 
} 

我尝试将项目这样前面,但它不工作...回调变量是baseadapter类,它调用bringGridToFront的一个实例() - 目前执行以下代码的方法:

public void bringGridToFront() { 
    View view = mList.get(mCurrentPage); 
    RelativeLayout rl = (RelativeLayout) view.findViewById(R.id.relative_gridview_layout); 
    GridView dgv = (GridView) view.findViewById(R.id.grid_view1);  
    rl.bringChildToFront(dgv); 
} 
+0

我想过这样的事情:gridView.bringToFront(); item.bringToFront();其中项目是gridview的拖动项目...但它不起作用 – androider

+0

我认为有一个bringchildtofront函数。在你的情况下,你将不得不像这样调用它(relative_gridview_layout).bringchildtofront(grid_view1)。 – Christos

+0

嘿克里斯托斯,感谢您的回答;)我试过了你的建议,但不幸的是它不工作...如果我试图拖拽视图组的孩子在图像上,它仍然落后于 – androider

回答

0

感谢您的所有帮助。最后,bringToFront()方法似乎不适合我。现在我可以通过使用getChildDrawingOrder() - ViewGroups覆盖的方法来解决我的问题。

使用此方法,您可以更改子项的绘制顺序,因此最后绘制要置于其他所有项之上的项目。 一个例子:

@Override 
public int getChildDrawingOrder(int childCount, int i) { 
    if(mDragged != -1) { 

     if(i == mDragged) { 
      return childCount-1; 
     } 
     else if(i == (childCount - 1)) { 
      return mDragged; 
     }  
     else { 
      return i; 
     } 
    } 

    return i; 
} 

mDragged是应该在前面打下变量。所以我改变了这个变量的绘图位置与最后一个...希望这对任何人有同样的问题的帮助:D

1

Android根据视图在布局树表中的位置管理z索引。具有最大指数的观点吸引了其他人。在布局中,您的自定义网格位于其他布局之上,因为它是布局中的最后一个视图,因此它获得了最大的索引。

在你的代码中,我可以看到你在呼唤

draggedItem = getDraggedView(); 
在onLongClick(查看视图)事件

。 getDraggedView()可能返回一个视图,这是你拖动的视图,它不会显示在顶部(这只是一个猜测,因为你没有发布getDraggedView()代码)。如果是这种情况,您需要知道拖动视图的父级,例如,如果父级是主窗口,则您的整个布局将位于其上。所以我最好的猜测是在布局中添加拖动的视图,因为它将成为最后一个视图。

而且我注意到,你在呼唤

mImage.getLayoutParams().height = displayHeight/2; 
在图像视图

,以改变其高度。我不认为这是实现它的正确方法,因为如果在View的源代码here中的10130行中看到setLayoutParams代码,您会发现除了layoutparams集之外还有其他一些事情正在发生。但是我不知道这是否与你的问题有关。

我知道我的答案更像是一个猜测而不是一个完整的答案,但它是我能根据问题的数据做的最好的答案。

希望这有助于...

0

我试过接受的答案,但不断不断崩溃,每当有儿童意见是'显示。问题是参数childCounti指的是可见儿童,而不是整个儿童列表。 该解决方案建立在该答案上,并将此调整合并到索引中。

@Override 
public int getChildDrawingOrder(int childCount, int i) { 
    int firstVisiblePosition = getFirstVisiblePosition(); 
    if (mDragged < firstVisiblePosition || mDragged > getLastVisiblePosition()) 
     return super.getChildDrawingOrder(childCount, i); 
    int adjustedDragged = mDragged - firstVisiblePosition; 
    if (i == adjustedDragged) 
     return childCount - 1; 
    if (i == (childCount - 1)) 
     return adjustedDragged; 
    return i; 
} 
+0

这是一个新问题,而不是答案。使用[Ask Question](http://stackoverflow.com/questions/ask)链接提出新问题 –

相关问题