可移动布局(适用于WindowManager)

来源:互联网 发布:sql decode函数 编辑:程序博客网 时间:2024/05/18 03:58
public class MoveClickView extends RelativeLayout{    private float mTouchX;    private float mTouchY;    private float x;    private float y;    private float mStartX;    private float mStartY;    private OnClickListener mClickListener;    private WindowManager windowManager = (WindowManager) getContext()            .getApplicationContext().getSystemService(Context.WINDOW_SERVICE);    // 此windowManagerParams变量为获取的全局变量,用以保存悬浮窗口的属性    private WindowManager.LayoutParams windowManagerParams = ((AnBangApp) getContext()            .getApplicationContext()).getWindowParams();    public MoveClickView(Context context)    {        super(context);    }    public MoveClickView(Context context, AttributeSet attrs)    {        super(context, attrs);    }    public MoveClickView(Context context, AttributeSet attrs, int defStyleAttr)    {        super(context, attrs, defStyleAttr);    }    @Override    public boolean onTouchEvent(MotionEvent event)    {        //获取到状态栏的高度        Rect frame = new Rect();        getWindowVisibleDisplayFrame(frame);        int statusBarHeight = frame.top - 48;        System.out.println("statusBarHeight:" + statusBarHeight);        // 获取相对屏幕的坐标,即以屏幕左上角为原点        x = event.getRawX();        y = event.getRawY() - statusBarHeight; // statusBarHeight是系统状态栏的高度        switch (event.getAction())        {            case MotionEvent.ACTION_DOWN: // 捕获手指触摸按下动作                // 获取相对View的坐标,即以此View左上角为原点                mTouchX = event.getX();                mTouchY = event.getY();                mStartX = x;                mStartY = y;                Log.i(AnBangApp.TAG, "startX" + mTouchX + "====startY"                        + mTouchY);                break;            case MotionEvent.ACTION_MOVE: // 捕获手指触摸移动动作                updateViewPosition();                break;            case MotionEvent.ACTION_UP: // 捕获手指触摸离开动作                updateViewPosition();                mTouchX = mTouchY = 0;                if ((x - mStartX) < 5 && (y - mStartY) < 5)                {                    if (mClickListener != null)                    {                        mClickListener.onClick(this);                    }                }                break;        }        return true;    }    @Override    public void setOnClickListener(OnClickListener l)    {        this.mClickListener = l;    }    private void updateViewPosition()    {        // 更新浮动窗口位置参数        windowManagerParams.x = (int) (x - mTouchX);        windowManagerParams.y = (int) (y - mTouchY);        windowManager.updateViewLayout(this, windowManagerParams); // 刷新显示    }}

阅读全文
0 0
原创粉丝点击