如何在Android中拖动时逐渐减小弹出窗口大小?

时间:2014-05-19 14:04:45

标签: android popup resize drag

我需要创建一个弹出窗口的演示,当用户拖动弹出窗口时,它的大小会逐渐减小。大小取决于拖动时用户所覆盖的距离。功能类似于PAPER应用程序(FACEBOOK)。 我可以通过下面的代码拖动弹出窗口。但是代码无法减小弹出窗口的大小,而拖动它会减小释放弹出窗口时的大小。

public class MainActivity extends Activity implements OnTouchListener,
        OnDragListener {
    private static final String LOGCAT = null;
    private LayoutParams layoutParams;

    ImageView img;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        img = (ImageView) findViewById(R.id.textView1);
        img.setOnTouchListener(this);
        findViewById(R.id.pinkLayout).setOnDragListener(this);
        findViewById(R.id.yellowLayout).setOnDragListener(this);
    }

    public boolean onTouch(View view, MotionEvent motionEvent) {
        if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {
            layoutParams = (LayoutParams) img.getLayoutParams();
            DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(view);
            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();
        switch (action) {

        case DragEvent.ACTION_DRAG_LOCATION:

            Toast.makeText(getApplicationContext(), "" + dragevent.getX(),
                    Toast.LENGTH_SHORT).show();

            layoutParams.height = (int) dragevent.getX();
            layoutParams.width = (int) dragevent.getX();

            img.setLayoutParams(layoutParams);

            break;

        case DragEvent.ACTION_DRAG_STARTED:

            System.out.println("Action drag started");

            /*
             * Log.d(LOGCAT, "Drag event started");
             * 
             * System.out.println("Drag event started");
             */

            break;
        case DragEvent.ACTION_DRAG_ENTERED:
            System.out.println("Action drag entered");
            /*
             * System.out.println("Drag event entered into " +
             * layoutview.toString()); Log.d(LOGCAT, "Drag event entered into "
             * + layoutview.toString());
             */
            break;
        case DragEvent.ACTION_DRAG_EXITED:
            System.out.println("Action drag exited");
            /*
             * System.out.println("Drag event exited from " +
             * layoutview.toString());
             * 
             * Log.d(LOGCAT, "Drag event exited from " + layoutview.toString());
             */
            break;
        case DragEvent.ACTION_DROP:
            System.out.println("Action drag drop");
            // Log.d(LOGCAT, "Dropped");
            View view = (View) dragevent.getLocalState();
            ViewGroup owner = (ViewGroup) view.getParent();
            owner.removeView(view);
            LinearLayout container = (LinearLayout) layoutview;
            container.addView(view);
            view.setVisibility(View.VISIBLE);
            break;
        case DragEvent.ACTION_DRAG_ENDED:

            System.out.println("Action drag ended");

            /* Log.d(LOGCAT, "Drag ended"); */
            break;
        default:
            break;
        }
        return true;
    }
}

任何人都可以告诉我如何处理我的存在代码以实现上述功能。感谢

1 个答案:

答案 0 :(得分:0)

对于我100%精确的答案,我需要更多关于您的应用程序工作的详细信息。根据你所写的内容,我认为" popup"将在你的手指下移动,你想在移动时调整它的大小。

解决方案非常简单。你必须做两件事:

  1. 创建一个虚拟阴影生成器类,以便在移动视图时不显示任何阴影(更改阴影大小很棘手,但根据我的理解,您根本不需要阴影......)。你可以这样做:

    public class DummyShadowBuilder extends View.DragShadowBuilder {
    
        @Override
        public void onDrawShadow(Canvas canvas) {
        }
    
        @Override
        public void onProvideShadowMetrics(Point shadowSize, Point touchPoint) {
        }
    }
    

    并将其用作拖动的阴影构建器:

    DummyShadowBuilder shadowBuilder = new DummyShadowBuilder();
    view.startDrag(null, shadowBuilder, view, 0);
    
  2. 控制

    中拖动视图的大小和位置
    case DragEvent.ACTION_DRAG_LOCATION
    

    使用旧代码的示例:

    public boolean onDrag(View layoutview, DragEvent dragevent) {
        int action = dragevent.getAction();
        switch (action) {
            case DragEvent.ACTION_DRAG_LOCATION:
                //CONTROL POSITION AND SIZE OF DRAGGED VIEW
    
                //EXAMPLE USING YOUR OLD CODE (previously in ACTION_DRAG_ENDED):
                int x = (int) dragevent.getX();
                int y = (int) dragevent.getY();
    
                layoutParams.height = x;
                layoutParams.width = x;
    
                img.setLayoutParams(layoutParams);
    
                View view = (View) dragevent.getLocalState();
                ViewGroup owner = (ViewGroup) view.getParent();
                owner.removeView(view);
                LinearLayout container = (LinearLayout) layoutview;
                container.addView(view);
                view.setVisibility(View.VISIBLE);
    
                break;
            case DragEvent.ACTION_DRAG_STARTED:
                break;
            case DragEvent.ACTION_DRAG_ENTERED:
                break;
            case DragEvent.ACTION_DRAG_EXITED:
                break;
            case DragEvent.ACTION_DROP:
                break;
            case DragEvent.ACTION_DRAG_ENDED:
                break;
            default:
                break;
            }
        return true;
    }