Как установить функции onTouch и onClick для подвижной плавающей кнопки

#java #android #floating-action-button

#java #Android #кнопка плавающего действия

Вопрос:

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

 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() amp; 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;
    }
}
  

Ответ №1:

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

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

Затем , в onTouch случае

 switch (event.getAction() amp; 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;
}
  

Ответ №2:

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

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