簡體   English   中英

如何從活動中收聽lottie動畫結束

[英]How to listen for lottie animation end from activity

我有包含片段的活動。 這個片段有一個 lottie 動畫,lottie_loop="false",這意味着,一旦動畫完成第一個循環,動畫將是和。

我想在包含這個片段的活動中監聽這個事件(動畫結束),但是我的代碼有一些錯誤,我有白屏。

我創建了用於收聽 even 的界面,這是我的代碼:

帶有lottie動畫的片段:

public class EntryFragmentAnimation extends Fragment {

    private View view;
    private LottieAnimationView mLavTwoHearts;
    private boolean isAnimationEnd = false;
    private OnAnimationEndListener iOnAnimationEndListener;

    public interface OnAnimationEndListener {
        void onAnimationEnd(boolean isAnimationEnd);
    }

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        view = inflater.inflate(R.layout.fragment_entry_animation, container, false);
        initView(view);
initAnimation();
        return view;
    }

    @Override
    public void onAttach(@NonNull Context context) {
        super.onAttach(context);
        try {
            iOnAnimationEndListener = (OnAnimationEndListener) getActivity();
        } catch (ClassCastException e) {
            throw new ClassCastException(context.toString() + " must implement OnAnimationEndListener");
        }
    }

    private void initView(View view) {
        mLavTwoHearts = view.findViewById(R.id.lavTwoHearts);
    }

    private void initAnimation() {
        mLavTwoHearts.playAnimation();
        mLavTwoHearts.addAnimatorListener(new AnimatorListenerAdapter() {

            @Override
            public void onAnimationEnd(Animator animation) {
                super.onAnimationEnd(animation);
                isAnimationEnd = true;
                iOnAnimationEndListener.onAnimationEnd(isAnimationEnd);

            }
        });
    }
}

還有一個活動

public class LoginActivity extends AppCompatActivity implements EntryFragmentAnimation.OnAnimationEndListener {

    private boolean isAnimationEnd = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
        setEntryScreen();
        listenToAnimationEnd();
    }

    private void setEntryScreen(){
        getSupportFragmentManager()
                .beginTransaction()
                .add(R.id.container_login_fl, new EntryFragmentAnimation())
                .commit();
    }

    private void listenToAnimationEnd(){
        while (!isAnimationEnd){
            Log.d(TAG, "listenToAnimationEnd: Animation playing");
        }
        Log.d(TAG, "listenToAnimationEnd: animation end");
    }

    @Override
    public void onAnimationEnd(boolean isAnimationEnd) {
        this.isAnimationEnd = isAnimationEnd;
    }
}

運行應用程序時,只出現白屏,並且在運行動畫播放的 logcat 中運行無窮無盡的日志

我建議您最好使用ViewModel而不是偵聽器。 您只需要創建 ViewModel 類並在片段中創建其實例,但使用活動范圍,以便它可用於活動中包含的所有片段,包括活動本身。

在您的片段中創建一個 Shared ViewModel 實例,如下所示:

activity?.let {
    sharedViewModel = ViewModelProviders.of(it).get(SharedViewModel::class.java)
}

動畫結束后更新 ViewModel

sharedViewModel?.onAnimationFinished()

注意:在您的 ViewModel 類中,擁有您的 Activity 正在觀察的任何實時數據成員,然后只需更新函數內的變量。

在活動中,我們只需要創建 ViewModel 的實例並像這樣觀察所需的數據

val sharedViewModel = ViewModelProviders.of(this).get(SharedViewModel::class.java)

sharedViewModel.animationEndEvent.observe(this, Observer {
    it?.let {
        // do some thing
    }
})

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM