简体   繁体   中英

Cannot repeat animation on Floating Action Button

Now that I can animate my FloatingActionButton , I have another issue.

When I click on the FAB, the rotation of the FAB starts and keeps going until an AsyncTask finishes its job.

Here are the parts of the code related:

@OnClick(R.id.floating_action_button) //Butterknife feature
    public void refreshAccountInfo(){
        APIHandler api = new APIHandler(databaseHelper, c, getActivity());
        AccountSync accountSync = new AccountSync(api);
        accountSync.execute();
    }

    public class AccountSync extends AsyncTask<Void,Void,Account> {

        APIHandler apiHandler;
        ObjectAnimator animation;

        public AccountSync(APIHandler api){
            apiHandler = api;
        }

        @Override
        protected void onPreExecute(){
            FloatingActionButton button = ButterKnife.findById(getActivity(), R.id.floating_action_button);
            PropertyValuesHolder pvhR = PropertyValuesHolder.ofFloat(View.ROTATION, -360);
            animation = ObjectAnimator.ofPropertyValuesHolder(button, pvhR);
            animation.setRepeatCount(Animation.INFINITE);
            animation.setDuration(1500);
            animation.start();
        }

        @Override
        protected Account doInBackground(Void... params) {
            Account a;
            try {
                a = apiHandler.getAccountInfo();
                return a;
            } catch (final ResponseException e) {
                getActivity().runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(apiHandler.getContext(), e.getMessage(), Toast.LENGTH_LONG).show();
                    }
                });
                return null;
            }
        }

        @Override
        protected void onPostExecute(Account result) {
            animation.setRepeatCount(0);
            if(result!=null){
                a = result;
                showInfo();
                Toast.makeText(getActivity(),"Account synchronization done",Toast.LENGTH_SHORT).show();
            }
        }

    }

My problem is, when I trigger the button the first time, the animation plays fine, but when I try to click more times, the AsyncTask will do its job, but the rotation animation will never play until I reload the fragment completely.

How can I fix that ?

You can for example end the animation in onPostExecute like this :

 @Override
    protected void onPostExecute(Account result) {

        if(animation.isRunning())
            animation.end();           

        ...
        }
    }

That should be more efficient than setting repeatCount to 0.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM