Android ImageViewanimation
我已经创build了一个图像视图和networking视图的布局。 Web视图被设置为具有已经消失的默认可见性。 当活动启动时,它首先显示图像视图,当web视图完成加载它的url时,它将自己标记为可见,并且imageview被标记为隐藏。
当显示图像视图时,我希望它可以反复旋转只是为了添加一点点匹配。
我以前从来没有在Android上做过animation,当我问上网时发现的所有post都没有帮助; 因此,我已经回到SO寻求帮助。
所以如果我从这开始
final ImageView splash = (ImageView)findViewById(R.id.splash);
如何创build重复的旋转animation并将其应用于ImageView?
再次感谢!
使用RotateAnimation
,将透视点设置为图像的中心。
RotateAnimation anim = new RotateAnimation(0f, 350f, 15f, 15f); anim.setInterpolator(new LinearInterpolator()); anim.setRepeatCount(Animation.INFINITE); anim.setDuration(700); // Start animating the image final ImageView splash = (ImageView) findViewById(R.id.splash); splash.startAnimation(anim); // Later.. stop the animation splash.setAnimation(null);
如何旋转中心的图像:
ImageView view = ... //Initialize ImageView via FindViewById or programatically RotateAnimation anim = new RotateAnimation(0.0f, 360.0f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); //Setup anim with desired properties anim.setInterpolator(new LinearInterpolator()); anim.setRepeatCount(Animation.INFINITE); //Repeat animation indefinitely anim.setDuration(700); //Put desired duration per anim cycle here, in milliseconds //Start animation view.startAnimation(anim); //Later on, use view.setAnimation(null) to stop it.
这将导致图像围绕其中心旋转(0.5或50%的宽度/高度)。 我将这篇文章发布给未来的Google读者,因为他们希望将图片旋转到中心位置,而不是以绝对像素为单位定义中心。
您也可以简单地使用旋转animationfunction。 在ImageView上运行一个特定的animation,预定的时间。
Animation rotate = AnimationUtils.loadAnimation([context], R.anim.rotate_picture); splash.startAnimation(rotate);
然后在res / anim中创build一个名为rotate_picture的animationXML文件,内容为:
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" android:shareInterpolator="false"> <rotate android:fromDegrees="0" android:toDegrees="360" android:duration="5000" android:pivotX="50%" android:pivotY="50%"> </rotate> </set>
现在不幸的是,这只会运行一次。 你需要一个循环来让它在等待的时候重复animation。 我尝试了一些,并让我的程序卡在无限循环中,所以我不确定最好的方法。 编辑:克里斯托弗的答案提供了如何使其正确循环的信息,所以删除我的关于单独的线程不好的build议!
一种方法 – 将您的图像分成N个,每次都稍微旋转一下。 我会说5就够了。 然后在drawable中创build这样的东西
<animation-list android:id="@+id/handimation" android:oneshot="false" xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/progress1" android:duration="150" /> <item android:drawable="@drawable/progress2" android:duration="150" /> <item android:drawable="@drawable/progress3" android:duration="150" /> </animation-list>
代码开始
progress.setVisibility(View.VISIBLE); AnimationDrawable frameAnimation = (AnimationDrawable)progress.getDrawable(); frameAnimation.setCallback(progress); frameAnimation.setVisible(true, true);
代码停止
AnimationDrawable frameAnimation = (AnimationDrawable)progress.getDrawable(); frameAnimation.stop(); frameAnimation.setCallback(null); frameAnimation = null; progress.setVisibility(View.GONE);
这里更多
imgDics = (ImageView) v.findViewById(R.id.img_player_tab2_dics); imgDics.setOnClickListener(onPlayer2Click); anim = new RotateAnimation(0f, 360f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); anim.setInterpolator(new LinearInterpolator()); anim.setRepeatCount(Animation.INFINITE); anim.setDuration(4000); // Start animating the image imgDics.startAnimation(anim);
在元素里面放:
android:repeatCount="infinite"
我发现,如果你使用.getWidth / 2等等,它不会工作,你需要得到的图像像素的数量,并自己除以2,然后只需键入最后2个参数。
所以说你的图像是一个120像素×120像素的平方,你的x和y将等于60个像素。 所以在你的代码中,你是对的:
RotateAnimation anim = new RotateAnimation(0f, 350f, 60f, 60f); anim.setInterpolator(new LinearInterpolator()); anim.setRepeatCount(Animation.INFINITE); anim.setDuration(700);
现在你的形象将围绕其中心。
不要硬编码图像边界。 只要使用:
RotateAnimation anim = new RotateAnimation( fromAngle, toAngle, imageView.getDrawable().getBounds().width()/2, imageView.getDrawable().getBounds().height()/2);