4

Я хочу, чтобы при нажатии на кнопку была создана кнопка, которая меняет размер (немного меньше), а после того, как кнопка снова отпущена, размер должен измениться до нормального размера. Я использую Scale xml для достижения этого, но он снова позиционирует себя, даже если я не отключаю кнопку.Анимированное уменьшение размера кнопки при нажатии и восстановлении ее размера при выпуске

кнопка здесь я имею в виду образе изображения.

вот мой исходный код: -

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

моя шкала 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>

мой 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>

Я попытался с paramLayout, но, как я установить весы в XML, так что не дает мне эффект на анимации.

я уже используют этот подход: -

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 всегда возвращает меня ноль, так что я пытался сделать это с весом, используя вес мой взгляд глюк на клик ..Я хочу его быть гладкой, так я предпочитающих масштабирование

Второй подход: -

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; 

он работает, но не гладкая

Скажите, пожалуйста, как сделать

Благодарности

ответ

6

Вот то, что вы хотите: -

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

И просто сделайте это несколько изменений в вашем 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" />

делают использование scaleDown.play (scaleDownX).с (scaleDownY), он будет держать анимированную позицию и не будет восстановить его обратно в исходные

Надеются, что это решит вашу проблема веселит

0

Вы можете добавить fillafter свойство: Android: fillAfter = "истинный"

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

Здравствуйте XTR, спасибо за ваш ответ, но, к сожалению, это не работает .. – Siddharth

0

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

+0

Это лучше добавить объяснение. Каким должен быть ваш код/​​сообщение. И не используйте фрагменты кода HTML для кодов компоновки Android XML. – Shashanth

0

Android Best Practice (для ваше требование):

1- Создать два XML в/res/animator

i. 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- Использование

я. Когда MotionEvent.ACTION_DOWN

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

II. Когда MotionEvent.ACTION_UP

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

Этот раствор тщательно протестирован и гарантированно обеспечить ваше требование.

 Смежные вопросы

  • Нет связанных вопросов^_^