ObjectAnimator.ofFloat不生效

在使用Android系统属性动画时遇到ObjectAnimator.ofFloat未响应的情况,通过调整手机开发者选项中的动画时长缩放至1倍,成功解决了Galaxy S4上的动画问题。

使用Android系统的属性动画时,发现ObjectAnimator.ofFloat设置后没有响应,换成nineoldandroid,一切正常。

在stackoverflow上搜索一下,发现是手机的开发者选项里面的动画时长缩放被关闭了,修改为1倍缩放即可


stackoverflow地址如下:http://stackoverflow.com/questions/25505622/androids-objectanimator-offloat-doesnt-work-properly


On the Galaxy S4, under Developer Options, there is the option Animator duration scale. For some wild reason, this is off by default. After switching this to 1x, my animations on the S4 started to work perfectly. This may be what is causing your problem.

private void addRotatingZoomingImageView() { // 创建 ImageView ImageView imageView = new ImageView(this); imageView.setImageResource(R.drawable.bee); // 替换为你自己的图片资源 imageView.setLayoutParams(new FrameLayout.LayoutParams(200, 200)); // 宽高为 200x200 px // 设置初始位置(左上角) imageView.setX(100); // 距离左边 100px imageView.setY(50); // 距离顶部 50px // 初始缩放值(可选) imageView.setScaleX(0.5f); imageView.setScaleY(0.5f); imageView.setAlpha(0f); // 添加到容器中 container.addView(imageView); // 开启动画 startTranslateAndZoomAnimation(imageView); } private void startTranslateAndZoomAnimation(ImageView imageView) { // 初始状态:图片在屏幕左上角外侧 float startX = -200; // 从左侧外部滑入 float startY = -200; // 从顶部外部滑入 float endX = 100; // 最终停在距离左边 100px float endY = 50; // 最终停在距离顶部 50px // 设置初始位置 imageView.setX(startX); imageView.setY(startY); // 缩放动画:从小变大 ObjectAnimator scaleXAnim = ObjectAnimator.ofFloat(imageView, "scaleX", 0.5f, 1f); ObjectAnimator scaleYAnim = ObjectAnimator.ofFloat(imageView, "scaleY", 0.5f, 1f); // 平移动画 ObjectAnimator translateXAnim = ObjectAnimator.ofFloat(imageView, "x", startX, endX); ObjectAnimator translateYAnim = ObjectAnimator.ofFloat(imageView, "y", startY, endY); // 组合动画 AnimatorSet animatorSet = new AnimatorSet(); animatorSet.playTogether(scaleXAnim, scaleYAnim, translateXAnim, translateYAnim); animatorSet.setDuration(2000); // 动画时长 2 秒 animatorSet.setInterpolator(new AccelerateDecelerateInterpolator()); // 设置动画监听器(可选) animatorSet.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { System.out.println("平移+缩放动画已完成"); } }); // 启动动画 animatorSet.start(); }图片没出现
07-15
package com.example.lovedemo.activity; import androidx.appcompat.app.AppCompatActivity; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorSet; import android.animation.ObjectAnimator; import android.app.AlertDialog; import android.content.Intent; import android.graphics.Color; import android.graphics.drawable.AnimationDrawable; import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.view.KeyEvent; import android.view.View; import android.view.ViewGroup; import android.view.Window; import android.view.WindowManager; import android.widget.FrameLayout; import android.widget.ImageView; import com.example.lovedemo.R; import com.example.lovedemo.app.AndroidWorkaround; import com.example.lovedemo.app.MyApplication; import com.example.lovedemo.dialog.CloseAlertDialogUtils; import com.example.lovedemo.dialog.QuitDialog; import com.example.lovedemo.dialog.VindicateDialog; import com.example.lovedemo.tools.Utils; import com.example.lovedemo.view.StarRainView; import java.util.Random; public class MainActivity extends AppCompatActivity { private FrameLayout container; // 多种星形资源 private int[] starResIds = { R.drawable.a1, R.drawable.a2, R.drawable.a3, R.drawable.a4, R.drawable.a5, R.drawable.a6, R.drawable.a7, R.drawable.a8, R.drawable.a9, R.drawable.a10, R.drawable.a11, R.drawable.a12, R.drawable.a13, R.drawable.a14, R.drawable.a15, R.drawable.a16, R.drawable.a17, R.drawable.a18, R.drawable.a19 }; private int[] starResId = { R.drawable.xin1, R.drawable.xin2, R.drawable.xin3, R.drawable.xin4, R.drawable.xxing }; private Random random = new Random(); private long currentDelay = 0; private final long delayBetweenStars = 500; // 每颗星星间隔时间 private Handler starHandler = new Handler(Looper.getMainLooper()); private Runnable starRunnable; private boolean isStarAnimationRunning = false; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //沉浸式 if (AndroidWorkaround.checkDeviceHasNavigationBar(this)) { AndroidWorkaround.assistActivity(findViewById(android.R.id.content)); } //沉浸式 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {//5.0及以上 Window window = getWindow(); window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS | WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN //设置为全屏 | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);//状态栏字体颜色设置为黑色这个是Android 6.0才出现的属性 默认是白色 //需要设置这个 flag 才能调用 setStatusBarColor 来设置状态栏颜色 window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); window.setStatusBarColor(Color.TRANSPARENT);//设置为透明色 window.setNavigationBarColor(Color.TRANSPARENT); } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {//4.4到5.0 WindowManager.LayoutParams localLayoutParams = getWindow().getAttributes(); localLayoutParams.flags = (WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS | localLayoutParams.flags); } container = findViewById(R.id.container); // 获取 Application 实例并开始播放音乐 MyApplication app = (MyApplication) getApplication(); app.playBackgroundMusic(this); // 依次绘制图形 drawLetterI(); drawHeart(); drawLetterU(); startRandomStarAnimation(); } // 创建带有动画的 ImageView private ImageView createStar(float x, float y) { ImageView imageView = new ImageView(this); imageView.setImageResource(starResIds[random.nextInt(starResIds.length)]); imageView.setLayoutParams(new FrameLayout.LayoutParams(35, 35)); imageView.setX(x); imageView.setY(y); imageView.setAlpha(0f); imageView.setScaleX(0.5f); imageView.setScaleY(0.5f); // 缩放和透明度动画 ObjectAnimator alphaAnim = ObjectAnimator.ofFloat(imageView, "alpha", 0f, 1f); ObjectAnimator scaleXAnim = ObjectAnimator.ofFloat(imageView, "scaleX", 0.5f, 1f); ObjectAnimator scaleYAnim = ObjectAnimator.ofFloat(imageView, "scaleY", 0.5f, 1f); AnimatorSet animatorSet = new AnimatorSet(); animatorSet.playTogether(alphaAnim, scaleXAnim, scaleYAnim); animatorSet.setDuration(3500); // 延迟执行 new Handler(Looper.getMainLooper()).postDelayed(animatorSet::start, currentDelay); currentDelay += delayBetweenStars; return imageView; } // 绘制字母 I private void drawLetterI() { int centerX = 530; int startY = 200; // 绘制顶部横杠 for (int i = -2; i < 3; i++) { ImageView topBarStar = createStar(centerX + i * 40, startY - 40); container.addView(topBarStar); } // 绘制垂直列(中间部分) for (int i = 0; i < 9; i++) { float y = startY + i * 40; ImageView star = createStar(centerX, y); container.addView(star); } // 绘制底部横杠 for (int i = -2; i < 3; i++) { ImageView bottomBarStar = createStar(centerX + i * 40, startY + 8 * 40); container.addView(bottomBarStar); } } // 绘制心形图案 private void drawHeart() { int centerX = 530; int centerY = 900; int size = 15; // 设置图片资源,例如你有一个叫 "heart_image" 的图片资源 for (double t = 0; t < 2 * Math.PI; t += 0.2) { double xVal = 16 * Math.pow(Math.sin(t), 3); double yVal = 13 * Math.cos(t) - 5 * Math.cos(2 * t) - 2 * Math.cos(3 * t) - Math.cos(4 * t); float px = (float) (centerX + xVal * size); float py = (float) (centerY - yVal * size); ImageView star = createStar(px, py); container.addView(star); } // 添加心形中央图片并设置缩放动画 new Handler(Looper.getMainLooper()).postDelayed(() -> { ImageView heartImage = new ImageView(this); heartImage.setImageResource(R.drawable.h_m_m); // 使用自己的心形图片资源 heartImage.setLayoutParams(new FrameLayout.LayoutParams(260, 260)); // 设置合适的大小 heartImage.setX(centerX - 105); // 设置图片X位置 heartImage.setY(centerY - 65); // 设置图片Y位置 // 设置缩放动画 ObjectAnimator scaleXAnim = ObjectAnimator.ofFloat(heartImage, "scaleX", 0f, 1f); ObjectAnimator scaleYAnim = ObjectAnimator.ofFloat(heartImage, "scaleY", 0f, 1f); ObjectAnimator alphaAnim = ObjectAnimator.ofFloat(heartImage, "alpha", 0f, 1f); AnimatorSet heartAnimatorSet = new AnimatorSet(); heartAnimatorSet.playTogether(scaleXAnim, scaleYAnim, alphaAnim); heartAnimatorSet.setDuration(3500); // 设置动画时长 container.addView(heartImage); heartAnimatorSet.start(); }, 20 * 1000); // 设置延迟,在绘制完心形图案后开始执行 } // 绘制字母 U(底部为圆弧) private void drawLetterU() { long totalDuration = 0; int startX = 410; int startY = 1300; // 左侧横线 for (int i = -6; i < 8; i++) { float x = (float) (startX + i * -5); ImageView star = createStar(x, startY); container.addView(star); } // 右侧横线 for (int i = -6; i < 8; i++) { float x = startX + i * -5; ImageView star = createStar(x + 250, startY); container.addView(star); } // 左侧竖线 for (int i = 0; i < 8; i++) { float y = startY + i * 40; ImageView star = createStar(startX, y); container.addView(star); } // 右侧竖线(更宽了) for (int i = 0; i < 8; i++) { float y = startY + i * 40; ImageView star = createStar(startX + 250, y); container.addView(star); } // 底部绘制一个圆弧形(近似) int centerX = startX + 125; // 新增宽度后的新中点 int centerY = startY + 7 * 40; // Y 不变 int radius = 110; // 增大半径以适应新宽度 int points = 9; // 更多点数,圆弧更平滑 for (int i = 0; i < points; i++) { double angle = Math.PI * i / (points - 1); // 从 π 到 2π 的角度(下半圆) float x = (float) (centerX + radius * Math.cos(angle)); float y = (float) (centerY + radius * Math.sin(angle)); ImageView star = createStar(x, y); container.addView(star); totalDuration += 5500; } new Handler(Looper.getMainLooper()).postDelayed(this::triggerCornerAnimations, totalDuration); } private void triggerCornerAnimations() { // 右上:从左向右移动 showCornerImageWithTranslation(R.drawable.up_right, container.getWidth(), 0, container.getWidth() - 150, -35); // 中间:从左到中间移动 showCornerImageWithTranslation(R.drawable.upmidd, -150, 100, container.getWidth() / 2 - 130, -35, 250, 150); // 左上:从左移动到左上 showCornerImageWithTranslation(R.drawable.up_left, -100, 0, 0, -35); // 左下角动画:保持缩放效果 animateCorner(R.drawable.down_left, -10, container.getHeight() - 150); //下边距动画:保持缩放效果 Utils.animateCorner(R.drawable.downmidd, container.getWidth() / 2 - 120, container.getHeight() - 125, MainActivity.this, container, 250, 200); // 右下角动画:保持缩放效果 animateCorner(R.drawable.down_right, container.getWidth() - 140, container.getHeight() - 150); // 延迟执行,在所有动画完成后添加心形图案下方的图片 new Handler(Looper.getMainLooper()).postDelayed(this::addImagesNearHeart, 6500); // 调整延迟时间确保所有动画完成 } private void animateCorner(int resId, float startX, float startY) { ImageView cornerImage = new ImageView(this); cornerImage.setImageResource(resId); cornerImage.setLayoutParams(new FrameLayout.LayoutParams(150, 150)); cornerImage.setX(startX); cornerImage.setY(startY); cornerImage.setAlpha(0f); AnimatorSet animatorSet = new AnimatorSet(); // 缩放动画:保持原有逻辑 cornerImage.setScaleX(0.5f); cornerImage.setScaleY(0.5f); ObjectAnimator scaleXAnim = ObjectAnimator.ofFloat(cornerImage, "scaleX", 0.5f, 1f); ObjectAnimator scaleYAnim = ObjectAnimator.ofFloat(cornerImage, "scaleY", 0.5f, 1f); ObjectAnimator alphaAnim = ObjectAnimator.ofFloat(cornerImage, "alpha", 0f, 1f); animatorSet.playTogether(scaleXAnim, scaleYAnim, alphaAnim); animatorSet.setDuration(3500); container.addView(cornerImage); animatorSet.start(); } private void showCornerImageWithTranslation(int resId, float startX, float startY, float endX, float endY) { ImageView cornerImage = new ImageView(this); cornerImage.setImageResource(resId); cornerImage.setLayoutParams(new FrameLayout.LayoutParams(150, 150)); cornerImage.setX(startX); cornerImage.setY(startY); cornerImage.setAlpha(0f); cornerImage.setScaleX(1f); cornerImage.setScaleY(1f); container.addView(cornerImage); // Alpha animation ObjectAnimator alphaAnim = ObjectAnimator.ofFloat(cornerImage, "alpha", 0f, 1f); // Translation animations ObjectAnimator translateXAnim = ObjectAnimator.ofFloat(cornerImage, "x", startX, endX); ObjectAnimator translateYAnim = ObjectAnimator.ofFloat(cornerImage, "y", startY, endY); AnimatorSet animatorSet = new AnimatorSet(); animatorSet.playTogether(alphaAnim, translateXAnim, translateYAnim); animatorSet.setDuration(3500); animatorSet.start(); } // 创建平移动画的辅助方法 private void showCornerImageWithTranslation(int resId, float startX, float startY, float endX, float endY, int width, int height) { ImageView cornerImage = new ImageView(this); cornerImage.setImageResource(resId); // 设置图片的宽度和高度 cornerImage.setLayoutParams(new FrameLayout.LayoutParams(width, height)); cornerImage.setX(startX); cornerImage.setY(startY); cornerImage.setAlpha(0f); cornerImage.setScaleX(1f); cornerImage.setScaleY(1f); container.addView(cornerImage); // Alpha 动画 ObjectAnimator alphaAnim = ObjectAnimator.ofFloat(cornerImage, "alpha", 0f, 1f); ObjectAnimator translateXAnim = ObjectAnimator.ofFloat(cornerImage, "x", startX, endX); ObjectAnimator translateYAnim = ObjectAnimator.ofFloat(cornerImage, "y", startY, endY); AnimatorSet animatorSet = new AnimatorSet(); animatorSet.playTogether(alphaAnim, translateXAnim, translateYAnim); animatorSet.setDuration(3500); // 在动画结束后,添加缩放动画的新图片 animatorSet.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { super.onAnimationEnd(animation); // 在图片的正中心创建新图片 float centerX = (float) (cornerImage.getX() + (cornerImage.getWidth() / 1.6)); float centerY = (float) (cornerImage.getY() + (cornerImage.getHeight() / 1.9)); // 创建新图片 ImageView zoomImage = new ImageView(MainActivity.this); zoomImage.setImageResource(R.drawable.love_middle_down); // 替换成你的新图片资源 zoomImage.setLayoutParams(new FrameLayout.LayoutParams(50, 50)); // 设置缩放图片的大小 container.addView(zoomImage); // 设置新图片的初始位置为正中心 zoomImage.setX(centerX - 50); // 100/2 使得图片位于中心 zoomImage.setY(centerY - 50); // 100/2 使得图片位于中心 // 创建缩放动画 ObjectAnimator scaleXAnim = ObjectAnimator.ofFloat(zoomImage, "scaleX", 0f, 1f); ObjectAnimator scaleYAnim = ObjectAnimator.ofFloat(zoomImage, "scaleY", 0f, 1f); AnimatorSet scaleAnimatorSet = new AnimatorSet(); scaleAnimatorSet.playTogether(scaleXAnim, scaleYAnim); scaleAnimatorSet.setDuration(3500); // 设定缩放动画的时长 scaleAnimatorSet.start(); // 在屏幕的左右两边添加缩放动画的新图片 // 左侧图片 ImageView leftImage = new ImageView(MainActivity.this); leftImage.setImageResource(R.drawable.midd_midd_left); // 替换成你左侧的图片资源 leftImage.setLayoutParams(new FrameLayout.LayoutParams(150, ViewGroup.LayoutParams.MATCH_PARENT)); // 设置左侧图片的大小 container.addView(leftImage); // 设置左侧图片的位置 leftImage.setX(0); // 屏幕左边 leftImage.setY(centerY - 50); // 垂直居中 // 创建左侧图片的缩放动画 ObjectAnimator leftScaleXAnim = ObjectAnimator.ofFloat(leftImage, "scaleX", 0f, 1f); ObjectAnimator leftScaleYAnim = ObjectAnimator.ofFloat(leftImage, "scaleY", 0f, 1f); AnimatorSet leftScaleAnimatorSet = new AnimatorSet(); leftScaleAnimatorSet.playTogether(leftScaleXAnim, leftScaleYAnim); leftScaleAnimatorSet.setDuration(3500); leftScaleAnimatorSet.start(); // 右侧图片 ImageView rightImage = new ImageView(MainActivity.this); rightImage.setImageResource(R.drawable.midd_midd_right); // 替换成你右侧的图片资源 rightImage.setLayoutParams(new FrameLayout.LayoutParams(150, ViewGroup.LayoutParams.MATCH_PARENT)); // 设置右侧图片的大小 container.addView(rightImage); // 设置右侧图片的位置 rightImage.setX(getResources().getDisplayMetrics().widthPixels - 150); // 屏幕右边 rightImage.setY(centerY - 50); // 垂直居中 // 创建右侧图片的缩放动画 ObjectAnimator rightScaleXAnim = ObjectAnimator.ofFloat(rightImage, "scaleX", 0f, 1f); ObjectAnimator rightScaleYAnim = ObjectAnimator.ofFloat(rightImage, "scaleY", 0f, 1f); AnimatorSet rightScaleAnimatorSet = new AnimatorSet(); rightScaleAnimatorSet.playTogether(rightScaleXAnim, rightScaleYAnim); rightScaleAnimatorSet.setDuration(3500); rightScaleAnimatorSet.start(); } }); animatorSet.start(); } private void addImagesNearHeart() { // 获取心形图案的位置 int centerX = 530; int centerY = 900; // 左侧图片 ImageView leftImage = new ImageView(this); leftImage.setImageResource(R.drawable.love_m_left); // 替换成你的左侧图片资源 leftImage.setLayoutParams(new FrameLayout.LayoutParams(150, 150)); // 设置图片大小 leftImage.setX(centerX - 250); // 设置位置,心形图片左侧 leftImage.setY(centerY + 100); // 设置位置,心形图片下方 leftImage.setAlpha(0f); // 初始透明度为0 container.addView(leftImage); // 右侧图片 ImageView rightImage = new ImageView(this); rightImage.setImageResource(R.drawable.hudei); // 替换成你的右侧图片资源 rightImage.setLayoutParams(new FrameLayout.LayoutParams(150, 150)); // 设置图片大小 rightImage.setX(centerX + 280); // 设置位置,心形图片右侧 rightImage.setY(centerY + 50); // 设置位置,心形图片下方 rightImage.setAlpha(0f); // 初始透明度为0 container.addView(rightImage); // 缩放动画 ObjectAnimator scaleXLeft = ObjectAnimator.ofFloat(leftImage, "scaleX", 0f, 1f); ObjectAnimator scaleYLeft = ObjectAnimator.ofFloat(leftImage, "scaleY", 0f, 1f); ObjectAnimator alphaLeft = ObjectAnimator.ofFloat(leftImage, "alpha", 0f, 1f); ObjectAnimator scaleXRight = ObjectAnimator.ofFloat(rightImage, "scaleX", 0f, 1f); ObjectAnimator scaleYRight = ObjectAnimator.ofFloat(rightImage, "scaleY", 0f, 1f); ObjectAnimator alphaRight = ObjectAnimator.ofFloat(rightImage, "alpha", 0f, 1f); // 创建 AnimatorSet AnimatorSet animatorSetLeft = new AnimatorSet(); animatorSetLeft.playTogether(scaleXLeft, scaleYLeft, alphaLeft); animatorSetLeft.setDuration(3500); // 设置动画时长 AnimatorSet animatorSetRight = new AnimatorSet(); animatorSetRight.playTogether(scaleXRight, scaleYRight, alphaRight); animatorSetRight.setDuration(3500); // 设置动画时长 animatorSetRight.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { new Handler(Looper.getMainLooper()).postDelayed(new Runnable() { @Override public void run() { int type = 2; VindicateDialog dialog = VindicateDialog.getInstance(); VindicateDialog.showConfirmDialog(MainActivity.this, "", "还没结束哦,请点击同意进入下一个页面哦= ̄ω ̄=",type); dialog.setMonDialogButtonClickListener(new VindicateDialog.OnDialogButtonClickListener() { @Override public void onPositiveButtonClick(AlertDialog dialog) { Intent intent = new Intent(MainActivity.this, VindicateActivity.class); startActivity(intent); finish(); //关闭当前Activity } @Override public void onNegativeButtonClick(AlertDialog dialog) { //点击不同意按钮关闭应用 dialog.dismiss(); CloseAlertDialogUtils instance = CloseAlertDialogUtils.getInstance(); CloseAlertDialogUtils.showConfirmDialog(MainActivity.this, "", "小姐姐确定要这么狠心的离开吗?还有惊喜哦,拜托看完好吗~(>﹏<)"); instance.setMonDialogButtonClickListener(new CloseAlertDialogUtils.OnDialogButtonClickListener() { @Override public void onClosePositiveButtonClick(AlertDialog dialog) { Intent intent = new Intent(MainActivity.this, VindicateActivity.class); startActivity(intent); finish(); //关闭当前Activity } @Override public void onCloseNegativeButtonClick(AlertDialog dialog) { int type = 2; //点击不同意按钮关闭应用 dialog.dismiss(); QuitDialog instance = QuitDialog.getInstance(); QuitDialog.showConfirmDialog(MainActivity.this, "", "即使不知归期,我也会默默等待,挥手道别,是为了更好的相遇。这次是真的要再见了小姐姐o(*≧▽≦)ツ",type); instance.setMonDialogButtonClickListener(new QuitDialog.OnDialogButtonClickListener() { @Override public void onClosePositiveButtonClick(AlertDialog dialog) { } @Override public void onCloseNegativeButtonClick(AlertDialog dialog) { dialog.dismiss(); System.exit(0); } }); } }); } }); } }, 10000); // 动画结束后延迟10秒 } }); // 启动动画 animatorSetLeft.start(); animatorSetRight.start(); } private void startRandomStarAnimation() { isStarAnimationRunning = true; starRunnable = new Runnable() { @Override public void run() { if (!isStarAnimationRunning) return; // 随机选择资源 int resId = starResId[random.nextInt(starResId.length)]; // 随机位置 int screenWidth = getResources().getDisplayMetrics().widthPixels; int screenHeight = getResources().getDisplayMetrics().heightPixels; float x = random.nextInt(screenWidth - 100); // 留出边距 float y = random.nextInt(screenHeight - 100); ImageView star = new ImageView(MainActivity.this); star.setImageResource(resId); star.setLayoutParams(new FrameLayout.LayoutParams(100, 100)); star.setX(x); star.setY(y); star.setAlpha(0f); star.setScaleX(0.5f); star.setScaleY(0.5f); // 添加到容器中 container.addView(star); // 动画 ObjectAnimator alphaAnim = ObjectAnimator.ofFloat(star, "alpha", 0f, 1f, 0f); ObjectAnimator scaleUpX = ObjectAnimator.ofFloat(star, "scaleX", 0.5f, 1.2f); ObjectAnimator scaleUpY = ObjectAnimator.ofFloat(star, "scaleY", 0.5f, 1.2f); ObjectAnimator scaleDownX = ObjectAnimator.ofFloat(star, "scaleX", 1.2f, 0.5f); ObjectAnimator scaleDownY = ObjectAnimator.ofFloat(star, "scaleY", 1.2f, 0.5f); AnimatorSet animatorSet = new AnimatorSet(); animatorSet.playSequentially( ObjectAnimator.ofFloat(star, "alpha", 0f, 1f), scaleUpX, scaleUpY, scaleDownX, scaleDownY, ObjectAnimator.ofFloat(star, "alpha", 1f, 0f) ); animatorSet.setDuration(3500); // 动画结束后移除视图 animatorSet.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { container.removeView(star); } }); animatorSet.start(); // 下一次随机延迟执行 long nextDelay = random.nextInt(1000) + 500; // 0.5s ~ 1.5s starHandler.postDelayed(this, nextDelay); } }; starHandler.post(starRunnable); } //监听退出 @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { Utils.exit(MainActivity.this); return false; } return super.onKeyDown(keyCode, event); } //停止星星动画 private void stopRandomStarAnimation() { isStarAnimationRunning = false; starHandler.removeCallbacks(starRunnable); } @Override protected void onDestroy() { stopRandomStarAnimation(); super.onDestroy(); } } 这段代码的沉浸式怎么弄可以实现每个页面都有该效果
07-16
fun restore(): Boolean { val current = currentView ?: run { Log.e(TAG, "当前视图为空,无法恢复") return false } val parent = sourceParentView ?: run { return false } // 如果已经是原始视图,无需操作 if (current == sourceView && !keepParent) { Log.d(TAG, "当前视图已是原始视图,无需恢复") return false } // 创建淡出和淡入动画 val fadeOut = ObjectAnimator.ofFloat(current, "alpha", 1f, 0.5f).apply { duration = 500 } val fadeIn = ObjectAnimator.ofFloat(sourceView, "alpha", 0.6f, 1f).apply { duration = 500 } // 设置动画监听器共用逻辑 val listener = object : AnimatorListenerAdapter() { override fun onAnimationEnd(animation: Animator) { when { keepParent && sourceView is ViewGroup -> { with(sourceView) { removeAllViews() originalChildren?.forEach { addView(it) } alpha = 0f } originalChildren = null } parent is NestedScrollView -> { parent.removeView(current) parent.addView(sourceView) sourceView.alpha = 0f } else -> { val index = parent.indexOfChild(current) if (index == -1) return parent.removeView(current) sourceView.isVisible = true sourceView.alpha = 0f } } fadeIn.start() currentView = sourceView } override fun onAnimationCancel(animation: Animator) { parent.removeView(current) val index = parent.indexOfChild(current) parent.addView(sourceView, if (index == -1) parent.childCount else index) currentView = sourceView } } fadeOut.addListener(listener) fadeOut.start() return true }这是我原本的代码,说是要把动画那段提取出来,咋提
最新发布
12-05
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值