在Android中晃动/摆动视图animation

我创build了一个anim.xml文件,如下面的图像抖动android的IOS图标抖动imageview。 但是,它不提供相同的结果。 有没有更好的主意?

<?xml version="1.0" encoding="utf-8"?> <rotate xmlns:android="http://schemas.android.com/apk/res/android" android:duration="300" android:fromDegrees="-2" android:pivotX="50%" android:pivotY="50%" android:repeatCount="infinite" android:toDegrees="2" /> 

尝试设置android:repeatMode="reverse" 。 在animation下面给我一个非常合理的模仿Galaxy Nexus。 显然你可以根据自己的喜好微调参数。

 <?xml version="1.0" encoding="utf-8"?> <rotate xmlns:android="http://schemas.android.com/apk/res/android" android:duration="100" android:fromDegrees="-5" android:pivotX="50%" android:pivotY="50%" android:repeatCount="infinite" android:repeatMode="reverse" android:toDegrees="5" /> 

你可以试试这个:

shake.xml

 <translate xmlns:android="http://schemas.android.com/apk/res/android" android:fromXDelta="0" android:toXDelta="10" android:duration="1000" android:interpolator="@anim/cycle_7" /> 

cycle_7.xml

 <cycleInterpolator xmlns:android="http://schemas.android.com/apk/res/android" android:cycles="7" /> 

尝试使用这一个:

 <set xmlns:android="http://schemas.android.com/apk/res/android"> <rotate android:duration="70" android:fromDegrees="-5" android:pivotX="50%" android:pivotY="50%" android:repeatCount="5" android:repeatMode="reverse" android:interpolator="@android:anim/linear_interpolator" android:toDegrees="5" /> <translate android:fromXDelta="-10" android:toXDelta="10" android:repeatCount="5" android:repeatMode="reverse" android:interpolator="@android:anim/linear_interpolator" android:duration="70" /> </set> 

我的摇动animation在下面;

res / anim shake.mxl

 <set xmlns:android="http://schemas.android.com/apk/res/android"> <translate android:duration="150" android:fromXDelta="-10%" android:repeatCount="5" android:repeatMode="reverse" android:toXDelta="10%"/> </set> 

在这里如何使用它

 final Animation animShake = AnimationUtils.loadAnimation(this, R.anim.shake); btn_done = (Button) findViewById(R.id.btn_act_confirmation_done); btn_done.startAnimation(animShake); 

我在Android上创build了一个摇动效果,并发布在GitHub上。 看看它是否工作得更好。

https://github.com/teoinke/ShakeAnimation

相关代码:

 <?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/overshoot_interpolator" android:fillAfter="true"> <translate android:startOffset="100" android:fromXDelta="0%p" android:toXDelta="10%p" android:duration="50" /> <translate android:startOffset="150" android:fromXDelta="0%p" android:toXDelta="-25%p" android:duration="110" /> <translate android:startOffset="260" android:fromXDelta="0%p" android:toXDelta="25%p" android:duration="120" /> <translate android:startOffset="380" android:fromXDelta="0%p" android:toXDelta="-20%p" android:duration="130" /> <translate android:startOffset="510" android:fromXDelta="0%p" android:toXDelta="10%p" android:duration="140" /> </set> 

为了使这样的摇动效果

在这里输入图像说明

首先在animation文件夹中将shakeanimation定义为shake.xml

 <?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <rotate android:duration="70" android:fromDegrees="-5" android:interpolator="@android:anim/linear_interpolator" android:pivotX="50%" android:pivotY="50%" android:repeatCount="5" android:repeatMode="reverse" android:toDegrees="5" /> <translate android:duration="70" android:fromXDelta="-10" android:interpolator="@android:anim/linear_interpolator" android:repeatCount="5" android:repeatMode="reverse" android:toXDelta="10" /> </set> 

