【发布时间】:2013-12-17 07:20:31
【问题描述】:
我正在创建拖放文本视图,我需要此文本视图也可以单击。 我的代码如下:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/root"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/bg_grey"
android:orientation="vertical" >
<GridView
android:id="@+id/gridview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:background="@color/bg_grey"
android:clickable="true"
android:columnWidth="100dp"
android:gravity="center"
android:horizontalSpacing="10dp"
android:numColumns="2"
android:stretchMode="columnWidth"
android:verticalSpacing="10dp" />
<TextView
android:id="@+id/drag_drop_button"
android:layout_width="80dp"
android:layout_height="80dp"
android:layout_marginLeft="255dp"
android:layout_marginTop="155dp"
android:background="@drawable/circle_button"
android:clickable="true"
android:focusable="true"
android:focusableInTouchMode="true"
android:gravity="center"
android:text="@string/brand"
android:textColor="@color/sign_blue"
android:textSize="15sp"
android:textStyle="bold" />
</FrameLayout>
class ButtonDragListener implements OnDragListener {
Drawable normalShape = getResources().getDrawable(
R.drawable.circle_button);
@Override
public boolean onDrag(View v, DragEvent event) {
int action = event.getAction();
switch (event.getAction()) {
case DragEvent.ACTION_DRAG_STARTED:
// do nothing
break;
case DragEvent.ACTION_DRAG_ENTERED:
// do nothing
break;
case DragEvent.ACTION_DRAG_EXITED:
// do nothing
break;
case DragEvent.ACTION_DROP:
// Dropped, reassign View to ViewGroup
View view = (View) event.getLocalState();
view.setX(event.getX());
view.setY(event.getY());
ViewGroup owner = (ViewGroup) view.getParent();
owner.removeView(view);
FrameLayout container = (FrameLayout) v;
container.addView(view);
view.setVisibility(View.VISIBLE);
break;
case DragEvent.ACTION_DRAG_ENDED:
// do nothing
break;
default:
break;
}
return true;
}
}
private final class ButtonTouchListener implements OnTouchListener {
private static final int MAX_CLICK_DURATION = 200;
private long startClickTime;
public boolean onTouch(View view, MotionEvent motionEvent) {
if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {
startClickTime = Calendar.getInstance().getTimeInMillis();
ClipData data = ClipData.newPlainText("", "");
DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(
view);
view.startDrag(data, shadowBuilder, view, 0);
view.setVisibility(View.VISIBLE);
} else if (motionEvent.getAction() == MotionEvent.ACTION_UP) {
long clickDuration = Calendar.getInstance().getTimeInMillis()
- startClickTime;
if (clickDuration < MAX_CLICK_DURATION){
view.performClick();
}
}
return true;
}
}
private final class ButtonOnClickListener implements OnClickListener {
@Override
public void onClick(View v) {
Log.e(TAG, "ALOHAAAAA");
}
}
TextView dragDrop = (TextView) view.findViewById(R.id.drag_drop_button);
dragDrop.setAlpha(0.7f);
dragDrop.setOnClickListener(new ButtonOnClickListener());
dragDrop.setOnTouchListener(new ButtonTouchListener());
frameLayout = (FrameLayout) view.findViewById(R.id.root);
frameLayout.setOnDragListener(new ButtonDragListener());
但是MotionEvent.ACTION_UP 永远不会被调用,我也试图将view.performClick() 移动到MotionEvent_ACTION_DOWN 内,点击监听器调用正常,但每当我拖动文本视图时,点击监听器也会运行。
我也有 setOnTouchListener 和 setOnClickListener 直接来自 textView 但结果是一样的。
我需要的是平滑的拖放和点击功能。请告诉我在这里做错了什么。 谢谢您,非常感谢您提供的任何帮助。
【问题讨论】:
标签: android drag-and-drop onclicklistener ontouchlistener