Android动画反弹效果

Android动画反弹效果,android,animation,surfaceview,Android,Animation,Surfaceview,我有一张照片,里面有骰子。我想要的是让它在布局中反弹。我尝试的是,当imageView穿过底部或顶部时,更改其当前动画方向并播放它们。对于x乐章,我也这么做了。但当我在一起玩的时候,事情并不像我想的那样顺利。下面是我的代码: package com.example.aaa111.androidrnd; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import andro

我有一张照片,里面有骰子。我想要的是让它在布局中反弹。我尝试的是,当imageView穿过底部或顶部时,更改其当前动画方向并播放它们。对于x乐章,我也这么做了。但当我在一起玩的时候,事情并不像我想的那样顺利。下面是我的代码:

package com.example.aaa111.androidrnd;

import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.animation.ValueAnimator;
import android.graphics.Rect;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewTreeObserver;
import android.view.animation.AccelerateDecelerateInterpolator;
import android.view.animation.Animation;
import android.view.animation.AnimationSet;
import android.view.animation.LinearInterpolator;
import android.view.animation.RotateAnimation;
import android.view.animation.TranslateAnimation;
import android.widget.ImageView;
import android.widget.RelativeLayout;

public class AnimationTest extends AppCompatActivity {

private ObjectAnimator diceOneAnim;
private ObjectAnimator diceTwoAnim;
private ObjectAnimator diceOneTrAnim;
private ImageView diceOneImage;
private ImageView diceTwoImage;
private RelativeLayout relativeLayout;
private boolean animSet;
private Rect r1;
private Rect r2;
private int currX = 0;
private int currY = 0;
private int toX = 2500;
private int toY = 2000;

private boolean newAnim = false;
private Rect rootRect;

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_animation_test);

    animSet = false;
    relativeLayout = (RelativeLayout)findViewById(R.id.relativeLayout);

    diceOneImage = (ImageView)findViewById(R.id.diceOneImage);
    diceTwoImage = (ImageView)findViewById(R.id.diceTwoImage);

    relativeLayout.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout()
        {
            relativeLayout.getViewTreeObserver().removeGlobalOnLayoutListener(this);
        }
    });
}

@Override
public void onWindowFocusChanged(boolean hasFocus) {

    super.onWindowFocusChanged(hasFocus);
    int[] l = new int[2];

    relativeLayout.getLocationOnScreen(l);

    rootRect = new Rect(l[0], l[1], l[0] + relativeLayout.getWidth(), l[1] + relativeLayout.getHeight());

    System.out.println("relativeLayout width  : " + relativeLayout.getWidth());
    System.out.println("relativeLayout height : " + relativeLayout.getHeight());

    makeNewAnim();
}

@Override
public boolean onCreateOptionsMenu(Menu menu)
{
    getMenuInflater().inflate(R.menu.menu_animation_test, menu);
    return true;
}

