【问题标题】:Is it possible to bring ViewGroups items in front of ViewGroups siblings?是否可以将 ViewGroups 项目放在 ViewGroups 兄弟姐妹的前面?
【发布时间】:2013-07-09 13:48:03
【问题描述】:

我不确定我的问题是否可以理解。我的布局中有一个Image 和一个ViewGroupViewGroupGridView 相当,我有可以拖放的项目。 现在我有兴趣将我的ViewGroup 的项目拖到图像上,但每次我尝试时,这些项目似乎都有较低的 z-index,因为消失在图像后面。

我已经在ViewGroup 及其项目上尝试了与bringToFront 的组合,但没有任何效果。现在我的问题是,是否甚至可以将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()-方法确定视图组中每个项目的大小。当通过 longclick 选择它时,我想将视图组项目设置为前面。 longclicklistener 看起来像这样:

@Override
public boolean onLongClick(View view) {

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

    return true;
}

我尝试像这样把item放到最前面,但是不起作用……回调变量是baseadapter类的一个实例,它调用了bringGridToFront()-Method,目前执行如下代码:

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);
}

【问题讨论】:

  • 我想过这样的事情:gridView.bringToFront(); item.bringToFront();其中item是gridview的拖拽item...但是不起作用
  • 我认为有一个bringchildtofront 功能。在您的情况下,您将不得不这样称呼它 (relative_gridview_layout).bringchildtofront(grid_view1)。
  • 嘿克里斯托斯,感谢您的回答;)我已经尝试过您的建议,但不幸的是它不起作用...如果我尝试将视图组的一个孩子拖到图像上,它仍然存在背后
  • 发布一些代码,也许你遗漏了一些在这里有人可能会看到并提供答案的东西......
  • 发布一些代码,完成:D

标签: android foreground viewgroup siblings


【解决方案1】:

Android 根据视图在布局树表中的位置管理 z-index。具有最大索引的视图将自己绘制在其他视图之上。在您的布局中,您的自定义网格位于其他网格之上,因为它是布局中的最后一个视图,因此它获得了最大的索引。

在您的代码中,我可以看到您正在调用

draggedItem = getDraggedView();

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

另外我注意到你在打电话

mImage.getLayoutParams().height = displayHeight / 2;

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

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

希望这会有所帮助...

【讨论】:

    【解决方案2】:

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

    使用此方法,您可以更改子项的绘制顺序,从而最终绘制您想要放置在所有其他项之上的项目。 一个例子:

    @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

    【讨论】:

      【解决方案3】:

      我尝试了接受的答案,但每当有未显示的子视图时,都会出现崩溃。问题在于参数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;
      }
      

      【讨论】:

      • 这是一个新问题,而不是答案。使用 链接提出新问题
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-05-06
      • 1970-01-01
      • 2022-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-02
      相关资源
      最近更新 更多