如何在Android中添加视图动画?

时间:2011-09-15 14:19:18

标签: android animation

我想知道是否有一种简单的方法可以将视图(按钮)添加到RelativeLayout,并使用某种缩放动画。 我从Button扩展了一个类并做了类似的事情:

    public class MyButton extends Button {

    @Override
    protected void onAttachedToWindow() {
        super.onAttachedToWindow();
        ScaleAnimation anim = new ScaleAnimation(0,1,0,1);
        anim.setDuration(1000);
        anim.setFillAfter(true);
        this.startAnimation(anim);
    }

然后尝试将此按钮添加到视图中,但它不起作用。请帮忙!

4 个答案:

答案 0 :(得分:15)

在您的活动中,请改为使用:

parentview.addView(myButton);

然后用以下方法设置按钮的动画:

Animation animation = AnimationUtils.loadAnimation(getBaseContext(), R.anim.slide_right_in);
animation.setStartOffset(0);
myButton.startAnimation(animation);

这是slide_right_in.xml

的示例
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate android:fromXDelta="100%p" android:toXDelta="0" android:duration="800"/>
</set>

此外, 这是我写的一个活动播放动画函数:

public Animation PlayAnim( int viewid, Context Con, int animationid, int StartOffset )
{
    View v = findViewById(viewid);

    if( v != null )
    {
        Animation animation = AnimationUtils.loadAnimation(Con, animationid  );
        animation.setStartOffset(StartOffset);
        v.startAnimation(animation);

        return animation;
    }
    return null;
}

您可以这样称呼:

PlayAnim(R.id.bottombar, (Context) this, R.anim.slide_right_in, 0);

其中:

第一个参数是您要应用动画的视图的ID。

第二个参数是在您的活动中检索到的上下文。

第3个参数是您放置在动画资源文件夹或android预定义动画中的所需动画。

第4个参数是动画起始时间。

答案 1 :(得分:7)

我测试了您的动画按钮实现,它可以正常工作。一定有其他一些问题。可能是按钮添加到布局的方式。

要将按钮添加到相对布局,请使用此代码。

RelativeLayout rl = (RelativeLayout)findViewById(R.id.rl);
MyButton b1 = new MyButton(Main.this);
b1.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.WRAP_CONTENT));
rl.addView(b1);

或者你可以从布局中膨胀按钮。为此,请创建包含按钮实现的布局mybtn.xml

<?xml version="1.0" encoding="utf-8"?>
<PACKAGE_OF_MYBUTTON_HERE.MyButton
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  />

将其添加到布局调用中:

RelativeLayout rl = (RelativeLayout)findViewById(R.id.rl);
Button b = (Button)getLayoutInflater().inflate(R.layout.mybtn, rl, false);
rl.addView(b);

将视图添加到相对布局时,视图的正确定位可能存在问题。只需在调用rl.addView(b1)之前添加这样的代码(代码段在someOtherView下面添加新按钮)。

LayoutParams lp = new LayoutParams(b.getLayoutParams());
lp.addRule(RelativeLayout.BELOW, someOtherView.getId());
b.setLayoutParams(lp);

答案 2 :(得分:0)

您可以尝试在添加视图之前将其添加到您的代码中。我猜这段代码适用于任何视图更改。在我的情况下,用动画切换2个视图。

TransitionManager.beginDelayedTransition(layoutlocation);//layoutlocation is parent layout(In my case relative layout) of the view which you gonna add.

希望它有效。我花了两天时间完成这项工作。

答案 3 :(得分:0)

并不总是需要使用动画类来获取实际动画。我们可以使用处理程序向布局添加视图时提供延迟,如图所示。

Handler handler = new Handler();
handler.postDelayed(new Runnable() {
    public void run() {
        Animation fadeanimation = new AlphaAnimation(0,1);
        fadeanimation.setDuration(position*60+100);
        child.setAnimation(fadeanimation);
        linearLayout.addView(child);
    }
}, position*60);