Как настроить функции onTouch и onClick для подвижной плавающей кнопки - PullRequest
2 голосов
/ 08 апреля 2019

Я сделал подвижную плавающую кнопку, ссылаясь на какой-то документ где-то здесь, теперь он может касаться, перетаскивать в любом месте экрана. Но я обновляю фрагмент щелчка этой подвижной плавающей кнопки. Я могу коснуться, но не могу щелкнуть по нему.

public class MainScreen extends Fragment implements View.OnTouchListener {

    FloatingActionButton fab;

    FrameLayout rootlayout;
    int x_Delta;
    int y_delta;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {

        View rootView = inflater.inflate(R.layout.activity_main_screen, container, false);

        fab = (FloatingActionButton)rootView.findViewById(R.id.fab);
        rootlayout = (FrameLayout) rootView.findViewById(R.id.rootlayout);


        FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(150, 150);
        fab.setLayoutParams(layoutParams);
        fab.setOnTouchListener(MainScreen.this);


        fab.setOnClickListener(new View.OnClickListener() {
           @Override
            public void onClick(View v) {
               getFragmentManager().beginTransaction().detach(MainScreen.this).attach(MainScreen.this).commit();

            }
        });


        return rootView;
    }

    public boolean onTouch(View view, MotionEvent event) {
        final int X = (int) event.getRawX();
        final int Y = (int) event.getRawY();
        switch (event.getAction() & MotionEvent.ACTION_MASK) {
            case MotionEvent.ACTION_DOWN:
                FrameLayout.LayoutParams lParams = (FrameLayout.LayoutParams) view.getLayoutParams();
                x_Delta = X - lParams.leftMargin;
                y_delta = Y - lParams.topMargin;
                break;
            case MotionEvent.ACTION_UP:
                if(Math.abs(event.getRawX()- X )<=2){
                    getFragmentManager().beginTransaction().detach(MainScreen.this).attach(MainScreen.this).commit();
                    return true;
                }
                break;
            case MotionEvent.ACTION_POINTER_DOWN:
                break;
            case MotionEvent.ACTION_POINTER_UP:

                break;
            case MotionEvent.ACTION_MOVE:
                FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) view
                        .getLayoutParams();
                layoutParams.leftMargin = X - x_Delta;
                layoutParams.topMargin = Y - y_delta;
                layoutParams.rightMargin = -250;
                layoutParams.bottomMargin = -250;
                view.setLayoutParams(layoutParams);
                break;
        }
        rootlayout.invalidate();
        return true;
    }
}

Ответы [ 2 ]

0 голосов
/ 08 апреля 2019

В Android сенсорный слушатель будет запущен раньше, чем прослушиватель щелчков, и поскольку вы возвращаете true, сенсорный слушатель говорит системе прервать дальнейших слушателей.

Так что для решения этой проблемы вам нужно добавитьview.performClick(); под ACTION_UP

0 голосов
/ 08 апреля 2019

Добавить новую переменную boolean.

FrameLayout rootlayout;
int x_Delta;
int y_delta;
boolean moveStarted;

Затем в onTouch событие

switch (event.getAction() & MotionEvent.ACTION_MASK) {
    case MotionEvent.ACTION_DOWN:
        FrameLayout.LayoutParams lParams = (FrameLayout.LayoutParams) view.getLayoutParams();
        x_Delta = X - lParams.leftMargin;
        y_delta = Y - lParams.topMargin;
        break;
    case MotionEvent.ACTION_UP:
        if (!moveStarted) {
            // do here your click event
        } else {
            if(Math.abs(event.getRawX()- X )<=2) {
                getFragmentManager().beginTransaction().detach(MainScreen.this).attach(MainScreen.this).commit();
            }
            return true;
        }
        moveStarted = false;
        break;
    case MotionEvent.ACTION_POINTER_DOWN:
        break;
    case MotionEvent.ACTION_POINTER_UP:
        break;
    case MotionEvent.ACTION_MOVE:
        moveStarted = true;
        FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) view
                .getLayoutParams();
        layoutParams.leftMargin = X - x_Delta;
        layoutParams.topMargin = Y - y_delta;
        layoutParams.rightMargin = -250;
        layoutParams.bottomMargin = -250;
        view.setLayoutParams(layoutParams);
        break;
}
...