简体   繁体   English

如何以编程方式为ImageView设置动画

[英]How to programmatically animate an ImageView

I am trying to animate an ImageView when the said image view is clicked. 我正在尝试在单击所述图像视图时为ImageView设置动画。

Specifically I want the size of the ImageView gets bigger (say .20 bigger) and the immediately shrink back to its original size). 具体来说,我希望ImageView的大小变大(比如.20更大)并立即缩小回原始大小)。

So far I have been experimenting with this code with no luck. 到目前为止,我一直在试验这段代码而没有运气。

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

Can anyone suggest me with a possible solution? 任何人都可以建议我使用可能的解决方案

Edit #1 编辑#1

It is working through XML as answered by Hardik4560: 正如Hardik4560所回答的那样,它正在通过XML工作:

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

and the XML 和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>

ps: this is awkward, since I already accepted an answer. ps:这很尴尬,因为我已经接受了答案。 I am trying to combine between @tharkbad and @Hardik4560 's answers yet now the way it animates does not look smooth. 我试图将@tharkbad和@ Hardik4560的答案结合起来,但现在动画的方式看起来并不顺畅。

during the scale_up animation, it kinda look like being "skip" to the end of animation and then immediately starting scale_down animation. 在scale_up动画期间,它看起来像是“跳过”到动画结束然后立即开始scale_down动画。 I guess I have to play around with it a bit. 我想我必须稍微玩一下。

If you want to implement this without XML you could do so as follows 如果你想在没有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);

Of course, you could also use NineOldAndroids and use the new animation methods. 当然,您也可以使用NineOldAndroids并使用新的动画方法。

I think your original error is this line, it removes the animation you just started from the view again. 我认为您的原始错误是此行,它会再次从视图中删除您刚刚开始的动画。

thumbLike.setAnimation(null);

I use this to achieve popin popout effect, 我用它来实现popin弹出效果,

See if its of any use to you 看看它对你有用

Pop Out. 弹出。

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

Pop In 流行

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

I created the same animation using kotlin: 我使用kotlin创建了相同的动画:

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

You need create your element and extend of anything (ImageView,Button etc) in my case y created a class named BounceWidget 你需要创建你的元素并扩展任何东西(ImageView,Button等),在我的情况下你创建了一个名为BounceWidget的类

在此输入图像描述

Add element in xml 在xml中添加元素

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

Add element programmatically 以编程方式添加元素

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)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM