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