2016-02-29 82 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 - 此对象是执行大部分工作以支持拖放操作的控制器。

他们所做的另一件事是不移动实际的视图直到你拖拽你拖动的对象。它并不是这样看的,因为在屏幕上你看到一个由视图构建的位图,随着手指(或指针)的移动而移动。