如何在Android中使用拖动阴影生成器移动整个视图? [英] How to move the entire view using drag shadow builder in android?

查看:109
本文介绍了如何在Android中使用拖动阴影生成器移动整个视图?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

现在,我在Android中使用拖动构建器类,我可以在视图之间交换数据。但是,我想交换整个视图而不是只是数据。有人可以帮我吗

Now, I am using a drag shadow builder class in Android and I can swap the data between views. But, I want to swap the entire view rather than just the data. Can anyone help me?

例如,如果我有4个TextViews,A,B,C,D和我想要从A移动到C,然后使用拖动阴影生成器我可以移动只有A到C中的数据。但是,我想将完整的textview从一个位置移动到另一个位置。如何实现?

For example, if I have 4 TextViews, A,B,C,D and I want move from A to C, then, using the Drag Shadow Builder I can move only data inside A to C. But, I want to move the complete textview from one position to another. How do I achieve it?

//这里我们声明在触摸监听器上聆听触摸事件

//Here we declare On touch Listener to listen to the touch events

View.OnTouchListener longListen = new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {

        int action = event.getAction();
        switch (action & MotionEvent.ACTION_MASK ) {
            case MotionEvent.ACTION_DOWN: {

                DragShadow ds = new DragShadow(v);
                ClipData data = ClipData.newPlainText("","");
                v.startDrag(data,ds,v,0);
                return false;
            }

            case MotionEvent.ACTION_MOVE:
                break;

            case MotionEvent.ACTION_CANCEL:
                break;

            case MotionEvent.ACTION_UP:
                break;
        }

        return true;
    }
};

//这里我们设置拖动监听器来监听事件的下降

// Here we set the drag listener to listen to the drop of the event

View.OnDragListener dropListener = new View.OnDragListener() {


        @Override
        public boolean onDrag(View v, DragEvent event) {

            int dragEvent = event.getAction();

            switch (dragEvent)
            {
               //case DragEvent

            case DragEvent.ACTION_DRAG_STARTED:
                    break;

            case DragEvent.ACTION_DRAG_ENTERED :
                    break;

            case DragEvent.ACTION_DRAG_ENDED:
                    break;

            case DragEvent.ACTION_DRAG_EXITED:
                    break;

            case DragEvent.ACTION_DRAG_LOCATION:
                    break;

            case DragEvent.ACTION_DROP:

                    View view = (View) event.getLocalState();
                    ViewGroup owner = (ViewGroup) view.getParent();


                        Button target = (Button) v;
                        String target_og = target.getText().toString();
                        Button dragged = (Button) event.getLocalState();
                        String dragged_og = dragged.getText().toString();    
                        dragged.setText(target_og);    
                        target.setText(dragged_og);   
                        return true;

            }

            return true;
        }
    };


推荐答案

好的,所以你需要做的就是这个:

Ok, so what you need to do is something like this:

 private class DragShadow extends View.DragShadowBuilder {
    View greyBox;

    public DragShadow(View view) {
        super(view);
        greyBox = view;
    }

    @Override
    public void onDrawShadow(Canvas canvas) {
        greyBox.draw(canvas);
    }

    @Override
    public void onProvideShadowMetrics(Point shadowSize, Point shadowTouchPoint) {
        View v = getView();
        int height = v.getHeight();
        int width = v.getWidth();
        shadowSize.set(width, height);
        shadowTouchPoint.set((width / 2), (height / 2));
    }
}


View.OnLongClickListener longListen = new View.OnLongClickListener() {
    @Override
    public boolean onLongClick(View v) {
        DragShadow ds = new DragShadow(v);
        ClipData data = ClipData.newPlainText("","");
        v.startDrag(data,ds,v,0);
        v.setVisibility(View.INVISIBLE);
        return false;
    }

};


 View.OnDragListener dropListener1 = new View.OnDragListener() {
    @Override
    public boolean onDrag(View v, DragEvent event) {
        int dragEvent = event.getAction();
        switch (dragEvent)
        {
            case DragEvent.ACTION_DRAG_STARTED:
            case DragEvent.ACTION_DRAG_ENTERED :
            case DragEvent.ACTION_DRAG_LOCATION:
            case DragEvent.ACTION_DRAG_ENDED:
            case DragEvent.ACTION_DRAG_EXITED:
                break;
            case DragEvent.ACTION_DROP:
                View dragged = (View) event.getLocalState();
                LinearLayout owner = (LinearLayout) dragged.getParent();
                int draggedPosition = owner.indexOfChild(dragged);
                int targetPosition = owner.indexOfChild(v);
                owner.removeView(dragged);
                owner.removeView(v);
                if (draggedPosition > targetPosition) {
                    owner.addView(dragged, targetPosition);
                    owner.addView(v, draggedPosition);
                } else {
                    owner.addView(dragged, targetPosition - 1);
                    owner.addView(v, draggedPosition);
                }
                dragged.setVisibility(View.VISIBLE);
        }
        return true;
    }
};

这篇关于如何在Android中使用拖动阴影生成器移动整个视图?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