创建ImageView的副本/克隆 Android

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

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

enter image description here

以下是我在图像视图(星形、心形、闪电)上的touch代码:
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个回答

2

使用canvas实现拖放会更加容易。

创建一个继承View的类,创建一个矩形在里面绘制你的图像,设置Ontouch在该视图上,让矩形跟随你的触摸移动,并使用invalidate()强制重绘视图。

编辑 使用canvas时,您不必担心边距和布局参数,它是直观的。

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();

在办公室里搜索一下,非常容易,最好的部分是你可以通过调用单个绘制线来“克隆”数百个该图像。 - Ahmad Dwaik 'Warlock'
我该如何使用你的代码以及部分我需要实现的内容来完成我的请求:http://stackoverflow.com/questions/21213027/how-to-allow-user-to-drag-and-drop-an-image-within-a-linearlayout - Si8
在您的图像上方创建相同的视图,并从类中删除originalDrawable,将您的空心框图像加载到draggableDrawable中,在触摸时可以移动它并获取绝对/相对xy并将其转换为您的hex或rbg。 - Ahmad Dwaik 'Warlock'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接