我想在拖动布局时动态更改布局背景。
我使用以下代码进行触控侦听。
RelativeLayout rlImages.setOnDragListener(new MyDragListener());
RelativeLayout half_left.setOnTouchListener(new MyTouchListener());
private final class MyTouchListener implements OnTouchListener {
Drawable normalShape = getResources().getDrawable(R.drawable.pinkcircle);
@SuppressWarnings("deprecation")
public boolean onTouch(View view, MotionEvent motionEvent) {
view.setBackgroundResource(R.drawable.pinkcircle);
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 {
return false;
}
}
}
我的dragListener类:
class MyDragListener implements OnDragListener {
Drawable enterShape = getResources().getDrawable(R.drawable.halfcircle_left);
Drawable normalShape = getResources().getDrawable(R.drawable.pinkcircle);
@SuppressWarnings("deprecation")
@Override
public boolean onDrag(View v, DragEvent event) {
int dragAction = event.getAction();
final View dragView = (View) event.getLocalState();
dragView.setBackgroundDrawable(normalShape);
switch (event.getAction()) {
case DragEvent.ACTION_DRAG_STARTED:
// dragView.setBackgroundDrawable(normalShape);
dragView.setBackgroundDrawable(normalShape);
// Do nothing
break;
case DragEvent.ACTION_DRAG_ENTERED:
dragView.setBackgroundDrawable(normalShape);
// v.setBackgroundDrawable(enterShape);
break;
case DragEvent.ACTION_DRAG_EXITED:
// v.setBackgroundDrawable(normalShape);
break;
case DragEvent.ACTION_DROP:
// Dropped, reassign View to ViewGroup
dragView.setBackgroundDrawable(normalShape);
break;
case DragEvent.ACTION_DRAG_ENDED:
default:
break;
}
return true;
}
}
答案 0 :(得分:0)
在onTouchListener中,您需要在开始拖动之前更改背景,因为一旦调用view.startDrag()
,视图就会重复。然后,当拖动结束并且再次变为可见之前,您需要将背景重置为开头(或任何其他背景)。
以下说明了它的工作原理:
public class MainActivity extends Activity implements OnTouchListener, OnDragListener {
private static final String LOGCAT = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
// doing view stuff...
}
public boolean onTouch(View view, MotionEvent motionEvent) {
if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {
DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(view);
// set background of dragged view to red
view.setBackgroundResource(android.R.color.holo_red_dark);
view.startDrag(null, shadowBuilder, view, 0);
view.setVisibility(View.INVISIBLE);
return true;
} else {
return false;
}
}
public boolean onDrag(View layoutview, DragEvent dragevent) {
int action = dragevent.getAction();
View dragView = (View) dragevent.getLocalState();
switch (action) {
case DragEvent.ACTION_DRAG_STARTED:
Log.d(LOGCAT, "Drag event started");
break;
case DragEvent.ACTION_DRAG_ENTERED:
Log.d(LOGCAT, "Drag event entered into " + layoutview.toString());
break;
case DragEvent.ACTION_DRAG_EXITED:
Log.d(LOGCAT, "Drag event exited from " + layoutview.toString());
break;
case DragEvent.ACTION_DROP:
Log.d(LOGCAT, "Dropped");
// reset background of dragged view
dragView.setBackground(null);
ViewGroup owner = (ViewGroup) dragView.getParent();
owner.removeView(dragView);
LinearLayout container = (LinearLayout) layoutview;
container.addView(dragView);
dragView.setVisibility(View.VISIBLE);
break;
case DragEvent.ACTION_DRAG_ENDED:
Log.d(LOGCAT, "Drag ended");
break;
default:
break;
}
return true;
}
}