如何在android中拖动布局时动态更改布局背景?

时间:2013-10-29 10:05:58

标签: android android-layout

我想在拖动布局时动态更改布局背景。

我使用以下代码进行触控侦听。

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

1 个答案:

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