-1

I want to animate an ImageView in such a way that it starts moving from its initial position to a button (move ImageView upside) and again back to its initial position and this repeats infinitely. I am totally new to animating things so please guide me how to do it?

my layout.xml is as follows:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    tools:context=".fragment.Scratch1Fragment">

    <android.support.constraint.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <Button
            android:id="@+id/btn_scratch_now"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            style="@style/buttonStyle"
            android:text="@string/str_scratch_now"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintVertical_bias="0.2"/>

        <View
            android:id="@+id/upper_bound"
            android:layout_width="match_parent"
            android:layout_height="2dp"
            android:background="@color/primary"
            android:layout_marginEnd="10dp"
            android:layout_marginStart="10dp"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintVertical_bias="0.5"/>

        <TextView
            android:id="@+id/text_view"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@string/str_scratch"
            style="@style/tvDarkLargeStyle"
            android:gravity="center"
            android:textAlignment="center"
            app:layout_constraintTop_toBottomOf="@+id/upper_bound"
            />

        <View
            android:id="@+id/lower_bound"
            android:layout_width="match_parent"
            android:layout_height="2dp"
            android:background="@color/primary"
            android:layout_marginEnd="10dp"
            android:layout_marginStart="10dp"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/text_view"
            />

        <TextView
            android:id="@+id/tv_tap_here"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintTop_toBottomOf="@id/lower_bound"
            android:layout_margin="20dp"
            android:padding="10dp"
            android:gravity="center"
            style="@style/tvLightLargeStyle"
            android:textAlignment="center"
            android:text="Tap here"/>

        <ImageView
            android:id="@+id/img_hand"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/clicker_hand_64"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintBottom_toBottomOf="@+id/upper_bound"/>

    </android.support.constraint.ConstraintLayout>

</FrameLayout>

Please feel free to ask for more code or more details if my question sounds unclear.

Update

After getting some resources to begin with I tried it and I found below code. but somehow I can not get the position of button's float (It is always returning 0.)

My code is as below:

private void animate() {
    Log.e("button top", String.valueOf(btnScratch.getTop()));

    int location[] = new int[2];
    btnScratch.getLocationOnScreen(location);
    Log.e("button location x and y",location[0]+" "+location[1]);

    int location2[] = new int[2];
    imgHand.getLocationOnScreen(location2);
    Log.e("image location x and y",location2[0]+" "+location2[1]);

    ValueAnimator valueAnimator = ValueAnimator.ofFloat(0f, btnScratch.getTop());
    valueAnimator.setInterpolator(new AccelerateDecelerateInterpolator()); // increase the speed first and then decrease
    valueAnimator.setDuration(1000);
    valueAnimator.setRepeatCount(ValueAnimator.INFINITE);
    valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
        @Override
        public void onAnimationUpdate(ValueAnimator animation) {
            float progress = (float) animation.getAnimatedValue();
            imgHand.setTranslationY(progress);
            // no need to use invalidate() as it is already present in             //the text view.
        }
    });
    valueAnimator.start();
}

I have also tried same with ObjectAnimatior instead of ValueAnimator. But did not work.

Riddhi Shah
  • 3,092
  • 5
  • 36
  • 56

2 Answers2

0

Finally, I found my answer with the help of all the comments and links provided in that. I don't know whether it is the ideal solution or not but it is working. If anyone has a better solution please provide that.

What I did for getting the position of the button (which was 0 before the solution).

btnScratch.post(new Runnable() {
        @Override
        public void run() {
            float center = (btnScratch.getTop() + btnScratch.getBottom()) / 2;
            Log.e("center point", String.valueOf(center));
            animateUpToButton(center - imgHand.getTop());
        }
});

for getting center of the button I used following line:

float center = (btnScratch.getTop() + btnScratch.getBottom()) / 2;

and for animation :

private void animateUpToButton(final float distance) {

    ObjectAnimator imageAnimator = ObjectAnimator.ofFloat(imgHand, "translationY", 0f, distance);
    imageAnimator.setDuration(ANIM_DURATION);
    imageAnimator.setInterpolator(new AccelerateDecelerateInterpolator());
    imageAnimator.addListener(new Animator.AnimatorListener() {
        @Override
        public void onAnimationStart(Animator animator) {

        }

        @Override
        public void onAnimationEnd(Animator animator) {
            animateBackToOrigin(distance);
        }

        @Override
        public void onAnimationCancel(Animator animator) {

        }

        @Override
        public void onAnimationRepeat(Animator animator) {

        }
    });
    imageAnimator.start();
}

And, onAnimationEnd(), I added another animation to get the image back to the initial position.

private void animateBackToOrigin(final float distance) {
    ObjectAnimator imageAnimator = ObjectAnimator.ofFloat(imgHand, "translationY", distance, 0f);
    imageAnimator.setDuration(ANIM_DURATION);
    imageAnimator.setInterpolator(new LinearInterpolator());
    imageAnimator.addListener(new Animator.AnimatorListener() {
        @Override
        public void onAnimationStart(Animator animator) {

        }

        @Override
        public void onAnimationEnd(Animator animator) {
            animateUpToButton(distance);
        }

        @Override
        public void onAnimationCancel(Animator animator) {

        }

        @Override
        public void onAnimationRepeat(Animator animator) {

        }
    });
    imageAnimator.start();
}

and again onAnimationEnd(), I added animation to move image towards the button. this way, the animation will continue one after another.

Riddhi Shah
  • 3,092
  • 5
  • 36
  • 56
-1

Try This:

ObjectAnimator slideUp = ObjectAnimator.ofFloat(mImageView,"translationY",-btn_scratch_now.getTop());
    slideUp.setRepeatMode(ObjectAnimator.RESTART);
    slideUp.setRepeatCount(ObjectAnimator.INFINITE);
    slideUp.start();
Shubham Vala
  • 1,024
  • 7
  • 18