然后在代码中

 if (TextUtils.isEmpty(phone.getText()) || phone.getText().length() < 10) { //shake animation phone.startAnimation(AnimationUtils.loadAnimation(getActivity(), R.anim.shake)); } 

IOS摆动animation不是那么简单,试着在旋转时随机地改变x轴和y轴。 你应该编程改变值。 也许你也可以同时使用翻译animation

把我的头撞了两个多小时,我知道如何摆动和晃动一个景色。

不幸的是,接受的答案将不会工作除了onCreateView的片段。

示例如果您有onClick方法,并在其中。 你有像下面的animation不会工作。

请通过代码。

  DoneStart.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { register(view); } }); 

注册方法有一些像下面的代码检查

  private void register(View view) { String type = typedThings.getText.toString(); String km = Km_Now.getText().toString(); if (serviceType == null) { animationServiceList = AnimationUtils.loadAnimation(getActivity(), R.anim.shake_wobble); silverServiceButton.setAnimation(animationServiceList); generalServiceButton.setAnimation(animationServiceList); platinumServiceButton.setAnimation(animationServiceList); animationServiceList.start(); } else if (km == null) { animationEditText = AnimationUtils.loadAnimation(getActivity(), R.anim.shake_wobble); Km_Now.setAnimation(animationEditText); animationEditText.start(); } 

调用animationServiceList.start(); 永远不会被调用,

解决scheme:使用PropertyAnimator,如ObjectAnimator。

其他答案也是正确的,但是这比它们更平滑一些,因为它使用内插器产生平滑的数字用于返回移动

  public class WobblyView extends ImageView implements ValueAnimator.AnimatorUpdateListener { private final ValueAnimator va = ValueAnimator.ofInt(-10, 10); public WobblyView(Context context) { this(context, null); } public WobblyView(Context context, @Nullable AttributeSet attrs) { this(context, attrs, 0); } public WobblyView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); setAdjustViewBounds(true); setImageResource(R.drawable.ic_logo); va.setInterpolator(new AccelerateDecelerateInterpolator()); va.setRepeatMode(ValueAnimator.REVERSE); va.setRepeatCount(ValueAnimator.INFINITE); va.setDuration(1000); } @Override protected void onAttachedToWindow() { super.onAttachedToWindow(); va.addUpdateListener(this); va.start(); } @Override protected void onDetachedFromWindow() { super.onDetachedFromWindow(); va.removeUpdateListener(this); } @Override public void onAnimationUpdate(ValueAnimator animation) { int heading = (int) animation.getAnimatedValue(); setRotation(heading); } } 

我创build了一个非常好的iOS晃动近似(当你长按一个图标从主屏幕上删除应用程序)。 您必须以编程方式应用您的代码,因为它需要随机数生成:

 int dur1 = 70 + (int)(Math.random() * 30); int dur2 = 70 + (int)(Math.random() * 30); // Create an animation instance Animation an = new RotateAnimation(-3, 3, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); // Set the animation's parameters an.setDuration(dur1); // duration in ms an.setRepeatCount(-1); // -1 = infinite repeated an.setRepeatMode(Animation.REVERSE); an.setFillAfter(true); // keep rotation after animation // Create an animation instance Animation an2 = new TranslateAnimation(-TranslateAnimation.RELATIVE_TO_SELF,0.02f, TranslateAnimation.RELATIVE_TO_SELF,0.02f, -TranslateAnimation.RELATIVE_TO_SELF,0.02f, TranslateAnimation.RELATIVE_TO_SELF,0.02f); // Set the animation's parameters an2.setDuration(dur2); // duration in ms an2.setRepeatCount(-1); // -1 = infinite repeated an2.setRepeatMode(Animation.REVERSE); an2.setFillAfter(true); // keep rotation after animation AnimationSet s = new AnimationSet(false);//false means don't share interpolators s.addAnimation(an); s.addAnimation(an2); // Apply animation to image view itemView.setAnimation(s); 

这段代码被devise为在适配器的gridview(getView)中应用,但是可以通过将最后一行改为:

yourViewName.setAnimations(一个或多个);