اجرای انیمیشن عناصر اکتیویتی موقع برگشتن به اکتیویتی (حل شد)
سلام
چند تا اکتیوتی داریم که عناصر داخلشون انیمیشن دارند موقع اجرا با وارد شدن به هر اکتیویتی عناصر با انیمیشن اجرا میشند ولی موقعی که بر میگردیم به اکتیویتی قبلی دیگه انیمیشن اجرا نمیشه ولی اگه دوباره وارد اکتیویتی های بعدی بشیم انیمیشن دارند
چرا با برگشتن به اکتیویتی انیمیشن اجرا نمیشه ؟ راه حل ؟
یه سوال دیگه هم دارم :
فرض کنید داخل یک اکتیویتی سه تا دکمه داریم که انیمیشن دارند چجوری میشه بین set و اجرا کردن انیمیشن هر کدوم یه تاخیر انداخت ؟ که هر سه دکمه همزمان شروع به اجرا انیمیشن و ورود به صفحه نکنند ؟
ممنون
سلام. نکته اینه که شما وقتی به یک اکتیویتی میری، اون اکتیویتی اجرا میشه. ولی وقتی برمیگردی اون اکتیویتی قبلی دیگه اجرا نمیشه! بلکه داخل استک بوده، در واقع فقط resume میشه و تصویری که جلوش بوده برداشته میشه. شما باید برای تفهیم این مطلب بحث Activity Life Cycle رو مطالعه کنی. اما بصورت کلی یا باید متد onBackPressed اکتیویتی دومی، یا onResume اولی رو اورراید کنی و اجرای هر چیزی که میخوای رو داخلش بزاری..
برای سوال دومت هم یا میتونی مقطع زمانی تعریف کنی یا اینکه متد onAnimationEnd رو برای انیمیشن ها به ترتیب اورراید کنی. موفق باشی...
پاسخ سوال دومتون:
final AnimatorSet step2 = new AnimatorSet();
step2.playTogether(
ObjectAnimator.ofFloat(linearMain, View.SCALE_X, 0.03f, 1f),
ObjectAnimator.ofFloat(linearMain, View.ALPHA, 0.5f, 1f)
);
step2.setDuration(500);
step2.setStartDelay(500);
step2.start();
از setStartDelay استفاده کنید.
اقا یکی لطف کنه این کد برا ما مبتدیا بگه
public Button btnStart ;
public Button btnSetting ;
public Button btnExit ;
private Animation animation ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_menu);
btnStart =(Button)findViewById(R.id.btnStart);
btnHelp =(Button)findViewById(R.id.btnHelp);
btnExit =(Button)findViewById(R.id.btnExit);
animation = AnimationUtils.loadAnimation(G.context,R.anim.menu_button);
btnStart.setAnimation(animation);
btnSetting.setAnimation(animation);
btnExit.setAnimation(animation);
الان سه تا دکمه داریم هر سه از یه انیمیشن استفاده میکنند چجوری بین اینا تاخیر بزاریم ؟
با تشکر .
ببینید اینکه من اینجا کد رو به شما بدم کار اشتباهیه، من باید راه رو به شما بگم و شما برید دنبالش و پیاده سازیش کنید.
پیشنهاد من اینه که حتما ObjectAnimator رو مطالعه کنید، از اونجایی که در Api زیر 11 کار نمیکنه یک Library براش اومده که کاراییش کاملا مشابه نسخه اصلیش هست.اون Library رو هم دانلود کنید و استفاده ازش رو یاد بگیرید.
و اما جواب سوال بالا:
private void animations(final View view,int delayInterval, int xmlAnim){
Animation delayAnimation = AnimationUtils.loadAnimation(G.context, R.id.delayAnim); delayAnimation.setDuration(delayInterval);
view.startAnimation(delayAnimation); <---------------
delayAnimation.setAnimationListener(new Animation.AnimationListener() { @Override public void onAnimationStart(Animation animation) { } @Override public void onAnimationEnd(Animation animation) {
view.setVisibility(View.VISIBLE); Animation myAnimation = AnimationUtils.loadAnimation(G.context, xmlAnim); view.startAnimation(myAnimation);
} @Override public void onAnimationRepeat(Animation animation) { } }); }
روش استفاده:
این متد رو به پروژه تون اضافه کنید. بعد از Cast کردن Button ها ، فقط کافیه کد زیر رو اجرا کنید.
animations(btnStart ,100,R.anim.menu_button);
animations(btnHelp ,500,R.anim.menu_button);
animations(btnExit ,1000,R.anim.menu_button);
توضیحات:
شما برای Delay انداختن بین Animation ها نمیتونید از Thread استفاده کنید. ولی میتونید یک انیمیشن خالی که از 0 به 0 میره تعریف کنید، این انیمیشن Process رو استفاده نمیکنه، و بعد از اتمام اون انیمیشن بگید که این انیمیشن من اجرا بشه، البته این روش اشتباهه و هنوزم تاکید من بر روی ObjectAnimator هست.
من اینجوری نوشتم ( کپی پیست کردم و یکم تغییر دادم ) علی جان. برای گذاشتن اون ویوی اضافی هم باید بگم که مجبورم چون ویو ها قبل از انیمیشن باید invisible باشن و اگه خود ویو رو اونجا ست کنم قبل از اینکه بخوام نمایش پیدا کنه یهومیپره وسط و میره بعدش انیمیشن اصلی اجرا میشه که خب طبق حرف خودتون این یه مثاله و بنا به پروژه باید تغییرش داد
private void animations(final View view,int delayInterval, final int xmlAnim){
Animation delayAnimation = AnimationUtils.loadAnimation(SherKhundan.this , R.anim.delayanim);
delayAnimation.setDuration(delayInterval);
space.startAnimation(delayAnimation);
delayAnimation.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
animation = AnimationUtils.loadAnimation(SherKhundan.this, xmlAnim);
view.startAnimation(animation);
view.setVisibility(View.VISIBLE);
}
@Override
public void onAnimationRepeat(Animation animation) {
}
});
}
و بعد هم توی oncreate اینجوری صداش زدم واسه سه تا ویو ( از ۱۰ تا )
animations(imgsher2 , 3000 , R.anim.sher1);
animations(imgsher3 , 6000 , R.anim.sher1);
animations(imgsher4 , 9000 , R.anim.sher1);
ولی فقط آخری اجرا میشه و بس
ولی
یه متد نوشتم به این صورت:
private void anim (final View v , long time , final int xmlAnim){
Animation myanimation = AnimationUtils.loadAnimation(ActivityDeklame.this, xmlAnim);
myanimation.setStartOffset(time);
v.startAnimation(myanimation);
v.setVisibility(View.VISIBLE);
}
بعد هم توی oncreate صداش زدم با مقادیر دلخواه:
anim(imageback , 3000 , R.anim.sher1); anim(imageman , 6000 , R.anim.sher1); anim(imagetext , 9000 , R.anim.sher1)
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .