我有一个视图,希望将它与动画一起从屏幕外移动到屏幕底部并反向移动!我已经尝试过了:
bottomRelative = findViewById(R.id.bottomRelative);
int widthOfScreen = this.getWindowManager().getDefaultDisplay().getHeight();
ObjectAnimator animator = ObjectAnimator.ofFloat(bottomRelative, "y", widthOfScreen, (widthOfScreen-700));
animator.setDuration(2000);
animator.start();
但是我无法设置确切的停车位置!我希望此视图从底部设置50个边距!
如何将视图的最终位置设置为屏幕底部的50页空白?
另一个问题是,使用不同的设备!使用上面的代码,该视图在2个设备中动画显示在我的屏幕上!但在4英寸设备中,无法正常工作! 我该如何解决这两个问题?
我认为通过为我的视图设置正确的目标,可以解决不同的设备问题。
答案 0 :(得分:1)
我有一个解决方案,即使用startView
和destinationView
这两个视图,通过这种方式将startView
移到destinationView
假设我们有2个视图:startView
和destinationView
int[] startLoc = new int[2];
int[] desLoc = new int[2];
startView.getLocationOnScreen(startLoc);
destinationView.getLocationOnScreen(desLoc);
float x = desLoc[0]
- startLoc[0]
- (startView.getWidth() - destinationView.getWidth()) / 2;
float y = desLoc[1]
- startLoc[1]
- (startView.getHeight() - destinationView.getHeight()) / 2;
createMoveAndScaleThenFadeAnimation(
startView, x, y, 1.0f, 1, 1000, 300,
new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
}
}).start();
和createMoveAndScaleThenFadeAnimation()
方法:
public AnimatorSet createMoveAndScaleThenFadeAnimation(View view, float deltaX,
float deltaY, float scaleFrom, float scaleTo, int duration, int offset,
@Nullable final AnimatorListenerAdapter listener) {
ObjectAnimator animX = ObjectAnimator.ofFloat(view, "translationX", deltaX);
ObjectAnimator animY = ObjectAnimator.ofFloat(view, "translationY", deltaY);
ObjectAnimator scaleX = ObjectAnimator.ofFloat(view, "scaleX", scaleFrom, scaleTo);
ObjectAnimator scaleY = ObjectAnimator.ofFloat(view, "scaleY", scaleFrom, scaleTo);
ObjectAnimator fade = ObjectAnimator.ofFloat(view, "alpha", 1.0f, 0.0f);
AnimatorSet animSet = new AnimatorSet();
animSet.setDuration(duration);
animSet.setStartDelay(offset);
animSet.play(animX).with(animY).with(scaleX).with(scaleY).before(fade);
if (listener != null) {
animSet.addListener(listener);
}
return animSet;
}
所以现在我们不在乎设备的屏幕尺寸或其他任何东西,只需在布局中定义2个视图并以这种方式即可。对于您而言,我们可以将视图2的可见性设置为“不可见”。
注意
在执行此操作之前,请确保已放大整个视图,否则,我们将无法获取视图的位置。
选项1:使用OnGlobalLayoutListener()
ViewTreeObserver vto=view.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener(){
@Override public void onGlobalLayout(){
//Here we can get the view's position and view size
view.getViewTreeObserver().removeGlobalOnLayoutListener(this);
}
}
选项2 覆盖onWindowFocusChanged()
@Override
public void onWindowFocusChanged(boolean hasFocus) {
// TODO Auto-generated method stub
super.onWindowFocusChanged(hasFocus);
// Here we can get the view's position and view size
}
感谢@Azin Nilchi的建议。
希望这会有所帮助!