Как показать пользовательский DragShadow вместо строки ListViewFragment? - PullRequest
1 голос
/ 18 сентября 2011

У меня есть 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 );
        }
    }

    ...

Ответы [ 2 ]

1 голос
/ 18 сентября 2011

Не уверен, что вы делаете в getIconBitmap (), но, возможно, эта функция не работает.

Я использую новый просмотр изображений:

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 () для растрового изображения, чтобы освободить память.

0 голосов
/ 18 сентября 2011

Попробуйте включить кеш рисования. Проблема может быть в том, что он не добавлен ни в один макет.

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

Тогда начни его перетаскивать. Надеюсь, это поможет.

Обновление

В onDrawShadow() получить растровое изображение, вызвав метод getdrawingCache() для imageview

    @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*/);
    }
...