2014-02-25 2 views
0

onDrag 이벤트를 시도하여 ImageView을 이동하려고합니다. 내 ImageView은 잘 움직이고 있지만 내 문제는 ImageViewDROP 이벤트의 마지막 위치에 표시되지 않는다는 것입니다. 다음은 제 코드입니다 ... 나는 어디에서 실수합니까?이미지보기가 놓기 이벤트에서 삭제되지 않습니다.

package com.example.dragndropdemo; 

import android.os.Bundle; 
import android.app.Activity; 
import android.content.ClipData; 
import android.content.ClipDescription; 
import android.graphics.Canvas; 
import android.graphics.Point; 
import android.util.Log; 
import android.view.DragEvent; 
import android.view.MotionEvent; 
import android.view.View; 
import android.view.View.DragShadowBuilder; 
import android.view.View.OnDragListener; 
import android.widget.*; 

public class MainActivity extends Activity{ 
    ImageView ima; 
    private static final String IMAGEVIEW_TAG = "Android Logo"; 
    String msg; 

    private android.widget.RelativeLayout.LayoutParams layoutParams; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     ima = (ImageView)findViewById(R.id.iv_logo); 
     // Sets the tag 
     ima.setTag(IMAGEVIEW_TAG); 

     ima.setOnTouchListener(new View.OnTouchListener() { 

     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      if (event.getAction() == MotionEvent.ACTION_DOWN) { 
         ClipData.Item item = new ClipData.Item((CharSequence)v.getTag()); 

        String[] mimeTypes = {ClipDescription.MIMETYPE_TEXT_PLAIN}; 
        ClipData dragData = new ClipData(v.getTag().toString(), mimeTypes, item); 
        // Instantiates the drag shadow builder. 
        DragShadow dragShadow=new DragShadow(v); 

        // Starts the drag 
        v.startDrag(dragData // the data to be dragged 
          , dragShadow // the drag shadow builder 
          , v    // no need to use local data 
          , 0    // flags (not currently used, set to 0) 
          ); 
        v.setVisibility(View.INVISIBLE); 
        return true; 
      } 
      else{ 
       return false; 
      } 
     } 
     }); 

     // Create and set the drag event listener for the View 
     ima.setOnDragListener(new OnDragListener(){ 
     @Override 
     public boolean onDrag(View v, DragEvent event){ 
      int dragEvent=event.getAction(); 
     switch(event.getAction())     
     { 
      case DragEvent.ACTION_DRAG_STARTED: 
       Log.d(msg, "Action is DragEvent.ACTION_DRAG_STARTED"); 
       // Do nothing 
       break; 

      case DragEvent.ACTION_DRAG_ENTERED: 
       Log.d(msg, "Action is DragEvent.ACTION_DRAG_ENTERED"); 
       break; 

      case DragEvent.ACTION_DRAG_EXITED : 
       Log.d(msg, "Action is DragEvent.ACTION_DRAG_EXITED"); 
       break; 

      case DragEvent.ACTION_DRAG_LOCATION : 
       Log.d(msg, "Action is DragEvent.ACTION_DRAG_LOCATION"); 
       break; 

      case DragEvent.ACTION_DRAG_ENDED : 
       Log.d(msg, "Action is DragEvent.ACTION_DRAG_ENDED"); 
       // Do nothing 
       break; 

      case DragEvent.ACTION_DROP: 
       Log.d(msg, "ACTION_DROP event"); 
       ImageView imgvw=(ImageView)event.getLocalState(); 
       imgvw.setVisibility(View.VISIBLE); 
       break; 

      default: break; 
      } 
      return true; 
     } 
     });   
    } 

    private class DragShadow extends View.DragShadowBuilder 
    { 

    public DragShadow(View view) { 
     super(view); 
    } 

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

    @Override 
    public void onProvideShadowMetrics(Point shadowSize, Point shadowTouchPoint) { 
     View v= getView(); 

     int height=v.getHeight(); 
     int width=v.getWidth(); 

     shadowSize.set(width, height); 
     shadowTouchPoint.set((int)width/2,(int)height/2); 
    } 

    } 
} 

답변

1

저는 몇 시간 동안 동일한 문제로 고심하고 있습니다. 하지만 ApiDemos 내부 솔루션을 발견했습니다. 패키지 com.example.android.apis.view을 살펴보면 DragAndDropDemo.java

내부에 드래그 가능한 객체가 DraggableDot의 인스턴스이고 드롭 포인트 인 것을 알 수 있습니다. 그리고 DraggableDot을 보면, onDragEvent을 구현하는 서브 클래스는 View입니다.

결국 나는 View의 하위 클래스를 만들고 onDragEvent 메서드를 연결했습니다. 이 하위 클래스를 내 드롭 포인트로 사용했으며 놀랍게도 DragListenerDragEvent 개의 동작, 특히 ACTION_DROP을 등록하기 시작했습니다.

-1

변경 :

ImageView imgvw=(ImageView)event.getLocalState(); 

imgvw.setVisibility(View.VISIBLE); 

에 대한 :

v.setVisibility(View.VISIBLE); 
관련 문제