一个可以拖动的Dialog

目标:自定义dialog,在dialog上晃动,dialog跟着移动.松开后回到原来的位置




package com.android.settings;

import android.app.Dialog;
import android.content.Context;
import android.os.Handler;
import android.os.Message;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.view.MotionEvent;
import android.view.WindowManager;
import android.widget.Scroller;




public class DragDialog extends Dialog implements Handler.Callback {
    private float startx, starty;
    private WindowManager mWindowManager;
    private int oldx, oldy;
    private WindowManager.LayoutParams layoutParams;
    private Scroller scroller;
    private Handler handler;
    float changeX;
    float changeY;
    private int width, height;
    private final static int SCROLLER_HANDLER = 0x711;

    public DragDialog(@NonNull Context context) {
        super(context);
        init(context);
    }

    public DragDialog(@NonNull Context context, int themeResId) {
        super(context, themeResId);
        init(context);
    }

    protected DragDialog(@NonNull Context context, boolean cancelable, @Nullable OnCancelListener cancelListener) {
        super(context, cancelable, cancelListener);
        init(context);
    }

    private void init(Context context) {
        mWindowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
        scroller = new Scroller(context);
        handler = new Handler(this);
    }

    public void setWidth(int width) {
        this.width = width;
    }

    public void setHeigh(int height) {
        this.height = height;
    }

    @Override
    public void dismiss() {
        scroller.abortAnimation();
        handler.removeMessages(SCROLLER_HANDLER);
        super.dismiss();
    }

    @Override
    public void onAttachedToWindow() {
        super.onAttachedToWindow();
        layoutParams = (WindowManager.LayoutParams) getWindow().getDecorView().getLayoutParams();
        if (width != 0) {
            layoutParams.width = width;
        }
        if (height != 0) {
            layoutParams.height = height;
        }
        mWindowManager.updateViewLayout(getWindow().getDecorView(), layoutParams);
        oldx = layoutParams.x;
        oldy = layoutParams.y;
    }

    @Override
    public boolean onTouchEvent(@NonNull MotionEvent event) {

        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                startx = event.getX();
                starty = event.getY();
                break;
            case MotionEvent.ACTION_MOVE:
                changeX = event.getX() - startx;
                changeY = event.getY() - starty;
                translateXY(changeX,changeY);
                break;
            case MotionEvent.ACTION_UP:
            case MotionEvent.ACTION_CANCEL:
                stop();
                break;
            default:
        }
        return super.onTouchEvent(event);
    }


    public void stop() {
        scroller.startScroll(layoutParams.x, layoutParams.y, oldx - layoutParams.x, oldy - layoutParams.y);
        handler.obtainMessage(SCROLLER_HANDLER).sendToTarget();
    }

    private void translateXY(float x, float y) {
        scroller.startScroll(layoutParams.x, layoutParams.y, (int) x, (int) y);
        handler.obtainMessage(SCROLLER_HANDLER).sendToTarget();
    }

    @Override
    public boolean handleMessage(Message msg) {
        if (msg.what == SCROLLER_HANDLER && scroller.computeScrollOffset()) {
            layoutParams.x = scroller.getCurrX();
            layoutParams.y = scroller.getCurrY();
            mWindowManager.updateViewLayout(getWindow().getDecorView(), layoutParams);
            handler.obtainMessage(SCROLLER_HANDLER).sendToTarget();
        }
        return false;
    }
}

猜你喜欢

转载自blog.csdn.net/w1764662543/article/details/82735964