Search code examples
javaandroidandroid-animationontouchlistenerobjectanimator

How to apply imageView on touch scale animation in android?


I want to apply some animation whenever user touch on button, like-

  1. on touch/hover = scale down,
  2. move finger out of the view bound = scale up to previous position,
  3. on release/click = scale up to previous position

On touch animation is working perfectly but I am unable to figure out scale up animation to it's previous position when finger is being released. Also I am not too much familiar with Motion touch event, so please tell me which Motion Event will be appropriate to do this. Can anyone please help me. here is my code:

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

I have also tried with object animator, something like that:

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

Solution

  • Alright after a long experiment I have discovered the answer by myself. Here it is:

    After touch, if user move his finger then we need to cancel button click

    boolean isMove;
    // initialize
    isMove = false;
    

    Set scale down and scale up animation

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

    Now, apply this animation along with onTouch listener

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