如何显示自定义DragShadow而不是ListViewFragment行?

时间:2011-09-18 16:09:38

标签: android drag-and-drop android-imageview

我有一个ListFragment,它有一个自定义适配器,这样我就可以在每一行上有一个文本视图和一个图像视图。将此行拖动到我的画布(单独的片段)时,它会将整行显示为拖动阴影(默认行为)。我想只将图标/图像拖到画布上。我下面的代码示例生成原始拖动阴影(列表视图中的整行),在单元格后面绘制了所需的图像(由于边界设置代码而略微拉伸)。 Pretty picture here

根据View.DragShadowBuilder documentation,您可以放弃传递给构造函数的视图并绘制自己的视图。我使用这种方法的问题是画布/视图大小已设置,我是图形新手。我试图调整大小和/或清除画布并在其上绘制自己的可绘制/位图时,我一直没有成功。我尝试用类似canvas.drawColor(Color.BLACK)的东西在画布上着色,但这只会使背景变黑但仍然在原始单元格后面。

文档中提到的另一种可能性是传入范围内的任何视图。为此,我创建了一个图像视图并为其添加了位图。当我拖动时,我得到一个空的拖影。调试告诉我图像视图的高度和宽度为0(因此视图和画布最终在拖动阴影构建器中为0)。但是,如果我要求绘图的高度和宽度,它会给我预期的尺寸。添加位图后,是否需要执行某些操作才能使图像视图更新其大小?

首选哪种方法?你有这两种方法的工作实例吗?

public class IconListFragment extends ListFragment
{
    ...
    private void startDraggingItem( View view, int position )
    {
        Log.d( TAG, "Dragging item." );

        // I'd like to use the custom imageview instead of the current view
        ImageView image = new ImageView( getActivity() );
        image.setImageBitmap( getIconBitmap( position ) );
        // Problem: Shows empty drag shadow (debugging shows that the height and width are 0)
        // The drawable is present and has the right dimensions
        // view.startDrag( data, new FlowchartDragShadowBuilder( image, position ), null, ZERO );

        // Start the drag
        // Problem: Shows both images
        view.startDrag( data, new FlowchartDragShadowBuilder( view, position ), null, ZERO );
    }

    private class FlowchartDragShadowBuilder extends View.DragShadowBuilder
    {
        private Drawable shadow;
        int position;

        public FlowchartDragShadowBuilder( View view, int pos )
        {
            super( view );
            Log.d( TAG, "Building shadow." );
            shadow = getIconDrawable( pos );
            shadow.setCallback( view );
            position = pos;
            shadow.setBounds( ZERO, ZERO, view.getWidth(), view.getHeight() );
        }

        @Override
        public void onDrawShadow( Canvas canvas )
        {
            super.onDrawShadow( canvas );

            Log.d( TAG, "Drawing shadow." );
            shadow.draw( canvas );
            getView().draw( canvas );
        }
    }

    ...

2 个答案:

答案 0 :(得分:1)

不确定你在getIconBitmap()中做了什么,但可能该功能无效。

我使用了新的imageview:

shadowbm = Bitmap.createBitmap(thisbutton.getWidth(), thisbutton.getHeight(), Bitmap.Config.ARGB_8888);
Canvas m = new Canvas(shadowbm);
thisbutton.draw(m);
thisbutton.setVisibility(View.GONE);
shadow.setImageBitmap(shadowbm);

shadow.setX(thisbutton.getLeft());
shadow.setY(thisbutton.getTop());
shadow.setVisibility(View.VISIBLE);

只要你可以在新画布上绘制,你就可以制作出你想要的任何阴影。只记得在位图上调用destroy()来释放内存。

答案 1 :(得分:0)

尝试启用绘图缓存。问题可能是因为它没有添加到任何布局中。

ImageView image = new ImageView( getActivity() );
image.setDrawingCacheEnabled(true);
image.setImageBitmap( getIconBitmap( position ) );
image.buildDrawingCache();

然后开始拖动它。希望它有所帮助。

更新

onDrawShadow()中通过调用imageview上的getdrawingCache()方法获取视图位图

    @Override
    public void onDrawShadow( Canvas canvas )
    {
        super.onDrawShadow( canvas );

        Log.d( TAG, "Drawing shadow." );
        shadow.draw( canvas );
        /* get the bitmap by calling getDrawingCache() on view.*/
        canvas.drawBitmap(getView().getDrawingCache(), left, top, null/*paint*/);
    }