studio programas para imagenes hacer developers crear boton app animaciones animacion android android-animation

programas - hacer animaciones 3d en android



Shaking/Wobble View animaciĆ³n en Android (12)

Creé un efecto Shake en Android y lo publiqué en GitHub. A ver si funciona mejor.

https://github.com/teoinke/ShakeAnimation

Código relevante:

<?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>

Creé un archivo anim.xml como el que se muestra a continuación para sacudir la vista de imagen, como el ícono de IOS que se sacude en Android. Sin embargo no me proporciona el mismo resultado. ¿Hay alguna idea mejor?

<?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" />


Creé una muy buena aproximación de la agitación de iOS (cuando presionas un ícono para eliminar la aplicación de la pantalla de inicio). Debe aplicar dentro de su código, programáticamente, ya que requiere la generación de números aleatorios:

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);

Este código fue diseñado para aplicarse dentro de la vista de cuadrícula de un adaptador (getView), pero puede aplicar a cualquier vista cambiando la última línea a:

yourViewName.setAnimations (s);


Este funciona bastante bien (aunque no perfectamente) como un clon de sacudida "PIN incorrecto" de iOS:

final float FREQ = 3f; final float DECAY = 2f; // interpolator that goes 1 -> -1 -> 1 -> -1 in a sine wave pattern. TimeInterpolator decayingSineWave = new TimeInterpolator() { @Override public float getInterpolation(float input) { double raw = Math.sin(FREQ * input * 2 * Math.PI); return (float)(raw * Math.exp(-input * DECAY)); } }; shakeField.animate() .xBy(-100) .setInterpolator(decayingSineWave) .setDuration(500) .start();


Golpeando mi cabeza durante más de dos horas, supe cómo sacudir y tambalear una vista.

Desafortunadamente, la respuesta aceptada no funcionará aparte de onCreateView del fragmento.

Ejemplo si tiene el método onClick y dentro de él. Tienes animación como la de abajo, no funcionará.

Por favor, vaya a través del código.

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

El método de registro tiene algunas verificaciones como el código de abajo

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(); }

El Call animationServiceList.start (); nunca será llamado,

SOLUCIÓN: Use PropertyAnimator como ObjectAnimator.


Intenta configurar android:repeatMode="reverse" . A continuación la animación da una imitación muy razonable en mi Galaxy Nexus. Obviamente puedes ajustar los parámetros a tu gusto.

<?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" />


La animación de oscilación de IOS no es tan simple tratar de cambiar los pivotes x e y aleatoriamente cuando se gira. Sin embargo, debe cambiar el valor programáticamente. Puede ser que también puedas usar la animación de traducir simultáneamente.


Otras respuestas también son correctas, pero esto es un poco más suave que ellas, ya que utiliza un interpolador que produce números suaves para retroceder y avanzar.

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); } }


Para hacer un efecto de batido como este.

Primero define la animación de Shake dentro de la carpeta anim como 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>

Luego en codigo

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


Podrías probar esto:

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" />

ciclo_7.xml

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


intenta usar este

<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>


Animación agradable del batido ;

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>

Cómo usarlo

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


/** * * @param view view that will be animated * @param duration for how long in ms will it shake * @param offset start offset of the animation * @return returns the same view with animation properties */ public static View makeMeShake(View view, int duration, int offset) { Animation anim = new TranslateAnimation(-offset,offset,0,0); anim.setDuration(duration); anim.setRepeatMode(Animation.REVERSE); anim.setRepeatCount(5); view.startAnimation(anim); return view; }

utilizar:

TextView tv; makeMeShake(tv,20,5); // it will shake quite fast