Как применить imageView к анимации сенсорного масштаба в Android? - PullRequest
0 голосов
/ 31 октября 2018

Я хочу применить анимацию всякий раз, когда пользователь нажимает на кнопку, например -

  1. при касании / наведении = уменьшение,
  2. вывести палец за пределы вида = масштабировать до предыдущей позиции,
  3. при отпускании / клик = масштаб до предыдущей позиции

Анимация при касании работает отлично, но я не могу определить масштабирование анимации до ее предыдущей позиции при отпускании пальца. Кроме того, я не слишком знаком с событием касания Motion, поэтому, пожалуйста, скажите мне, какое событие движения будет подходящим для этого. Кто-нибудь может мне помочь, пожалуйста. вот мой код:

imageView.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {

                switch (event.getAction()) {

                    case MotionEvent.ACTION_DOWN:
                        imageView.animate().scaleX(0.5f).scaleY(0.5f).start();
                        break;

                    case MotionEvent.ACTION_CANCEL:
                        imageView.animate().scaleX(2.0f).scaleY(2.0f).start();
                        break;

                    case MotionEvent.ACTION_UP:
                        imageView.animate().scaleX(2.0f).scaleY(2.0f).start();

                        startActivity(new Intent(ActivityOne.this, ActivityTwo.class));
                        break;
                }
                return true;
            }
        });

Я также пробовал с объектным аниматором, что-то вроде этого:

private void scaleAnimation(View view) {
        ObjectAnimator scaleDownX = ObjectAnimator.ofFloat(view, "scaleX", 0.5f);
        ObjectAnimator scaleDownY = ObjectAnimator.ofFloat(view, "scaleY", 0.5f);
        scaleDownX.setDuration(150);
        scaleDownY.setDuration(150);
        //scaleDownX.setRepeatMode(ValueAnimator.REVERSE);
        //scaleDownY.setRepeatMode(ValueAnimator.REVERSE);
        //scaleDownX.setRepeatCount(1);
        //scaleDownY.setRepeatCount(1);

        animatorSet = new AnimatorSet();
        //animatorSet.play(scaleDownX).with(scaleDownY);
        animatorSet.playTogether(scaleDownX, scaleDownY);
        animatorSet.start();
}

1 Ответ

0 голосов
/ 31 октября 2018

Хорошо, после долгого эксперимента я нашел ответ сам. Вот оно:

После касания, если пользователь двигает пальцем, нам нужно отменить нажатие кнопки

boolean isMove;
// initialize
isMove = false;

Установить анимацию уменьшения и увеличения

private void startScaleAnimation(View view) {
        ObjectAnimator scaleDownX = ObjectAnimator.ofFloat(view, "scaleX", 0.8f);
        ObjectAnimator scaleDownY = ObjectAnimator.ofFloat(view, "scaleY", 0.8f);
        scaleDownX.setDuration(150);
        scaleDownY.setDuration(150);

        scaleDownX.start();
        scaleDownY.start();
    }

    private void cancelScaleAnimation(View view) {
        ObjectAnimator scaleDownX = ObjectAnimator.ofFloat(view, "scaleX", 1.0f);
        ObjectAnimator scaleDownY = ObjectAnimator.ofFloat(view, "scaleY", 1.0f);
        scaleDownX.setDuration(150);
        scaleDownY.setDuration(150);

        scaleDownX.start();
        scaleDownY.start();
    }

Теперь примените эту анимацию вместе со слушателем onTouch

imageView.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {

                switch (event.getAction()) {

                    case MotionEvent.ACTION_DOWN:
                        startScaleAnimation(imageView);
                        break;

                    case MotionEvent.ACTION_MOVE:
                        cancelScaleAnimation(imageView);
                        isMove =true;
                        break;

                    case MotionEvent.ACTION_UP:
                        cancelScaleAnimation(imageView);

                        if (!isMove){
                            isMove = false;
                            Handler handler = new Handler();
                            handler.postDelayed(new Runnable() {
                                @Override
                                public void run() {

                                    startActivity(new Intent(ActivityOne.this, ActivityTwo.class));

                                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                                        overridePendingTransition(R.anim.enter_slide_left, R.anim.exit_slide_left);
                                    }

                                }
                            },150);
                        }else {
                            isMove = false;
                        }

                        break;
                }
                return true;
            }
        });
...