2013-10-29 62 views
3

我正在创建一个拖放应用程序,以在主布局上拖动一个对象。我的问题是我想拥有无限/无限的图像视图副本,因此我可以尽可能多地拖动图像。创建imageview的副本/克隆android

例如,心脏的形状,当我已经拖动图像,我不能有另一个心脏的形状,因为我只有一个图像(心脏)在布局。

enter image description here

这是我的触摸代码上imageViews(星,心,闪电):

private final class MyTouchListener implements OnTouchListener { 

    public boolean onTouch(View view, MotionEvent motionEvent) { 
     if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) { 
      ClipData data = ClipData.newPlainText("", ""); 
      DragShadowBuilder shadowBuilder = new DragShadowBuilder(view); 
      view.startDrag(data, shadowBuilder, view, 0); 
      view.setVisibility(View.INVISIBLE); 
      return true; 
     } else { 
     return false; 
     } 
     } 

    } 

这是我拖放区拖监听/主图像:

class MyDragListener implements OnDragListener { 
    @Override 
     public boolean onDrag(View v, DragEvent event) { 
     int action = event.getAction(); 
     final int X = (int) event.getX(); 
     final int Y = (int) event.getY(); 

     switch (event.getAction()) { 
     case DragEvent.ACTION_DRAG_STARTED: 
     // do nothing 
      break; 
     case DragEvent.ACTION_DRAG_ENTERED: 
      break; 
     case DragEvent.ACTION_DRAG_EXITED:   
      break; 
     case DragEvent.ACTION_DROP: 
      // Dropped, reassign View to ViewGroup 
      View view = (View) event.getLocalState(); 
      ViewGroup owner = (ViewGroup) view.getParent(); 
      owner.removeView(view); 
      RelativeLayout container = (RelativeLayout) v; 

      RelativeLayout.LayoutParams params1 = new RelativeLayout.LayoutParams(30, 30); 
      params1.leftMargin = (int) event.getX() - 15; 
      params1.topMargin = (int) event.getY() -15; 

      container.addView(view,params1); 
      view.setVisibility(View.VISIBLE); 
      break; 
     case DragEvent.ACTION_DRAG_ENDED: 
      default: 
      break; 
     } 
     return true; 
     } 
    } 

回答

2

在你的案例中拖放更容易用画布进行开发。

创建一个扩展视图的类,在内部绘制图像,在该视图上设置setOntouch,让rect跟随您的触摸,并使用invalidate()强制重绘视图。

编辑 当使用帆布你没有得到的利润和布局参数头痛,它只是简单。

DragDropView.java

public class DragDropView extends View implements OnTouchListener { 
    Rect originalRect , draggableRect; 
    int left, right, top, bottom, newX, newY, size; 
    Drawable originalDrawable,draggableDrawable; 

    public DragDropView(Context context) 
    { 
     super(context, null); 
     size = 20; 
     originalRect= new Rect(); 
     originalRect.set(200, 200, 240, 240); //left , top , right , bottom 
     draggableRect= new Rect(); 
     draggableRect.set(200, 200, 240, 240); 
     originalDrawable = getResources().getDrawable(R.drawable.ic_launcher); 
     draggableDrawable = getResources().getDrawable(R.drawable.ic_launcher); 
     originalDrawable.setBounds(originalRect); // since it wont move no need to do that in onDraw() 
     newX = 220; 
     newY=220; 
     this.setOnTouchListener(this); 
    } 
    public DragDropView(Context context, AttributeSet attrs) 
    { super(context, attrs); } 

    @Override 
    protected void onDraw(Canvas canvas) 
    { 
     super.onDraw(canvas); 
     originalDrawable.draw(canvas); 
     draggableRect.set(newX-size, newY-size, newX+size, newY+size); 
     draggableDrawable.setBounds(draggableRect); 
     draggableDrawable.draw(canvas); 
    } 

    @Override 
    public boolean onTouch(View v, MotionEvent event) 
    { 
     newX = (int)event.getX(); 
     newY = (int)event.getY(); 
     invalidate(); // force redraw 

     //if you need special touch events 
//  //on touch down 
//  if(event.getAction() == MotionEvent.ACTION_DOWN) 
//  { } 
//  //on touch move 
//  if(event.getAction() == MotionEvent.ACTION_MOVE) 
//  { } 
//  //on touch up 
//  if(event.getAction() == MotionEvent.ACTION_UP) 
//  { } 

     return true; // always return true to let touch listener listen to next touch 
    } 
} 

YourActivity.java

DragDropView dragDropView = new DragDropView(); 
+0

你有此示例代码? – MMakati

+0

是的,在办公室谷歌它非常容易,最好的部分是,你可以通过调用单个画线“克隆”数百个图像 –

+0

我无法找到你所说的很好的来源。 – MMakati