بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]
پرسش و پاسخ

اجرای انیمیشن عناصر اکتیویتی موقع برگشتن به اکتیویتی (حل شد)

مدیریت گفتگو
doost_fu 11 سال پیش
آخرین تغییر: 11 سال پیش

سلام

چند تا اکتیوتی داریم که عناصر داخلشون انیمیشن دارند موقع اجرا با وارد شدن به هر اکتیویتی عناصر با انیمیشن اجرا میشند ولی موقعی که بر میگردیم به اکتیویتی قبلی دیگه انیمیشن اجرا نمیشه ولی اگه دوباره وارد اکتیویتی های بعدی بشیم انیمیشن دارند

چرا با برگشتن به اکتیویتی انیمیشن اجرا نمیشه ؟ راه حل ؟

 یه سوال دیگه هم دارم :

فرض کنید داخل یک اکتیویتی سه تا دکمه داریم که انیمیشن دارند چجوری میشه بین set و اجرا کردن انیمیشن هر کدوم یه تاخیر انداخت ؟ که هر سه دکمه همزمان شروع به اجرا انیمیشن و ورود به صفحه نکنند ؟

ممنون

نظرات

پاسخ‌ها 6

MeyrOOn 11 سال پیش

سلام. نکته اینه که شما وقتی به یک اکتیویتی میری، اون اکتیویتی اجرا میشه. ولی وقتی برمیگردی اون اکتیویتی قبلی دیگه اجرا نمیشه! بلکه داخل استک بوده، در واقع فقط resume میشه و تصویری که جلوش بوده برداشته میشه. شما باید برای تفهیم این مطلب بحث Activity Life Cycle رو مطالعه کنی. اما بصورت کلی یا باید متد onBackPressed اکتیویتی دومی، یا onResume اولی رو اورراید کنی و اجرای هر چیزی که میخوای رو داخلش بزاری..
برای سوال دومت هم یا میتونی مقطع زمانی تعریف کنی یا اینکه متد onAnimationEnd رو برای انیمیشن ها به ترتیب اورراید کنی. موفق باشی...

نظرات

doost_fu 11 سال پیش
در onResume اکتیویتی اول انیمیشن هارو روی دکمه ها set کردم فرقی نکرد . در onBaclPressed اکتیویتی دوم intent گذاشتم تا به اکتیویتی اول برگرده ولی فرقی نکرد و اگه موقع رفتن به اکتیویتی دوم ، اکتیویتی اول finish بشه ، دیگه از همون اکتیویتی دوم خارج میشه و اگه finish نشه مثل حالت اول کار میکنه !
doost_fu 11 سال پیش
خب درست شد ! باید موقع رفتن به اکتیویتی دوم ، اولی رو بست و داخل دومی در onBaclPressed به وسیله Intent برگشت .
doost_fu 11 سال پیش
اون قسمت دوم سوالم ، چجوری باید بین انیمیشن ها تاخیر ایجاد کرد؟ باید از setAnimationListener استفاده کرد ? من یه فایل انیمیشن دارم و از اون برا پنج تا دکمه استفاده کردم الان هم باهم شروع میکنند ولی من می خوام با تاخیر یکی یکی شروع به کار کنند
hosseinAmini 11 سال پیش
خب با thread می تونید تاخیر بندازید بین زمانی که باید انیمیشن رو اجرا کنه
doost_fu 11 سال پیش
همون اول امتحان کردم نشد مطمئن هستید با thread جواب میده ؟
hosseinAmini 11 سال پیش
من با handler استفاده کردم جواب میده، thread هم باید جواب بده. از thread sleep استفاده کردید دیگه؟
Hajhosseini 11 سال پیش

پاسخ سوال دومتون:

 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 استفاده کنید.

نظرات

