可拖動的小控件

 private void initListener() {
        Looper.myQueue().addIdleHandler(new MessageQueue.IdleHandler() {
            @Override
            public boolean queueIdle() {
                String location = GlobalConfigManage.getInstances().getInfoValue(GlobalConfigManage.KEY_SHORTCUT_LOCATION);

                if (!TextUtils.isEmpty(location)) {
                    String[] array = location.split(",");
                    if (array.length == 2) {
                        String num1 = array[0];
                        String num2 = array[1];
                        float x = TextUtils.isEmpty(num1) ? 0 : Float.parseFloat(num1);
                        float y = TextUtils.isEmpty(num2) ? 0 : Float.parseFloat(num2);
                        x = Math.max(Math.min(screenWidth - shortCut.getWidth(), x), 0);
                        y = Math.max(0, Math.min(screenHeight - shortCut.getHeight() - virtualHeight - statusHeight - tabBarHeight, y));
                        shortCut.setX(x);
                        shortCut.setY(y);
                    }
                }

                return false;
            }
        });

 

        shortCut.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View view) {
                bMove = true;

                return true;
            }
        });

 

        shortCut.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                int rawX = (int) event.getRawX();
                int rawY = (int) event.getRawY();
                switch (event.getAction() & MotionEvent.ACTION_MASK) {
                    case MotionEvent.ACTION_DOWN:
                        bMove = false;
                        lastX = rawX;
                        lastY = rawY;
                        break;
                    case MotionEvent.ACTION_MOVE:
                        bMove = true;
                        //計算手指移動了多少
                        int dx = rawX - lastX;
                        int dy = rawY - lastY;

                        //這裏修復一些手機無法觸發點擊事件的問題
                        int distance = (int) Math.sqrt(dx * dx + dy * dy);

                        if (distance < 3) {
                            //給個容錯範圍,不然有部分手機還是無法點擊
                            bMove = false;
                            break;
                        }

                        float x = shortCut.getX() + dx;
                        float y = shortCut.getY() + dy;

                        //檢測是否到達邊緣 左上右下
                        x = Math.max(Math.min(screenWidth - shortCut.getWidth(), x), 0);
                        y = Math.max(0, Math.min(screenHeight - shortCut.getHeight() - virtualHeight - statusHeight - tabBarHeight, y));

                        shortCut.setX(x);
                        shortCut.setY(y);

                        lastX = rawX;
                        lastY = rawY;
                        GlobalConfigManage.getInstances().saveInfoValue(GlobalConfigManage.KEY_SHORTCUT_LOCATION, x + "," + y + "");
                        break;
                    case MotionEvent.ACTION_UP:
                        if (bMove) {
                            //恢復按壓效果
                            shortCut.setPressed(false);
                        }
                        break;
                }

                //如果是拖拽則消耗事件,否則正常傳遞即可。
                return bMove || onTouchEvent(event);
            }
        });
    }

 

// 保存上次移動的位置

public void saveInfoValue(String key, String value) {
    SharedPreferences sharedPreferences = Envi.appContext.getSharedPreferences(XML_GLOBAL_CONFIG_NAME, Context.MODE_PRIVATE);
    Editor editor = sharedPreferences.edit();// 獲取編輯器
    editor.putString(key, value);
    editor.apply();//提交修改
}

/**
 * 獲取用戶配置接口
 *
 * @return
 */
public String getInfoValue(String key) {
    SharedPreferences share = Envi.appContext.getSharedPreferences(XML_GLOBAL_CONFIG_NAME, Context.MODE_PRIVATE);
    String infoValue = share.getString(key, "");
    return infoValue;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章