Почему onShowPress() не вызывается?

#android #android-gesture

#Android #android-жест

Вопрос:

У меня довольно сложный макет, который включает в себя recyclerview cardview вложенный в него. В одном из моих действий у меня есть все детали одного cardview элемента. У меня есть вложенный класс, который реализует OnScaleGestureListener и OnGestureListener для масштабирования и перемещения представлений, которые находятся в activity . Все, что работает по назначению, но onShowPress() вообще не вызывается. В результате я не смог получить длинный щелчок по моему представлению.

Вот моя реализация класса:

 public class MyScaleGestures implements View.OnTouchListener, ScaleGestureDetector.OnScaleGestureListener, GestureDetector.OnGestureListener {
        private View view;
        private ScaleGestureDetector gestureScale;
        private float scaleFactor = 1;
        private boolean inScale = false;
        float dX, dY;

        public MyScaleGestures(Context c){ gestureScale = new ScaleGestureDetector(c, this); }

        @Override
        public boolean onTouch(View touchedview, MotionEvent event) {
            //scale the view
                this.view = touchedview;
                gestureScale.onTouchEvent(event);
            switch (event.getAction()){

                case MotionEvent.ACTION_DOWN:
                    dX = view.getX() - event.getRawX();
                    dY = view.getY() - event.getRawY();
                    break;
                case MotionEvent.ACTION_UP:
                        view.animate().x(event.getRawX()   dX)
                                .y(event.getRawY()   dY)
                                .setDuration(0)
                                .start();
                        break;
                default:
                    return false;
            }
            return true;
        }

        @Override
        public boolean onScale(ScaleGestureDetector detector) {
            scaleFactor *= detector.getScaleFactor();
            scaleFactor = (scaleFactor < 1 ? 1 : scaleFactor); // prevent our view from becoming too small //
            scaleFactor = ((float)((int)(scaleFactor * 100))) / 100; // Change precision to help with jitter when user just rests their fingers //
            view.setScaleX(scaleFactor);
            view.setScaleY(scaleFactor);
            return true;
        }

        @Override
        public boolean onScaleBegin(ScaleGestureDetector detector) {
            inScale = true;
            return true;
        }

        @Override
        public void onScaleEnd(ScaleGestureDetector detector) { inScale = false; }


        @Override
        public boolean onDown(MotionEvent motionEvent) {
            return false;
        }

        @Override
        public void onShowPress(MotionEvent motionEvent) {
                    Log.e("clicked?", "I think so");
                    AlertDialog.Builder alert = new AlertDialog.Builder(context);
                    alert.setTitle(getResources().getString(R.string.delete_alert_title));
                    alert.setMessage(getResources().getString(R.string.delete_alert_message));
                    alert.setPositiveButton(getResources().getString(R.string.delete_confirm), new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialogInterface, int i) {
                            picture.setVisibility(View.GONE);
                            btnaddImage.setClickable(false);
                            dialogInterface.dismiss();
                        }
                    });
                    alert.setNegativeButton(getResources().getString(R.string.delete_decline), new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialogInterface, int i) {
                            dialogInterface.dismiss();
                        }
                    });
        }

        @Override
        public boolean onSingleTapUp(MotionEvent motionEvent) {
            return false;
        }

        //@Override
        public boolean onScroll(MotionEvent event1, MotionEvent event2, float x, float y) {
            float newX = view.getX();
            float newY = view.getY();
            if(!inScale){
                newX -= x;
                newY -= y;
            }
            WindowManager wm = (WindowManager) view.getContext().getSystemService(Context.WINDOW_SERVICE);
            Display d = wm.getDefaultDisplay();
            Point p = new Point();
            d.getSize(p);

            if (newX > (view.getWidth() * scaleFactor - p.x) / 2){
                newX = (view.getWidth() * scaleFactor - p.x) / 2;
            } else if (newX < -((view.getWidth() * scaleFactor - p.x) / 2)){
                newX = -((view.getWidth() * scaleFactor - p.x) / 2);
            }

            if (newY > (view.getHeight() * scaleFactor - p.y) / 2){
                newY = (view.getHeight() * scaleFactor - p.y) / 2;
            } else if (newY < -((view.getHeight() * scaleFactor - p.y) / 2)){
                newY = -((view.getHeight() * scaleFactor - p.y) / 2);
            }

            view.setX(newX);
            view.setY(newY);

            return true;
        }

        @Override
        public void onLongPress(MotionEvent motionEvent) {

        }

        @Override
        public boolean onFling(MotionEvent motionEvent, MotionEvent motionEvent1, float v, float v1) {
            return false;
        }
    }
  

Комментарии:

1. попробуйте вернуть false в других событиях . Может быть, другой делегат (слушатель) перехватил ваше событие

2. @Nepster, мне понравилось то, что ты сказал. К сожалению, слушатель просто игнорируется.

3. Вы пытались отладить и обнаружить событие onpress ? Является ли метод onShowPress собственным абстрактным методом scaledetector ?

4. Попробуйте сначала вызвать суперкласс в вашем методе onShowPress в первой строке, добавив super.onShowPress(motionEvent); .

5. Класс вложен в мою основную деятельность. Итак, super не распознает onShowPress.