doost_fu 11 سال پیش
ممنون ، میشه ای کد یه توضیح هم بدید ، من انیمیشن در یک فایل xml ساختم
Hajhosseini 11 سال پیش
خوب جایی که میخواید انیمیشن رو استارت کنید setStartDelay رو استفاده کنید
doost_fu 11 سال پیش
من درست این کد متوجه نشدم توی اموزشها جایی در موردش توضیح داده شده ؟
MeyrOOn 11 سال پیش
سلام.. توی کد java همونجایی که انیمیشن رو به یه کنترل نسبت میدید از delay استفاده کن
amirfallahi 11 سال پیش
علی جان از همین کد میتونم استفاده کنم؟ بجای اینکه فایل ایگزمل برای انیمیشن بسازیم از این استفاده میکنیم درسته؟ بعد برای هر ۱۰ ویو باید یه دور بنویسم این کد ها رو یا یه متد تعریف کنم و توش صدا بزنم. درسته؟ ( ObjectAnimator همینه؟ این که راحت تر از اون متدست :D )
Hajhosseini 11 سال پیش
بله میتونید از همین استفاده کنید، فقط این کد در حالت عادی در اندروید ورژن 3 به بالا Run میشه، اگر بخواید در ورژن پایین استفاده کنید باید یک Library داره که دانلودش کنید و از اون به همین صورت استفاده کنید. تازه اینو میشه خلاصش رو در یک خط هم نوشت.
amirfallahi 11 سال پیش
علی جان مشکلی نیست اتفاقا اندروید ۴ به بالا رو نیاز دارم فقط خداروشکر. منتهی من الان استفاده کردم اینو ولی جواب نگرفتم. اصلا هیچ عملی انجام نمیشه. تو یه متد تعریفش کردم و ویو رو بهش میدم ولی کاری نمیکنه
Hajhosseini 11 سال پیش
امیر جان این رو از برنامه خودم برداشتم، 100% این کد درست کار میکنه.در صورتی که مشکل رو پیدا نکردید کد کامل اکتیویتی تون رو درج کنید.
amirfallahi 11 سال پیش
اصلا هیچ کدومشون جواب نمیگیره. یه اکتیویتی دیگه ساختم از اول همه کدهارو نوشتم ولی انگار نه انگار :| کل کد ها رو میذارم تو پاسخ. بی زحمت یه نگاه بهشون بنداز علی جان. من دیگه رد داده مخم واقعا :|
amirfallahi 11 سال پیش
آقا جواب گرفتم همینجا مینویسمش که زیاد شلوغ نشه. از صاحب تاپیک هم عذر میخوام که انقد شلوغ پلوغ کردم اینجا رو :D
doost_fu 11 سال پیش

اقا یکی لطف کنه این کد برا ما مبتدیا بگه

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

الان سه تا دکمه داریم هر سه از یه انیمیشن استفاده میکنند چجوری بین اینا تاخیر بزاریم ؟

با تشکر .

نظرات

amirfallahi 11 سال پیش
دوستان من از هندلر استفاده کردم برای تاخیر دادن ولی برای بیشتر از یک بار جواب نگرفتم. یعنی فقط یه بار تونستم تاخیر ایجاد کنم. الان میخوام از ترد ها کمک بگیرم و داخل اونا هندلر بذارم. به نظر شما کار درستیه؟
Hajhosseini 11 سال پیش

ببینید اینکه من اینجا کد رو به شما بدم کار اشتباهیه، من باید راه رو به شما بگم و شما برید دنبالش و پیاده سازیش کنید.
پیشنهاد من اینه که حتما 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 هست.

نظرات

doost_fu 11 سال پیش
درسته ، حق با شماست ! این روش هم که میگید غیر اصولیه ! ولی کاش به جای توضیح این روش ، چند خط در مورد همون پاسخ اولی که در پست قبلی تون داده بودید توضیح میدادید که همون ObjectAnimator بود چون من همونجا هم گفتم اون کد متوجه نشدم ! ولی میرم دنبالش ببینم چجوریه ! بازم بابت راهنمایی و وقتی گذاشتید ممنونم ، موفق باشید .
amirfallahi 11 سال پیش
علی جان ممنون از کد ها . برای این پروژه همین هم کار من رو راه میندازه به نظرم. و بعد از این پروژه که چندان هم مهم نیست یه تمرین اساسی برای یادگیری آبجکت انیمیتور انجام میدم حتما و باز مرسی از معرفیش :) فقط یه سوال این ریسورس چیه ؟ R.id.delayAnim همون انیمیشنه که باید از ۰ به ۰ تعریف بشه(پس چرا از پوشه انیم گرفته نشده )؟ یا ویویی که اون انیمیشن روش تعریف میشه ( تو همین اکتیویتی باید باشه )؟
Hajhosseini 11 سال پیش
مرسی بابت سوالتون امیر جان، من بعد از نوشتن کد یکم تغییرات دادم که به اشتباه پارامتر ورودی تابع رو delayAnim گذاشته بودم. بذارید به حساب مشغله بیش از حد. پاسخ اصلاح شد
amirfallahi 11 سال پیش
یه چیز دیگه هم که من تغییرش دادم و فکر کردم درست بشه این بود که رو انیمیشن داخل متد endanimation اون View که ورودی هست رو ست نکرده بودی. اجرا نمیشد اینجوری. حالا من تست کردم. یه جورایی مث اینکه اصن کار نمیکرد. بعد یه ویو داخل صفحه ساختم خالی پشت همه ی ویو ها. بعد delyanimation رو روی اون ست کردم و اجرا شد. اما فقط روی آخرین viewیی که صدا زده شده اجرا میشه. قبلیاش تغییری نمیکنن. خداکنه برا این پروژه ساده همین روش جواب بده چون واقعا وقتمو الکی گرفته :|
Hajhosseini 11 سال پیش
کدی که من در بالا درج کردم یک نمونست، شما باید به نسبت برنامه تون اون کد رو تغییر بدید. نیازی به اضافه کردن یک View دیگه نیست، میتونید از خود View که به تابع ارسال شده استفاده کنید. دوباره یک تغییر کوچک در پاسخ دادم. فلشی که زده شده : در اون خط delayAnimation اجرا میشه و سپس زمانی که تموم شد animation اصلی اجرا میشه. 3 تا ویو باید انیمیشن بگیرن نه یکی. اگر این تغییرات هم درستش نکرد کدتون رو درج کنید تا بررسی بشه.
amirfallahi 11 سال پیش

