两个视图,一个动画,但有一个问题

Posted

技术标签:

【中文标题】两个视图,一个动画,但有一个问题【英文标题】:Two Views, one Animation but there's a problem 【发布时间】:2020-04-23 10:48:56 【问题描述】:

这是我的代码:

AlphaAnimation anim_fadeIn;
Button button, button2;
TextView t, e;

@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_splash);

    t = findViewById(R.id.text_Splash_t);
    e = findViewById(R.id.text_Splash_e);

    button = findViewById(R.id.button);
    button2 =  findViewById(R.id.button2);
    button.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View v) 
            mAnimate();
        
    );
    button2.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View v) 
            mAnimate2();
        
    );

    anim_fadeIn = new AlphaAnimation(0.0f, 1.0f);
    anim_fadeIn.setDuration(1000);
    anim_fadeIn.setFillAfter(true);



 private void mAnimate() 
            t.startAnimation(anim_fadeIn);




private void mAnimate2() 
            e.startAnimation(anim_fadeIn);

场景:

按下 button1 和 text1 将动画(即使你做了几次)。然后按 button2 将在某处添加视图,因此无论您按 button1 还是 2,两个文本都会动画

场景 2:

按下 button2 和 text2 将动画(即使你做了几次)。然后按 button1 将在某处添加视图,因此无论您按 button1 还是 2,两个文本都会动画。

如何避免这个问题

【问题讨论】:

首先,为什么要在单独的线程中运行 onClick 侦听器中的代码,然后立即将 mAnimate 和 mAnimate2 中的执行返回给 UI 线程? 我编辑问题。活动比这更复杂,我只写了必要的,以帮助您专注于真正的问题。不是绕线,已经试过了 【参考方案1】:

删除新的线程包装,只需在主线程中调用 mAnimate() 或 mAnimate2(),如下所示:

...
    button.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View v) 
            mAnimate();
        
    );
    button2.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View v) 
           mAnimate2();
        
    );
...

还有 mAnimate,可以这样优化 mAnimate2:

private void mAnimate() 
    t.startAnimation(anim_fadeIn);




private void mAnimate2() 
    e.startAnimation(anim_fadeIn);

【讨论】:

无论我将代码包装到多少个线程中。问题依然存在。【参考方案2】:

您实际上所做的是将相同的动画注册到两个视图。如果您只想同时为一个视图设置动画,则必须首先清除另一个视图的动画,否则两者都会启动。例如

private void mAnimate() 
    e.clearAnimation();
    t.startAnimation(anim_fadeIn);




private void mAnimate2() 
    t.clearAnimation();
    e.startAnimation(anim_fadeIn);

【讨论】:

以上是关于两个视图,一个动画,但有一个问题的主要内容,如果未能解决你的问题,请参考以下文章

CALayer 旋转动画不适用于呈现的 ViewController

Swift:removefromSuperview 移除约束

闪烁动画问题

具有两个视图的 SwiftUI Card Flip 动画,其中一个嵌入在 Stack 中

iOS:在两个动画视图之间画线

如何在 StackView 内的两个视图之间进行动画处理?