こんばんは
次のように、ドラッグ可能なビューで onTouchListener を使用し、ドラッグ ゾーン ビューで onDragListener を使用して、ドラッグ アンド ドロップを実装しようとしています。
これが MyDragListener です。
class MyDragListener implements OnDragListener {
Drawable enterShape = getResources().getDrawable(R.drawable.ic_launcher);
Drawable normalShape = getResources().getDrawable(R.drawable.ic_launcher);
@Override
public boolean onDrag(View v, DragEvent event) {
int action = event.getAction();
switch (event.getAction()) {
/*Some irrelevant cases*/
case DragEvent.ACTION_DROP:
// Dropped, reassign View to ViewGroup
View view = (View) event.getLocalState();
ViewGroup owner = (ViewGroup) view.getParent();
owner.removeView(view);
FrameLayout container;
container = (FrameLayout) v;
container.addView(view);
view.setX(event.getX());
view.setY(event.getY());
view.setVisibility(View.VISIBLE);
break;
default:
break;
}
return true;
}
}
そして、このリスナーを私の例ではframeLayoutであるドラッグゾーンに次のように割り当てています:
FrameLayout f= (FrameLayout) findViewById(id.FrameLayout);
f.setOnDragListener(new MyDragListener());
レイアウトは次のとおりです。
<FrameLayout
android:id="@+id/FrameLayout"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="0.8">
<ImageView
android:contentDescription="This is the main panel of the program"
android:id="@+id/imageView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/blank"
android:isScrollContainer="true"
/>
<Button
android:id="@+id/DraggableButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Drag me -_-"
/>
問題は、生の X、Y 座標しか取得できず、正確な結果が得られなかったことです....
これをonTouchListenerで処理しようとしました(そしてDragListenerにipを与えました)。これにより、コンテナの座標が得られ、ドラッグ中に正確な結果が得られましたが、ビューをドロップすると消えました。MyTouchListener コードは次のとおりです。
private final class MyTouchListener implements OnTouchListener {
@Override
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.INVISIBLE);
return true;
}
else
if(motionEvent.getAction()==MotionEvent.ACTION_UP)
{
// View view = (View) motionEvent.getLocalState();
view.setX(motionEvent.getX());
view.setY(motionEvent.getY());
view.setVisibility(View.VISIBLE);
return true;
}
return false;
}
}
誰か私が何をすべきか教えてもらえますか?