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

کنترل انیمیشن

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

چطور امکان کنترل کردن انیمیشن وجود دارد؟

یک عکس هست که با زدن دکمه "Play" عکس شروع به چرخیدن می کند. و با زدن دکمه "Puase" انیمیشن به حالت توقف می رود و از دوباره با زدن دکمه "Play" شروع به چرخیدن از همان جای می کند که توقف کرده بود..!

چطور امکان کنترلش هست. با "xml"که من نتونستم کاری بکنم، و هر کاری می کردم انیمیشن ریست می شد. و عکس از نقطه اول شروع به چرخش می کردش..! 

نظرات

Hassan94 10 سال پیش
تو متد میگه که انیمیشن Stop میشه من حالت puase رو میخوام به نظرت حالتی که رو میخوام انجام میده
صادقی راد 10 سال پیش
دوست عزیز توضیحات داخل اون لینکی که بهتون دادم رو بخونید ، توضیح داده که currentPlayTime ذخیره میشه که زمان آخرین نقطه حرکت انیمیشن هست و زمانی که مجددا انیمیشن رو اجرا میکنیم از نقطه ذخیره شده ادامه پیدا میکنه ، حالا اسم متد ما فرق نمیکنه دیگه !!
Hassan94 10 سال پیش
ممنون من این کار رو کردم ولی به این ارور میده getCurrentPlayTime() img_1 = (ImageView) findViewById(R.id.img_1); btn_1 = (Button) findViewById(R.id.btn_1); anim_1 = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.m); anim_1.setFillEnabled(true); anim_1.setFillAfter(true); img_1.setAnimation(anim_1); anim_1.startNow(); img_1.invalidate(); getCurrentPlayTime(); btn_1.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { stopAnimation(); } }); } private void stopAnimation(){ CurrentPlayTime = anim_1.getCurrentPlayTime(); anim_1.cancel(); } private void startAnimation() { anim_1.start(); anim_1.setCurrentPlayTime(CurrentPlayTime); } }

پاسخ‌ها 2

Hassan94 10 سال پیش

 img_1  = (ImageView) findViewById(R.id.img_1);
btn_1 = (Button) findViewById(R.id.btn_1);
anim_1 = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.m);


anim_1.setFillEnabled(true);
anim_1.setFillAfter(true);
img_1.setAnimation(anim_1);
anim_1.startNow();
img_1.invalidate();

getCurrentPlayTime();

btn_1.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View arg0) {
stopAnimation();
}
});

}

private void stopAnimation(){
CurrentPlayTime = anim_1.getCurrentPlayTime();
anim_1.cancel();
}

private void startAnimation() {
anim_1.start();
anim_1.setCurrentPlayTime(CurrentPlayTime);
}


}

نظرات

Hassan94 10 سال پیش
ممنون من این کار رو کردم ولی به این ارور میده getCurrentPlayTime()
صادقی راد 10 سال پیش
شما متغیر هاتون رو اصلا ذخیره نکردید جایی !!! توصیه میکنم اون لینکی که بهتون دادم و لینک رو به دقت بخونید !
Hassan94 10 سال پیش
متغییرها مگه تو این ذخیره نمیشن CurrentPlayTime من این رو از نوع long تعریفش کردم، بالا نوشتم که اون قسمت رو کپی نکردم!
صادقی راد 10 سال پیش
منظورم قسمت getCurrentPlayTime بود , تا شب سعی میکنم یک نمونه بنویسم و همین جا قرار بدم !
Hassan94 10 سال پیش
ممنون منتظر میمونم تا آموزش خوبی بهم بدید.
صادقی راد 10 سال پیش

سلام مجدد !

گفتم سعی میکنم تا شب بنویسمش , یکم از شب گذشت ولی .... :D

اول بذارید یه توضیح بدم بهتون , یه جورایی توضیحات همون صفحاتی که بهتون گفتم  رو براتون کامل باز میکنم .

اول اینکه حالت عادی با استفاده از Set نمیشه این کار که مد نظر شماست رو پیاده کرد و باید از ValueAnimator یا ObjectAnimator استفاده کنیم .

به صورت کلی ما نیاز به یک Animator داریم تا یک Animation ! در واقع ValueAnimator و ObjectAnimator ویژگی های یک Set معمولی رو دارن و یک سری ( بسیاری ! ) توابع دیگه برای مدیریت اون وجود داره , لازم به ذکر هم هست که برای این کار حداقل به API 11 نیاز داریم !

من دقیقا کد کلاس خودم رو کاملا قرار میدم , کد کاملا واضحه , باز هم اگر جایی ابهامی وجود داشت بفرمایید .

package com.sadeghirad.animpause;

public class ActivityMain extends AppCompatActivity {

private long mCurrentPlayTime;
private ObjectAnimator rotate;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btnStart = (Button) findViewById(R.id.btnStart);
Button btnStop = (Button) findViewById(R.id.btnStop);
ImageView img = (ImageView) findViewById(R.id.img);
rotate = ObjectAnimator.ofFloat(img, "rotation", 0f, 360f);
rotate.setDuration(5000);
rotate.setRepeatCount(ObjectAnimator.INFINITE);
rotate.start();

btnStart.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
rotate.start();
rotate.setCurrentPlayTime(mCurrentPlayTime);
}
});

btnStop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mCurrentPlayTime = rotate.getCurrentPlayTime();
rotate.cancel();
}
});

}
}

موفق باشید./

نظرات

Hassan94 10 سال پیش
ممنون کد کار کرد ولی یه مشکلی بود که وقتی دکمه Stop رو 2بار میزدی وبعدش Play میزدی قاطی میکردش امتحانش کن چندبار stop رو بزن وبعدش چند بار هم play قاطی پاطی میشه!
صادقی راد 10 سال پیش
خواهش میکنم ، ولی به عنوان یک برادر کوچیک تر بذارین یه صحبتی کنم ، سعی کنین با کد در بیوفتین ، بالا پایینش کنین ، ببینین چی میگه کد بهتون ، تلاش تو مقوله برنامه نویسی خیلی مهمه ، زمانی که من با این مشکل شما مواجه شده بودم برای حلش کلی وقت گذاشتم ، اگر همین الان هم شما داخل اینترنت سرچ کنین میبینین که هنوز که هنوزه یک آموزش سر راست نیست و کلی باید به خاطرش گشت به خصوص زمانی که اصلا شما ندونی به چی نیاز داری واسه حل مشکلت ، دقیقا وضعیتی که من اون موقع داشتم همین بود ! هیچ وقت تسلیم نشین ، یک جمله هست از زبون ادیسون نقل شده که میگه : "طعم بسیاری از شكست های زندگی را كسانی چشیده اند كه در دو قدمی كامیابی از تلاش خود دست كشیده اند." ، خلاصه اینکه همیشه سعی کنین روی مشکلتون تمرکز کنین و یه راه حلی براش پیدا کنین بدون اینکه نیاز به کسی داشته باشین ! خب ، در مورد جواب مشکلتون ، میتونین داخل هر کدوم از دکمه ها زمانی که کلیک میشن غیر فعال شن تا دوباره کاربر قادر به انتخابش نباشه ! موفق باشید./
Hassan94 10 سال پیش
ممنون از راهنماییت من کلی تو نت و تو اینجا سرچ میکنم اگه چیزی نتونستم پیدا کنم سوال رو مطرح میکنم، در مورد مشکل بالا همه میشه از یکه دکمه استفاده کرد و با مقدار boolean بررسیش کرد و تا بشه یبار به عنوان Play عمل کنه و بار دیگه هم به عنوان Puase عمل کنه.

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