آموزش های این وب سایت به صورت رایگان در دسترس است. اطلاعات بیشتر
بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]

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

doost_fu  11 سال پیش  11 سال پیش
0 0

سلام

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

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

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

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

ممنون

 برای این سوال 6 پاسخ وجود دارد.
پاسخ به سوال 
MeyrOOn  11 سال پیش
+3 0

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

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

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

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

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

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

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

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

با تشکر .

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

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

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

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

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

ولی 

 

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

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

 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)
 
0 0
هر کاری میکنم جواب نمیده نمیدونم دیگه واقعا چیکارش کنم :| فقط آخرین ویو انیمیشن میگیره از اون روش آبجکت که ساده تر بود هم اصلا جواب نمیده چون invisibleهستن موقع اجرای انیمیشن و انیمیشن اجرا میشه ولی دیده نمیشه ( که اینم برام تعجبیه خودش ... ) (11 سال پیش)
+1 0
آقا جواب گرفتم همینجا مینویسمش که زیاد شلوغ نشه. از صاحب تاپیک هم عذر میخوام که انقد شلوغ پلوغ کردم اینجا رو :D (11 سال پیش)

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