У меня есть ListFragment, который имеет собственный адаптер, чтобы у меня было представление текста и изображения в каждой строке.При перетаскивании этой строки на мой холст (отдельный фрагмент) он отображает всю строку как тень перетаскивания (поведение по умолчанию).Я хочу перетащить только значок / изображение на холст.В приведенном ниже примере кода создается исходная тень перетаскивания (целая строка из списка) с желаемым изображением, нарисованным за ячейкой (немного растянутым из-за кода установки границ). Хорошая картинка здесь .
Согласно документации View.DragShadowBuilder , вы можете отказаться от представления, переданного в конструктор, и нарисовать свой собственный вид.Проблема с этим подходом заключается в том, что размер холста / вида установлен, и я новичок в графике.Я потерпел неудачу в своих попытках изменить размер и / или очистить холст и нарисовать на нем свой собственный чертеж / растровое изображение.Я попытался закрасить холст чем-то вроде 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 );
}
}
...