我试图在我的Android应用程序上使用图像拖动。 我的问题是,当我停止拖动图像时,永远不会调用DragEvent.ACTION_DROP。
在我的日志猫中,我接到了这个电话:
01-30 13:50:25.003: I/ViewRootImpl(2198): Reporting drop result: false
感谢您的帮助。
这是我的代码:
public class buildImage extends Activity implements OnTouchListener, OnDragListener
{
private LinearLayout slider;
private RelativeLayout board;
@Override
protected void onCreate(Bundle savedInstanceState) {
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
super.onCreate(savedInstanceState);
setContentView(R.layout.build_image);
//drawing = (SignatureViewModed) findViewById(R.id.myTest);
slider = (LinearLayout) findViewById(R.id.imageSlider);
board = (RelativeLayout) findViewById(R.id.borad);
setImagesSlider();
}
public void setImagesSlider()
{
ImageView image = new ImageView(this);
image.setLayoutParams(new LinearLayout.LayoutParams(100, 100));
Drawable draw = getResources().getDrawable(R.drawable.images);
image.setImageDrawable(draw);
image.setOnDragListener(this);
image.setOnTouchListener(this);
slider.addView(image);
}
@Override
public boolean onTouch(View view, MotionEvent event) {
// TODO Auto-generated method stub
if (event.getAction() == MotionEvent.ACTION_DOWN) {
ClipData data = ClipData.newPlainText("tests", "test");
DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(view);
view.startDrag(data, shadowBuilder, view, 0);
//view.setVisibility(View.INVISIBLE);
return true;
} else {
return false;
}
}
@Override
public boolean onDrag(View v, DragEvent event) {
// TODO Auto-generated method stub
int action = event.getAction();
switch (event.getAction()) {
case DragEvent.ACTION_DRAG_STARTED:
{
Log.i("check6", "check6");
// do nothing
return true;
}
case DragEvent.ACTION_DRAG_ENTERED:
{
Log.i("check4", "check4");
//v.setBackgroundDrawable(enterShape);
return true;
}
case DragEvent.ACTION_DRAG_EXITED:
{
// v.setBackgroundDrawable(normalShape);
Log.i("check3", "check3");
return true;
}
case DragEvent.ACTION_DROP:
// Dropped, reassign View to ViewGroup
Log.i("check", "check");
addNewImage(event);
return true;
case DragEvent.ACTION_DRAG_ENDED:
{
Log.i("check2", "check2");
// addNewImage(event);
return true;
}
default:
break;
}
return true;
}
public void addNewImage(DragEvent event)
{
ImageView image = new ImageView(this);
image.setLayoutParams(new LinearLayout.LayoutParams(100, 100));
Drawable draw = getResources().getDrawable(R.drawable.images);
image.setImageDrawable(draw);
board.addView(image);
float x = event.getX();
float y = event.getY();
image.setX(x);
image.setY(y);
Log.i("margin", "x " + x + " y " + y);
}
}
我的XML
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<RelativeLayout
android:layout_width="fill_parent"
android:id="@+id/borad"
android:background="@android:color/darker_gray"
android:layout_above="@+id/temp"
android:layout_height="fill_parent" >
</RelativeLayout>
<ScrollView
android:layout_width="fill_parent"
android:id="@+id/temp"
android:layout_alignParentBottom="true"
android:layout_height="wrap_content" >
<LinearLayout
android:id="@+id/imageSlider"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
</LinearLayout>
</ScrollView>
</RelativeLayout>
答案 0 :(得分:3)
你必须有一些东西可以放下那个图像。到目前为止,您只在图像上有一个OnDragListener。您要删除该图像的位置不包含任何使用OnDragListener的控件,因此不会调用您的侦听器。
监听OnDragListeners的控件不能被隐藏或消失,所以你必须在那里放置一些网格,其中单元格看起来是空的但不是。例如,具有透明图像的ImageView。或者将Alpha设置为0f。
至少将OnDragListener设置为内部LinearLayout,然后您将获得Drop事件。