我正在创建一个拖放应用程序,用于拖动主布局上的对象。我的问题是我想拥有无限/无限的图像视图副本,所以我可以尽可能多地拖动图像。
例如心形,当我已经拖动图像时,我不能有另一个心形,因为我在布局中只有一个图像(心脏)。
这是我在触摸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;
}
}
答案 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();