Как оживить добавление представления в Android? - PullRequest
15 голосов
/ 15 сентября 2011

Я хотел бы знать, есть ли простой способ добавить представление (кнопку) в 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 ]

15 голосов
/ 15 сентября 2011

В своей деятельности используйте вместо:

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

Где:

1-й параметр - это идентификатор представления, к которому вы хотите применить анимацию.

2-й параметр - это контекст, извлеченный из вашей деятельности.

3-й параметр - это желаемая анимация, которую вы помещаете в папку с ресурсами анима или из предопределенных анимаций Android.

4-й параметр - это начало анимации.

7 голосов
/ 15 сентября 2011

Я проверил вашу реализацию анимированных кнопок, и она работает правильно. Должна быть какая-то другая проблема. Вероятно, как вы добавляете кнопку в макет.

Чтобы добавить свою кнопку в соответствующий макет, используйте код, подобный этому.

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);
0 голосов
/ 08 июня 2018

Не всегда необходимо использовать класс анимации для получения реальной анимации.Мы можем обеспечить задержку при добавлении видов в макет, используя обработчик , как показано.

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);
0 голосов
/ 15 февраля 2018

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

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

Надеюсь, это сработает. Мне потребовалось 2 дня, чтобы сделать эту работу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...