我有一个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 );
}
}
...
答案 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*/);
}