من اینجوری نوشتم ( کپی پیست کردم و یکم تغییر دادم ) علی جان. برای گذاشتن اون ویوی اضافی هم باید بگم که مجبورم چون ویو ها قبل از انیمیشن باید 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);

ولی فقط آخری اجرا میشه و بس

ولی 

 

نظرات

Hajhosseini 11 سال پیش
تست کردم درست کار میکرد. نام animation رو به myAnimation تغییر بدید. متد onAnimationEnd خودش یک انیمیشن داره و اون انیمیشن با انیمیشن ما قاطی میشده. button ها رو چک کنید که همه به یک دکمه اشاره نکنه.
amirfallahi 11 سال پیش
آها راس میگی. اینو درست کردم. مورد دوم هم چک شد مشکلی نداره. اما همچنان فقط آخرین ویو انیمیشن میگیره . اگه دوتا بذارم دومی میگیره اگه ۱۰ تا بذارم ۱۰می میگیره. .عجیبه واقعا بخاطر invisible بودن ویو ها نیست؟
Hajhosseini 11 سال پیش
کدم رو آپدیت کردم دوباره چک کنید، اگر ویو ها Invisible هستند باید قبل از Start کردن انیمیشن view.SetVisibility رو اضافه کنید.
amirfallahi 11 سال پیش
آخه قبلش بیاد که یهویی ظاهر میشه علی جان بدون انیمیشن ظاهر میشه. من میخوام ویو مخفی باشه بعد با یه آلفای نرم ظاهر بشه برای اون آبجکت انیمیشن فهمیدم همین بود دلیلش که چیزی ظاهر نمیشد. اما مگه آلفا نباید ظاهر کنه یه ویو رو حتی وقتی invisible باشه؟ توی اکتیویتی های قبلیم ویو ها invisible هستن اول و کم کم ظاهر میشن. حتی یکیشون تو ۲دقیقه به مرور ظاهر میشه خوبم کار میکنه. نمیدونم این چرا اینجوریه :|
Hajhosseini 11 سال پیش
کد فعلی شما باید درست کار کنه، xml رو چک کنید شاید توی انیمیشن ها چیزی رو اشتباه ست کردید
amirfallahi 11 سال پیش
با این حال بازم کد رو عوض کردم همونجوری که تو نوشتی. ولی بازم آخری فقط انیمیشن میگیره. قبلیا حتی visible هم نمیشن ویوهایی که تعریف کردم هم با هم فرق دارن و اصلا یکی نیستن
Hajhosseini 11 سال پیش
visibility رو هم invisible کردم امیر جان، هیچ مشکلی نداشت، حتی انیمیشن alpha رو که شما داری تست میکنی رو هم با translate باهم روی 3 تا ویو انجام دادم، نه از اول یک ضرب ظاهر میشن، نه مشکلی توی تایم ظاهر شدن دارن و نه توی اجرا. دونه دونه به درستی ظاهر و جابجا میشن.
amirfallahi 11 سال پیش
علی جان واقعا شرمنده که سرتو درد آوردم. این کد هایی که دادی عالیه کاملا منطقی و باید جواب بگیره.. من ایشالله میشینم پیدا میکنم مشکلمو. واقعا ممنونم ازت و بازم شرمنده بخاطر گرفتن وقتت عزیز. :) امیدوارم بتونم جبران کنم.
amirfallahi 11 سال پیش

یه متد نوشتم به این صورت:

 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)
 

نظرات

amirfallahi 11 سال پیش
هر کاری میکنم جواب نمیده نمیدونم دیگه واقعا چیکارش کنم :| فقط آخرین ویو انیمیشن میگیره از اون روش آبجکت که ساده تر بود هم اصلا جواب نمیده چون invisibleهستن موقع اجرای انیمیشن و انیمیشن اجرا میشه ولی دیده نمیشه ( که اینم برام تعجبیه خودش ... )
amirfallahi 11 سال پیش
آقا جواب گرفتم همینجا مینویسمش که زیاد شلوغ نشه. از صاحب تاپیک هم عذر میخوام که انقد شلوغ پلوغ کردم اینجا رو :D

پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .