Reducir animadamente el tamaño del botón en la prensa y recuperar su tamaño en la versión

Quiero un para crear un botón que cambia de tamaño (poco más pequeño) cuando se presiona, y después de que el botón se libera de nuevo el tamaño debe cambiar de nuevo a tamaño normal. Estoy utilizando Escala xml para lograr esto, pero se volvió a colocar incluso si no suelto el botón.

botón aquí me refiero a imageview.

aquí está mi código fuente: –

imgSpin = (ImageView) findViewById(R.id.iv_spins); imgSpin.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: imgSpin.startAnimation(mAnimation); spinslot(); break; case MotionEvent.ACTION_UP: imgSpin.clearAnimation(); imgSpin.setEnabled(false); break; } return true; } }); 

mi escala Xml: –

 <scale xmlns:android="http://schemas.android.com/apk/res/android" android:duration="200" android:fromXScale=".8" android:fromYScale=".8" android:pivotX="50%" android:pivotY="50%" android:toXScale="1.0" android:toYScale="1.0" > </scale> 

mi XML: –

  <LinearLayout android:id="@+id/layout_status" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight=".2" android:orientation="horizontal" > <View android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight=".5" /> <ImageView android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="2.1" android:background="@drawable/bootser" /> <LinearLayout android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="2.5" android:background="@drawable/bet_bg" android:gravity="center_vertical" android:orientation="horizontal" android:weightSum="1" > <ImageView android:layout_width="0dp" android:layout_height="match_parent" android:layout_gravity="center_vertical" android:layout_weight=".2" android:src="@drawable/leftarrow" /> <TextView android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="1dp" android:layout_weight=".6" android:gravity="center" android:text="Bet" android:textColor="@android:color/white" /> <ImageView android:layout_width="0dp" android:layout_height="40dp" android:layout_gravity="center_vertical" android:layout_weight=".2" android:src="@drawable/rightarrow" /> </LinearLayout> <LinearLayout android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="2.5" android:background="@drawable/container" android:gravity="center" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="2dp" android:text="winning" android:textColor="@android:color/white" /> </LinearLayout> <ImageView android:id="@+id/iv_spins" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1.9" android:background="@drawable/spin" /> <View android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight=".5" /> </LinearLayout> 

Intenté con paramLayout pero como fijé los pesos en XML así que no me da el efecto en la animación.

ya uso este enfoque: –

 case MotionEvent.ACTION_DOWN: ViewGroup.LayoutParams params = imgSpin.getLayoutParams(); // Button new width params.width = params.width - (params.width *90/100); imgSpin.setLayoutParams(params); break; 

params.width siempre me devuelve cero por lo que traté de hacer esto con el peso, mediante el uso de peso mi visión falla en el clic .. quiero que sea suave, así que estoy preferir la escala

Segundo enfoque: –

 case MotionEvent.ACTION_DOWN: LinearLayout.LayoutParams params = (android.widget.LinearLayout.LayoutParams) imgSpin .getLayoutParams(); // Button new width params.weight = 1.7f; imgSpin.setLayoutParams(params); // imgSpin.startAnimation(mAnimation); // spinslot(); break; case MotionEvent.ACTION_UP: LinearLayout.LayoutParams params2 = (android.widget.LinearLayout.LayoutParams) imgSpin .getLayoutParams(); // Button new width params2.weight = 1.9f; imgSpin.setLayoutParams(params2); // imgSpin.clearAnimation(); imgSpin.setEnabled(false); break; } return true; 

funciona pero no es suave

Por favor dime como hacer

Gracias

Esto es lo que quieres:

 imgSpin.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: ObjectAnimator scaleDownX = ObjectAnimator.ofFloat(imgSpin, "scaleX", 0.8f); ObjectAnimator scaleDownY = ObjectAnimator.ofFloat(imgSpin, "scaleY", 0.8f); scaleDownX.setDuration(1000); scaleDownY.setDuration(1000); AnimatorSet scaleDown = new AnimatorSet(); scaleDown.play(scaleDownX).with(scaleDownY); scaleDown.start(); spinslot(); break; case MotionEvent.ACTION_UP: ObjectAnimator scaleDownX2 = ObjectAnimator.ofFloat( imgSpin, "scaleX", 1f); ObjectAnimator scaleDownY2 = ObjectAnimator.ofFloat( imgSpin, "scaleY", 1f); scaleDownX2.setDuration(1000); scaleDownY2.setDuration(1000); AnimatorSet scaleDown2 = new AnimatorSet(); scaleDown2.play(scaleDownX2).with(scaleDownY2); scaleDown2.start(); imgSpin.setEnabled(false); break; } return true; } }); 

Y acaba de hacer algunos cambios en su xml: –

 <ImageView android:id="@+id/iv_spins" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1.9" android:adjustViewBounds="true" android:background="@drawable/spin" android:scaleX="1" android:scaleY="1" /> 

Puede añadir la propiedad fillafter: android: fillAfter = "true"

 <scale xmlns:android="http://schemas.android.com/apk/res/android" android:duration="200" android:fromXScale=".8" android:fromYScale=".8" android:pivotX="50%" android:pivotY="50%" android:fillAfter="true" android:toXScale="1.0" android:toYScale="1.0" > </scale> 
 <ImageView android:id="@+id/iv_spins" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1.9" android:adjustViewBounds="true" android:background="@drawable/spin" android:scaleX="1" android:scaleY="1" /> 

Mejores prácticas de Android (para su requerimiento):

1- Crea dos XML en / res / animator

yo. reduce_size.xml

 <?xml version="1.0" encoding="utf-8"?> <set android:ordering="sequentially" xmlns:android="http://schemas.android.com/apk/res/android"> <set> <objectAnimator android:propertyName="scaleX" android:duration="300" android:valueTo="0.9f" android:valueType="floatType"/> <objectAnimator android:propertyName="scaleY" android:duration="300" android:valueTo="0.9f" android:valueType="floatType"/> </set> </set> 

Ii. regain_size.xml

 <?xml version="1.0" encoding="utf-8"?> <set android:ordering="sequentially" xmlns:android="http://schemas.android.com/apk/res/android"> <set> <objectAnimator android:propertyName="scaleX" android:duration="1000" android:valueTo="1f" android:startOffset="300" android:valueType="floatType"/> <objectAnimator android:propertyName="scaleY" android:duration="1000" android:valueTo="1f" android:startOffset="300" android:valueType="floatType"/> </set> </set> 

2- Uso

yo. Cuando MotionEvent.ACTION_DOWN

 AnimatorSet reducer = (AnimatorSet) AnimatorInflater.loadAnimator(mContext,R.animator.squeeze_in); reducer.setTarget(view); reducer.start(); 

Ii. Cuando MotionEvent.ACTION_UP

 AnimatorSet regainer = (AnimatorSet) AnimatorInflater.loadAnimator(mContext,R.animator.squeeze_out); regainer.setTarget(view); regainer.start(); 

Esta solución se prueba a fondo y se garantiza para alcanzar su requisito.

  • Android: Detectar el botón ACTION_UP fuera del evento
  • ¿Es OnTouchListener más rápido que OnClickListener?
  • EditText en ListView pierde foco cuando se presiona en Android 4.x
  • ¿Cómo manejar hacer clic en las vistas secundarias y tocar en los ViewGroups de los padres?
  • "Presione y mantenga presionado" en Android necesita cambiar estados (selector XML personalizado) usando onTouchListener
  • cómo deslizar un evento button onTouch en android
  • Saltar ImageView mientras arrastra. Los valores de getX () y getY () saltan
  • Problema en OnTouchListener para ImageView
  • Android: ¿Cómo determinar el índice de caracteres de la posición de un evento táctil en TextView?
  • ¿Cómo manejar eventos de toque en un fragmento?
  • ¿Cómo hacer algo repetidamente mientras se presiona un botón?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.