有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何收听乐蒂动画结束活动

我有包含碎片的活动。 这个片段有一个带有lottie_loop=“false”的lottie动画, 这意味着,一旦动画完成第一个循环,动画将被激活

我想在包含此片段的活动中收听此事件(动画结束),但我的代码中有一些错误,我有白色屏幕

我为listen-to-even创建了界面,下面是我的代码:

洛蒂动画片段:

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中运行无休止的日志并播放动画


共 (1) 个答案

  1. # 1 楼答案

    我建议你最好使用ViewModel而不是听众。您只需要创建ViewModel类,并在fragment中创建其实例,但要使用活动范围,这样它就可以用于活动中包含的所有片段,包括活动本身

    在片段中创建一个共享ViewModel实例,如下所示:

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

    动画结束后,更新ViewModel

    sharedViewModel?.onAnimationFinished()
    

    注意:在ViewModel类中,有任何活动正在观察的实时数据成员,然后只需更新函数中的变量即可

    在活动中,我们只需要创建ViewModel的实例,并像这样观察所需的数据

    val sharedViewModel = ViewModelProviders.of(this).get(SharedViewModel::class.java)
    
    sharedViewModel.animationEndEvent.observe(this, Observer {
        it?.let {
            // do some thing
        }
    })