11

我意识到已经发布了类似的问题,并且我查看了它们以及许多其他主题等以找到解决方案 - 我显然错过了明显的 - 因为我仍在学习基础知识!

目标:简单的拖放。用户在屏幕上移动图像,或者放在另一个图像的顶部或屏幕上的任何位置。

API:>11

完全的:

  • 可以拖动图像并将其放置在另一个图像之上并获得响应(使用 Toast 确认)。
  • 可以将图像拖动到屏幕上的任意位置并获得响应(使用 Toast 确认)。

不工作:

  • 无法在屏幕上的任何位置拖动图像并将图像存放在手指抬起的位置

我尝试了很多不同的方法,但总是编译错误。查看我的代码,任何人都可以推荐一种干净简单的方法将图像放置在 ACTION_DRAG_ENDED (请记住,我是初学者)

这是我的java代码:

public class MainActivity extends Activity {
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.activity_main, menu);
    return true;
}

boolean okToDrop;

/** Called when the activity is first created. */
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    findViewById(R.id.oval).setOnTouchListener(new theTouchListener());
    findViewById(R.id.square).setOnTouchListener(new theTouchListener());
    findViewById(R.id.robot).setOnTouchListener(new theTouchListener());
    findViewById(R.id.oval).setOnDragListener(new theDragListener());
    findViewById(R.id.square).setOnDragListener(new theDragListener());
    findViewById(R.id.robot).setOnDragListener(new theDragListener());
}

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

class theDragListener implements OnDragListener {
    @Override
    public boolean onDrag(View view, DragEvent dragEvent) {
        int dragAction = dragEvent.getAction();
        View dragView = (View) dragEvent.getLocalState();
        if (dragAction == DragEvent.ACTION_DRAG_EXITED) {
            okToDrop = false;
        } else if (dragAction == DragEvent.ACTION_DRAG_ENTERED) {
            okToDrop = true;
        } else if (dragAction == DragEvent.ACTION_DRAG_ENDED) {
            if (dropEventNotHandled(dragEvent) == true) {

                // Code to generate image goes here ***********************

                Context context = getApplicationContext();
                CharSequence text = "Action Dropped Not In Box!";
                int duration = Toast.LENGTH_SHORT;
                Toast toast = Toast.makeText(context, text, duration);
                toast.show();

                dragView.setVisibility(View.VISIBLE);
            }
        } else if (dragAction == DragEvent.ACTION_DROP && okToDrop) {
            ImageView i = (ImageView) findViewById(R.id.square);
            i.setImageResource(R.drawable.oval);

            dragView.setVisibility(View.INVISIBLE);

            Context context = getApplicationContext();
            CharSequence text = "Action Resulted In It Being Dropped In The Box";
            int duration = Toast.LENGTH_SHORT;
            Toast toast = Toast.makeText(context, text, duration);
            toast.show();

        }
        return true;
    }

    private boolean dropEventNotHandled(DragEvent dragEvent) {
        return !dragEvent.getResult();
    }

}

我的xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >

    <ImageView
        android:id="@+id/square"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_centerVertical="true"
        android:src="@drawable/square_box" />

    <ImageView
        android:id="@+id/oval"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_marginLeft="58dp"
        android:layout_marginTop="58dp"
        android:src="@drawable/oval" />

    <ImageView
        android:id="@+id/robot"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/oval"
        android:layout_below="@+id/square"
        android:layout_marginTop="70dp"
        android:src="@drawable/ic_launcher" />

</RelativeLayout>
4

2 回答 2

1

虽然我不确定我的实现是否是最好的方法,但它确实有效。

在您的 MainActivity 中添加这些成员:

View root; // references root activity view
float dropX, dropY; // records position of where finger was lifted on the root

在您的 onCreate() 中:

root = findViewById(android.R.id.content); // get reference to root
// add a Draglistener to your root view
root.setOnDragListener(new OnDragListener() {
    @Override
    public boolean onDrag(View v, DragEvent event) {
        int action = event.getAction();
        if(action == DragEvent.ACTION_DROP) {
            // record position of finger lift
            dropX = event.getX();
            dropY = event.getY();
        }
        return false;
    }
});

最后,将这些行放在// Code to generate image goes here

dragView.setX(dropX - dragView.getWidth() / 2);
dragView.setY(dropY - dragView.getHeight() / 2);

希望这可以帮助。

于 2013-02-21T06:20:02.957 回答
0

好的!所以你的问题是没有使用相同的拖动监听器。

findViewById(R.id.oval).setOnDragListener(new theDragListener());

应该

theDragListener draglistener = new theDragListener();
findViewById(R.id.oval).setOnDragListener(draglistener);
于 2015-02-10T11:36:06.910 回答