2013-10-29 97 views
0

我想在拖动布局的同时动态更改布局的背景。如何在Android中拖动布局时动态更改布局背景?

我用下面的代码来实现触摸监听器。

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

我想在拖动它的同时更改布局的背景,但无法在任何DragEvents中做到这一点 – user1891910

+0

您可以显示代码将“MyTouchListener”和“MyDragListener”设置为View的代码? –

回答

0

在您需要在开始拖动之前,因为一旦你拨打view.startDrag(),视图被复制到改变背景的onTouchListener。然后,当拖动结束并且再次变为可见时,您需要将背景重置为开始时的背景(或任何其他您想要的背景)。

下面显示了如何工作的:

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; 
    } 
}