private void makeNewAnim()
{
    final AnimatorSet animSetXY = new AnimatorSet();

    ValueAnimator y = ObjectAnimator.ofFloat(diceOneImage,"translationY",currY, toY);

    ValueAnimator x = ObjectAnimator.ofFloat(diceOneImage, "translationX", currX, toX);

    ValueAnimator rotate =  ObjectAnimator.ofFloat(diceOneImage,"rotation",0, 360);
    rotate.setInterpolator(new LinearInterpolator());
    rotate.setRepeatCount(Animation.INFINITE);
    rotate.setDuration(2000);

    x.addUpdateListener(new ValueAnimator.AnimatorUpdateListener()
    {
        @Override
        public void onAnimationUpdate(ValueAnimator animation)
        {
            final int[] l = new int[2];

            l[0] = (int) diceOneImage.getX();
            l[1] = (int) diceOneImage.getY();

            System.out.println("l[0] : " + l[0]);
            System.out.println("l[1] : " + l[1]);

            Rect rect = new Rect(l[0], l[1], l[0] + diceOneImage.getWidth(), l[1] + diceOneImage.getHeight());

            float rx = relativeLayout.getX();
            float rw = relativeLayout.getWidth();

            if (rect.right > relativeLayout.getX() + relativeLayout.getWidth()) {
                final float offset = l[0] - diceOneImage.getWidth() - (rect.right - (relativeLayout.getX() + relativeLayout.getWidth()));

                animSetXY.cancel();
                ObjectAnimator animator = ObjectAnimator.ofFloat(diceOneImage, "translationX", l[0], l[0] - diceOneImage.getWidth() - (rect.right - (relativeLayout.getX() + relativeLayout.getWidth())));
                animator.setDuration(5);
                animator.start();

                animator.addListener(new Animator.AnimatorListener()
                {
                    @Override
                    public void onAnimationStart(Animator animation)
                    {

                    }

                    @Override
                    public void onAnimationEnd(Animator animation)
                    {
                        currY = l[1];

                        currX = (int) offset;

                        toX = toX * (-1);

                        makeNewAnim();
                    }

                    @Override
                    public void onAnimationCancel(Animator animation)
                    {

                    }

                    @Override
                    public void onAnimationRepeat(Animator animation)
                    {

                    }
                });


                return;
            }

            if (rect.left < relativeLayout.getLeft())
            {

                animSetXY.cancel();
                ObjectAnimator animator = ObjectAnimator.ofFloat(diceOneImage, "translationX", l[0], l[0] + 20);
                animator.setDuration(5);
                animator.start();

                animator.addListener(new Animator.AnimatorListener()
                {
                    @Override
                    public void onAnimationStart(Animator animation)
                    {

                    }

                    @Override
                    public void onAnimationEnd(Animator animation)
                    {
                        currY = l[1];

                        currX = l[0] + 20;

                        toX = toX * (-1);

                        makeNewAnim();
                    }

                    @Override
                    public void onAnimationCancel(Animator animation)
                    {

                    }

                    @Override
                    public void onAnimationRepeat(Animator animation)
                    {

                    }
                });

                return;
            }
        }
    });

    y.addUpdateListener(new ValueAnimator.AnimatorUpdateListener()
    {
        @Override
        public void onAnimationUpdate(ValueAnimator animation)
        {
            final int[] l = new int[2];

            l[0] = (int) diceOneImage.getX();
            l[1] = (int) diceOneImage.getY();//getRelativeTop(diceOneImage);

            System.out.println("l[0] : " + l[0]);
            System.out.println("l[1] : " + l[1]);

            Rect rect = new Rect(l[0], l[1], l[0] + diceOneImage.getWidth(), l[1] + diceOneImage.getHeight());

            if (rect.bottom > relativeLayout.getY() + relativeLayout.getHeight())
            {
                animSetXY.cancel();
                ObjectAnimator animator = ObjectAnimator.ofFloat(diceOneImage, "translationY", l[1], l[1] - 20);
                animator.setDuration(2);
                animator.start();

                animator.addListener(new Animator.AnimatorListener()
                {
                    @Override
                    public void onAnimationStart(Animator animation)
                    {

                    }

                    @Override
                    public void onAnimationEnd(Animator animation)
                    {
                        currY = l[1] - 20;

                        toY = -1 * toY;

                        //currX = (int) diceOneImage.getX();

                        //toX = toX * (-1);

                        makeNewAnim();
                    }

                    @Override
                    public void onAnimationCancel(Animator animation)
                    {

                    }

                    @Override
                    public void onAnimationRepeat(Animator animation)
                    {

                    }
                });


                return;
            }

            if (rect.top < relativeLayout.getTop())
            {
                animSetXY.cancel();
                ObjectAnimator animator = ObjectAnimator.ofFloat(diceOneImage, "translationY", l[1], l[1] + 20);
                animator.setDuration(2);
                animator.start();

                animator.addListener(new Animator.AnimatorListener()
                {
                    @Override
                    public void onAnimationStart(Animator animation)
                    {

                    }

                    @Override
                    public void onAnimationEnd(Animator animation)
                    {
                        currY = l[1] + 20;

                        toY = -1 * toY;

                        //currX = (int) diceOneImage.getX();

                        //toX = toX * (-1);

                        makeNewAnim();
                    }

                    @Override
                    public void onAnimationCancel(Animator animation)
                    {

                    }

                    @Override
                    public void onAnimationRepeat(Animator animation)
                    {

                    }
                });

                return;
            }
        }
    });

    animSetXY.playTogether(rotate, x,y);
    animSetXY.setInterpolator(new LinearInterpolator());
    animSetXY.setDuration(2000);
    animSetXY.start();
}


@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();

    //noinspection SimplifiableIfStatement
    if (id == R.id.action_settings) {
        return true;
    }

    return super.onOptionsItemSelected(item);
}   
  }
