2014-01-08 4 views
9

Я пытаюсь анимировать ImageView при щелчке по указанному изображению.Как программно анимировать ImageView

В частности, я хочу, чтобы размер ImageView увеличивался (скажем, на 20 больше) и сразу уменьшался до первоначального размера).

До сих пор я экспериментировал с этим кодом без везения.

// thumbLike is the imageView i would like to animate. 
button.setOnClickListener(new OnClickListener(){ 
    @Override 
    public void onClick(View v) { 
     // TODO Auto-generated method stub 
     ScaleAnimation scaleAnim = new ScaleAnimation(1.0f, 2.5f, 1.0f, 2.5f, 
            Animation.RELATIVE_TO_SELF, 0.5f, 
            Animation.RELATIVE_TO_SELF, 0.5f); 
     scaleAnim.setInterpolator(new LinearInterpolator()); 
     scaleAnim.setDuration(1500); 
     thumbLike.startAnimation(scaleAnim); 
     thumbLike.setAnimation(null); 
    } 
}); 

Может ли кто-нибудь предложить мне возможное решение?

Редактировать # 1

Он работает через XML, как ответил Hardik4560:

// finally i use this code to execute the animation 
Animation animationScaleUp = AnimationUtils.loadAnimation(this, R.anim.scale_up); 
Animation animationScaleDown = AnimationUtils.loadAnimation(this, R.anim.scale_down); 

AnimationSet growShrink = new AnimationSet(true); 
growShrink.addAnimation(animationScaleUp); 
growShrink.addAnimation(animationScaleDown); 
thumbLike.startAnimation(growShrink); 

и XML

SCALE_UP 
<?xml version="1.0" encoding="utf-8"?> 
<set xmlns:android="http://schemas.android.com/apk/res/android" 
    android:interpolator="@android:anim/linear_interpolator"> 
    <scale 
     android:fromXScale="1.0" 
     android:toXScale="1.5" 
     android:fromYScale="1.0" 
     android:toYScale="1.5" 
     android:pivotX="50%" 
     android:pivotY="50%" 
     android:duration="1000" /> 
</set> 

SCALE_DOWN 
<?xml version="1.0" encoding="utf-8"?> 
<set xmlns:android="http://schemas.android.com/apk/res/android" 
    android:interpolator="@android:anim/linear_interpolator"> 
    <scale 
     android:fromXScale="1.5" 
     android:toXScale="1.0" 
     android:fromYScale="1.5" 
     android:toYScale="1.0" 
     android:pivotX="50%" 
     android:pivotY="50%" 
     android:duration="1000" /> 
</set> 

пс: это неудобно, так как я уже принял ответ. Я пытаюсь объединить ответы @tharkbad и @ Hardik4560, но теперь способ, которым он оживляет, не выглядит гладким.

во время анимации scale_up, это похоже на «пропустить» до конца анимации, а затем сразу же запустить анимацию scale_down. Думаю, мне нужно немного поиграть с ним.

+0

является то производить какую-либо ошибку? – Kitkat

+0

Нет, это не так. Это просто ничего не делает. – Jeremy

ответ

5

Я использую это для достижения POPIN эффекта Всплывающего окна,

Смотрите, если его любое использование к вам

выскочить.

<?xml version="1.0" encoding="utf-8"?> 
<set 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:interpolator="@android:anim/bounce_interpolator" > 
    <scale 
     android:pivotX="50%" 
     android:pivotY="50%" 
     android:fromXScale="0.5" 
     android:fromYScale="0.5" 
     android:toXScale="1.0" 
     android:toYScale="1.0" 
     android:duration="500" /> 

</set> 

Поп В

<?xml version="1.0" encoding="utf-8"?> 
<set 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:interpolator="@android:anim/bounce_interpolator" > 
    <scale 
     android:pivotX="50%" 
     android:pivotY="50%" 
     android:fromXScale="1.0" 
     android:fromYScale="1.0" 
     android:toXScale="0.0" 
     android:toYScale="0.0" 
     android:duration="500" /> 

</set> 
+0

Привет, да, сейчас он работает. Благодарю. Я не могу принять ваш ответ в данный момент. – Jeremy

+0

Не беспокойтесь. Счастлив, что это помогло. Может быть, позже вы согласитесь :) – Hardik4560

+0

@ username55, Подождите 5 минут, затем вы можете принять этот ответ. – Kitkat

18

Если вы хотите реализовать это без XML вы можете сделать это следующим образом

final float growTo = 1.2f; 
final long duration = 1200; 

ScaleAnimation grow = new ScaleAnimation(1, growTo, 1, growTo, 
             Animation.RELATIVE_TO_SELF, 0.5f, 
             Animation.RELATIVE_TO_SELF, 0.5f); 
grow.setDuration(duration/2); 
ScaleAnimation shrink = new ScaleAnimation(growTo, 1, growTo, 1, 
              Animation.RELATIVE_TO_SELF, 0.5f, 
              Animation.RELATIVE_TO_SELF, 0.5f); 
shrink.setDuration(duration/2); 
shrink.setStartOffset(duration/2); 
AnimationSet growAndShrink = new AnimationSet(true); 
growAndShrink.setInterpolator(new LinearInterpolator()); 
growAndShrink.addAnimation(grow); 
growAndShrink.addAnimation(shrink); 
thumbLike.startAnimation(growAndShrink); 

Конечно, вы можете также использовать NineOldAndroids и использовать новую анимацию методы.

Я думаю, что ваша первоначальная ошибка в этой строке, она удаляет анимацию, которую вы только что начали с представления.

thumbLike.setAnimation(null); 
+0

спасибо за указание .... – Jeremy

+0

@Thrakbad Как я могу сделать, только когда это будет сделано с анимацией, тогда выполните что-то еще? –

+0

Вам нужно добавить анимационную анимацию «AnimationListener» (или «AnimatorListener» для NineOldAndroids/новых анимаций). – Thrakbad

0

Я создал ту же анимацию с помощью Котлин:

Repo:https://github.com/David-Hackro/Bounce-Animation

Вам необходимо создать свой элемент и расширить ничего (ImageView, кнопки и т.д.) в моем случае у создал класс с именем BounceWidget

enter image description here

Добавить элемент в XML

<hackro.tutorials.com.bounceWidget.widget.BounceWidget 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" /> 

Добавить элемент программно

val xpp = resources.getXml(R.xml.bouncewidget) 
val attr = Xml.asAttributeSet(xpp) 
val layout : LinearLayout = findViewById(R.id.layout) 
val octocat1 : BounceWidget = BounceWidget(this,attr) 

//you can change this values and have default values 

//octocat1.id_resource(R.mipmap.bounceimage) // change image --> default : R.mipmap.ic_launcher 
//octocat1.positionX = 1 //position X starting --> default : 0 
//octocat1.positionY = 1 //position Y starting--> default : 0 
//octocat1.velocityX = 1 //Velocity X --> default : 20 
//octocat1.velocityY = 1 //Velocity Y --> default : 15 

octocat1.layoutParams = LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT) 

layout.addView(octocat1)