创建imageview android的副本/克隆

时间:2013-10-29 14:21:27

标签: android drag-and-drop android-imageview

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

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

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;
      }
  }

1 个答案:

答案 0 :(得分:2)

使用画布可以更容易地拖放你的案例。

创建一个扩展View的类,创建一个rect来在里面绘制图像,在该视图上设置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();