2014-12-18 3 views
0

Я создал операцию перетаскивания в моем приложении для переупорядочения элементов с помощью кода, найденного here.проблема с перетаскиванием android

Один из видов деятельности включает в себя переупорядочение изображений, поэтому я добавил изображение в макет и скорректировал код для добавления правильных изображений и всего этого. Все работает отлично, за исключением того, что при захвате предметов первый элемент, который вы извлекаете из каждого слота, всегда отображается, когда вы захватываете любой другой предмет из этого слота.

Так, например, скажем, у меня есть элементы a, b, c и d, если я возьму элемент a и переместите его в конец, b теперь находится в этом первом слоте. если я возьму элемент b сейчас, плавающее представление, которое перетаскивается, все еще показывает. Когда он отбрасывается, все выглядит нормально и находится в новом порядке, в котором он должен находиться. Теперь в том же примере, если я возьму второй элемент, который теперь является элементом c, и перемещаю его в любом месте, происходит то же самое. Перетаскивание первого элемента всегда показывает a, а второе всегда показывает c.

Я также могу взять элемент a, переместить его на второй, затем третий, затем четвертый и т. Д., Слот, а затем независимо от того, какой элемент я захватил, элемент a всегда тот, который отображается, когда объект перетаскивается.

Я смущен относительно того, что вызывает это, я думаю, что это может быть связано с этим разделом кода, в частности с Cache.

private void startDrag(int itemIndex, int y) { 
    stopDrag(itemIndex); 

    Log.i("startdrag","view " + itemIndex); 

    View item = getChildAt(itemIndex); 
    if (item == null) return; 
    item.setDrawingCacheEnabled(true); 
    if (mDragListener != null) 
     mDragListener.onStartDrag(item); 

    // Create a copy of the drawing cache so that it does not get recycled 
    // by the framework when the list tries to clean up memory 
    Bitmap bitmap = Bitmap.createBitmap(item.getDrawingCache()); 

    WindowManager.LayoutParams mWindowParams = new WindowManager.LayoutParams(); 
    mWindowParams.gravity = Gravity.TOP; 
    mWindowParams.x = 0; 
    mWindowParams.y = y - mDragPointOffset; 

    mWindowParams.height = WindowManager.LayoutParams.WRAP_CONTENT; 
    mWindowParams.width = WindowManager.LayoutParams.WRAP_CONTENT; 
    mWindowParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE 
      | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE 
      | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON 
      | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN 
      | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS; 
    mWindowParams.format = PixelFormat.TRANSLUCENT; 
    mWindowParams.windowAnimations = 0; 

    Context context = getContext(); 
    ImageView v = new ImageView(context); 
    v.setImageBitmap(bitmap);  

    WindowManager mWindowManager = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE); 
    mWindowManager.addView(v, mWindowParams); 
    mDragView = v; 
} 

Оригинальное приложение также иногда показывает неправильный деталь, когда тащит, но я не могу заставить его надежно повторить, поэтому я думаю, что это что-то делать с кэшем рисования. Моя версия имеет изображения и, вероятно, пытается сохранить память, повторно используя старые представления. Я действительно не знаю, если есть больше, мне нужно просто спросить.

Заранее спасибо.

ответ

1

Вместо того, чтобы использовать кеш чертежа, попробуйте вместо этого получить растровое изображение из представления напрямую. Именно так Google делает это в своем DynamicListView, как вы можете видеть ниже. Я использовал слегка измененную версию без проблем. Вы можете найти более подробную информацию здесь: https://www.youtube.com/watch?v=_BZIvjMgH-Q

/** Draws a white border over the screenshot of the view passed in. */ 
private Bitmap getBitmapWithBorder(View v) { 
    Bitmap bitmap = getBitmapFromView(v); 
    Canvas can = new Canvas(bitmap); 

    Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight()); 

    Paint paint = new Paint(); 
    paint.setStyle(Paint.Style.STROKE); 
    paint.setStrokeWidth(LINE_THICKNESS); 
    paint.setColor(getResources().getColor(R.color.transparent_white)); 

    can.drawBitmap(bitmap, 0, 0, null); 
    can.drawRect(rect, paint); 

    return bitmap; 
} 

/** Returns a bitmap showing a screenshot of the view passed in. */ 
private Bitmap getBitmapFromView(View v) { 
    Bitmap bitmap = Bitmap.createBitmap(v.getWidth(), v.getHeight(), Bitmap.Config.ARGB_8888); 
    Canvas canvas = new Canvas (bitmap); 
    v.draw(canvas); 
    return bitmap; 
} 
+0

круто, это работает, и пример в ссылке выглядит лучше с анимацией, чем то, что у меня есть, так что я мог бы просто поменять и попробовать работать с этим кодом. Благодаря! – JStephen

Смежные вопросы