package com.example.aaa111.androidrd;
导入android.animation.Animator;
导入android.animation.AnimatorListenerAdapter;
导入android.animation.AnimatorSet;
导入android.animation.ObjectAnimator;
导入android.animation.ValueAnimator;
导入android.graphics.Rect;
导入android.support.v7.app.AppActivity;
导入android.os.Bundle;
导入android.util.DisplayMetrics;
导入android.view.Menu;
导入android.view.MenuItem;
导入android.view.view;
导入android.view.ViewTreeObserver;
导入android.view.animation.AcceleratedCelerateInterpolator;
导入android.view.animation.animation;
导入android.view.animation.AnimationSet;
导入android.view.animation.LinearInterpolator;
导入android.view.animation.RotateAnimation;
导入android.view.animation.TranslateAnimation;
导入android.widget.ImageView;
导入android.widget.RelativeLayout;
公共类AnimationTest扩展了AppCompativeActivity{
私人物体动画师DiceneAnim;
私人物体动画师;
私人物体动画师diceOneTrAnim;
私有图像查看图像;
私有图像视图;
私人亲戚;
私有布尔动画集;
私有Rect r1;
私有Rect r2;
私有int currX=0;
私有int currY=0;
私人int toX=2500;
私人玩具=2000;
私有布尔newAnim=false;
私有Rect-rootRect;
@凌驾
创建时受保护的void(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u animation\u test);
animSet=false;
relativeLayout=(relativeLayout)findViewById(R.id.relativeLayout);
DiceneImage=(ImageView)findViewById(R.id.DiceneImage);
diceTwoImage=(ImageView)findViewById(R.id.diceTwoImage);
relativeLayout.getViewTreeObserver().addOnGlobalLayoutListener(新ViewTreeObserver.OnGlobalLayoutListener()){
@凌驾
公共图书馆
{
relativeLayout.getViewTreeObserver();
}
});
}
@凌驾
WindowFocusChanged上的公共无效(布尔hasFocus){
super.onWindowFocusChanged(hasFocus);
int[]l=新的int[2];
屏幕上的相对位置GetLocationOn(l);
rootRect=new Rect(l[0],l[1],l[0]+relativeLayout.getWidth(),l[1]+relativeLayout.getHeight());
System.out.println(“relativeLayout宽度:+relativeLayout.getWidth());
System.out.println(“relativeLayout高度:+relativeLayout.getHeight());
makeNewAnim();
}
@凌驾
公共布尔onCreateOptions菜单(菜单)
{
getMenuInflater().充气(R.menu.menu\u动画\u测试,菜单);
返回true;
}
私有void makeNewAnim()
{
最终动画师集animSetXY=新动画师集();
ValueAnimator y=ObjectAnimator.offload(diceOneImage,“translationY”,currY,toY);
ValueAnimator x=ObjectAnimator.offload(diceOneImage,“translationX”,currX,toX);
ValueAnimator rotate=ObjectAnimator.offload(diceOneImage,“旋转”,0,360);
rotate.setInterpolator(新的LinearInterpolator());
rotate.setRepeatCount(Animation.INFINITE);
轮换时间(2000年);
x、 addUpdateListener(新值animator.AnimatorUpdateListener()
{
@凌驾
动画更新上的公共无效(ValueAnimator动画)
{
最终整数[]l=新整数[2];
l[0]=(int)diceneimage.getX();
l[1]=(int)diceneimage.getY();
System.out.println(“l[0]:”+l[0]);
System.out.println(“l[1]:”+l[1]);
Rect Rect=new Rect(l[0],l[1],l[0]+diceneimage.getWidth(),l[1]+diceneimage.getHeight());
float rx=relativeLayout.getX();
float rw=relativeLayout.getWidth();
if(rect.right>relativeLayout.getX()+relativeLayout.getWidth()){
最终浮点偏移量=l[0]-diceneImage.getWidth()-(rect.right-(relativeLayout.getX()+relativeLayout.getWidth());
animSetXY.cancel();
ObjectAnimator animator=ObjectAnimator.offload(diceneimage,“translationX”,l[0],l[0]-diceneimage.getWidth()-(rect.right-(relativeLayout.getX()+relativeLayout.getWidth());
设置持续时间(5);
animator.start();
animator.addListener(新的animator.AnimatorListener()
{
@凌驾
AnimationStart(动画师动画)上的公共无效
{
}
@凌驾
AnimationEnd上的公共无效(Animator动画)
{
咖喱=l[1];
currX=(int)偏移量;
toX=toX*(-1);
makeNewAnim();
}
@凌驾
AnimationCancel上的公共无效(Animator动画)
{
}
@凌驾
AnimationRepeat上的公共无效(Animator动画)
{
}
});
返回;
}
if(rect.left