2016-02-29 85 views
0

在這裏,我把我的代碼,當我將我的觀點(ImageView的),它是無形的,請幫我的Android在拖放,降不工作

public class MainActivity extends ActionBarActivity { 

    ImageView ivfirst; 
    private android.widget.RelativeLayout.LayoutParams layoutParams; 

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

     ivfirst = (ImageView) findViewById(R.id.imgView); 

     ivfirst.setOnLongClickListener(new View.OnLongClickListener() { 
      @Override 
      public boolean onLongClick(View v) { 
       ClipData.Item item = new ClipData.Item((CharSequence) v 
         .getTag()); 
       String[] mimeTypes = { ClipDescription.MIMETYPE_TEXT_PLAIN }; 

       ClipData dragData = new ClipData(v.getTag().toString(), 
         mimeTypes, item); 
       View.DragShadowBuilder myShadow = new View.DragShadowBuilder(
         ivfirst); 

       v.startDrag(dragData, myShadow, null, 0); 
       return true; 
      } 
     }); 


      ivfirst.setOnDragListener(new View.OnDragListener() { 
      @Override 
      public boolean onDrag(View v, DragEvent event) { 
       switch(event.getAction()) 
       { 
        case DragEvent.ACTION_DRAG_STARTED: 
        layoutParams = (RelativeLayout.LayoutParams)v.getLayoutParams(); 

        // Do nothing 
        break; 

        case DragEvent.ACTION_DRAG_ENTERED: 
        int x_cord = (int) event.getX(); 
        int y_cord = (int) event.getY(); 
        break; 

        case DragEvent.ACTION_DRAG_EXITED : 
        x_cord = (int) event.getX(); 
        y_cord = (int) event.getY(); 
        layoutParams.leftMargin = x_cord; 
        layoutParams.topMargin = y_cord; 
        v.setLayoutParams(layoutParams); 
        break; 

        case DragEvent.ACTION_DRAG_LOCATION : 
        x_cord = (int) event.getX(); 
        y_cord = (int) event.getY(); 
        break; 

        case DragEvent.ACTION_DRAG_ENDED : 

        // Do nothing 
        break; 

        case DragEvent.ACTION_DROP: 

        // Do nothing 
        break; 
        default: break; 
       } 
       return true; 
      } 
      }); 
     ivfirst.setOnTouchListener(new View.OnTouchListener() { 
      @SuppressLint("ClickableViewAccessibility") 
      @Override 
      public boolean onTouch(View v, MotionEvent event) { 
       if (event.getAction() == MotionEvent.ACTION_DOWN) { 
        ClipData data = ClipData.newPlainText("", ""); 
        View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(
          ivfirst); 

        ivfirst.startDrag(data, shadowBuilder, ivfirst, 0); 
        ivfirst.setVisibility(View.INVISIBLE); 

        return true; 
       } else { 
        return false; 
       } 
      } 
     }); 

    } 

} 

當我運行該程序的正常工作,但降不行, 請指點我,我錯了

回答

0

這是因爲你在ACTION_DROP什麼都不做。
ExplanationACTION_DRAG_EXITED:通過的getAction返回

動作常數():該用戶移動拖影觀的邊框外的信號。

您沒有爲被拖動的View刪除行爲。

+0

Thankx艾米我得到了重點 –

0

我研究了Android啓動器代碼以查看它們如何拖放。我非常喜歡他們的對象模型。他們做了什麼,對你來說可能是很好的考慮,是否有責任處理拖放到所有可拖動視圖所在的ViewGroup中。觸摸事件在那裏得到處理,而不是在您的視圖中。

的關鍵類二:

DragLayer - 實現一個自定義的ViewGroup中,該座標在屏幕上的看法運動。 Launcher DragLayer是FrameLayout的子類。

DragController - 此對象是執行大部分工作以支持拖放操作的控制器。

他們所做的另一件事是不移動實際的視圖直到你拖拽你拖動的對象。它並不是這樣看的,因爲在屏幕上你看到一個由視圖構建的位圖,隨着手指(或指針)的移動而移動。