您好,我需要在我的 Activity 之上有一个 float 气泡,我决定为此使用一项服务。一切正常,除了在 Android 4.xx 设备中 imageView 没有动画。我已经为动画添加了监听器并且动画运行了(它开始,重复......并且值也改变)但是 imageView 没有移动。它在 Android 5.x 设备上运行良好,但在 4.x 上运行不佳。有人知道为什么吗?
代码如下:
public class SellFloatingBubbleService extends Service {
private WindowManager windowManager;
private ImageView imageView;
@Override
public void onCreate() {
super.onCreate();
imageView = new ImageView(this);
imageView.setImageResource(R.drawable.tabbar_tooltip_v3);
windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
final WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams(
LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT,
LayoutParams.TYPE_PHONE,
LayoutParams.FLAG_NOT_FOCUSABLE,
PixelFormat.TRANSLUCENT);
layoutParams.gravity = Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL;
layoutParams.y = (int) TypedValue.applyDimension(TypedValue
.COMPLEX_UNIT_PX, getResources().getDimensionPixelOffset(R.dimen
.sell_button_height), getResources().getDisplayMetrics());
windowManager.addView(imageView, layoutParams);
imageView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
stopSelf();
return true;
}
});
/**
* When these animations will end they will revert and then play endlessly.
*/
AnimatorSet bouncer = new AnimatorSet();
ObjectAnimator animX = ObjectAnimator.ofFloat(imageView, "scaleX", 1f, 0.8f);
animX.setRepeatMode(ValueAnimator.REVERSE);
animX.setRepeatMode(-1);
ObjectAnimator animY = ObjectAnimator.ofFloat(imageView, "scaleY", 1f, 0.8f);
animY.setRepeatMode(ValueAnimator.REVERSE);
animY.setRepeatCount(-1);
bouncer.playTogether(animX, animY);
bouncer.setDuration(1000);
bouncer.setInterpolator(new AccelerateDecelerateInterpolator());
bouncer.start();
}
@Override
public void onDestroy() {
imageView.setVisibility(View.GONE);
windowManager.removeView(imageView);
super.onDestroy();
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
我已经在另一个 View 上尝试了相同的动画,而不是在服务中并且它有效。我也尝试用旧动画替换 ObjectAnimator,但问题仍然存在。
代码有问题吗?
最佳答案
将 ImageView 放在 LinearLayout 中解决了 imageView 没有动画的问题。 这是代码:
public class SellFloatingBubbleService extends Service {
public static final int ANIMATION_DURATION = 500;
private WindowManager windowManager;
private ImageView imageView;
private int animationDistance;
private LinearLayout layout;
private static SellFloatingBubbleService instance = null;
public static boolean isInstanceCreated() {
return instance != null;
}
@Override
public void onCreate() {
super.onCreate();
BusProvider.getInstance().post(new BubbleWillBeShownEvent());
instance = this;
/**
* Animations do not work in Android 4.XX if view is not added inside a view group
*/
layout = new LinearLayout(this);
layout.setOrientation(LinearLayout.VERTICAL);
imageView = new ImageView(this);
layout.addView(imageView, new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
imageView.setImageResource(R.drawable.tabbar_tooltip_v);
windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
animationDistance = (int) getResources().getDimension(R.dimen.sell_bubble_animation_height);
final WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams(
LayoutParams.WRAP_CONTENT,
(int) getResources().getDimension(R.dimen.sell_bubble_window_height),
LayoutParams.TYPE_PHONE,
LayoutParams.FLAG_NOT_TOUCH_MODAL, //touch events are transmitted to windows below
PixelFormat.TRANSLUCENT);
layoutParams.gravity = Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL;
layoutParams.windowAnimations = android.R.style.Animation_Toast;
int sellButtonHeight = getResources().getDimensionPixelOffset(R.dimen
.sell_button_height);
layoutParams.y = sellButtonHeight / 2;
windowManager.addView(layout, layoutParams);
createAndStartAnimation();
}
private void createAndStartAnimation() {
/**
* When these animations will end they will revert and then play endlessly.
*/
float startValue = imageView.getY();
float endValue = imageView.getY() - animationDistance;
AnimatorSet animatorSet = new AnimatorSet();
ObjectAnimator animYUp = ObjectAnimator.ofFloat(imageView, "y", startValue,
endValue);
animYUp.setRepeatMode(ValueAnimator.REVERSE);
animYUp.setRepeatCount(ValueAnimator.INFINITE);
animYUp.setDuration(ANIMATION_DURATION);
animYUp.setInterpolator(new DecelerateInterpolator()); //decelerate interpolator for up
ObjectAnimator animYDown = ObjectAnimator.ofFloat(imageView, "y", endValue,
startValue);
animYDown.setRepeatCount(ValueAnimator.INFINITE);
animYDown.setDuration(ANIMATION_DURATION);
animYDown.setInterpolator(new AccelerateInterpolator()); //accelerate interpolator for down
animatorSet.play(animYDown).after(animYUp);
animatorSet.start();
}
@Override
public void onDestroy() {
BusProvider.getInstance().post(new BubbleWillBeHiddenEvent());
instance = null;
imageView.setVisibility(View.INVISIBLE);
windowManager.removeView(layout);
super.onDestroy();
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
关于android - WindowManager 中 imageView 的动画在 android 4.xx 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30490768/