首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将ObjectAnimator作为不起作用的参数传递

将ObjectAnimator作为不起作用的参数传递
EN

Stack Overflow用户
提问于 2015-10-28 12:11:02
回答 1查看 560关注 0票数 1

我使用ObjectAnimator制作了“心跳效应按钮”(连续闪烁),它工作得很好。

有4个按钮,名为btn1RT、btn2LT、btn3LB和btn4RB。如果其中一个按钮开始闪烁,其他按钮就会消失。

问题:--我重构了这段代码,它不再工作了。我无法阻止按钮的闪烁,所以我所有的按钮都在闪烁。我想知道为什么这些按钮不能停止。

我认为将ObjectAnimator作为参数传递是个问题,但没有任何线索。

任何帮助都将不胜感激。

以前:

代码语言:javascript
复制
private void start1HeartBeat() {
        oa1 = ObjectAnimator.ofFloat(btn1RT, "alpha", 1, 0);
        oa1.setDuration(HEARTBEAT_RUN_DURATION);
        oa1.setRepeatCount(ValueAnimator.INFINITE);
        oa1.setRepeatMode(ValueAnimator.REVERSE);
        oa1.start();

        if (oa2.isRunning()) {
            oa2.end();
            oa2 = ObjectAnimator.ofFloat(btn2LT, "alpha", 0.5f, 0);
            oa2.setDuration(HEARTBEAT_STOP_DURATION);
            oa2.setRepeatCount(0);
            oa2.setRepeatMode(ValueAnimator.RESTART);
            oa2.start();
        }

        if (oa3.isRunning()) {
            oa3.end();
            oa3 = ObjectAnimator.ofFloat(btn3LB, "alpha", 0.5f, 0);
            oa3.setDuration(HEARTBEAT_STOP_DURATION);
            oa3.setRepeatCount(0);
            oa3.setRepeatMode(ValueAnimator.RESTART);
            oa3.start();
        }

        if (oa4.isRunning()) {
            oa4.end();
            oa4 = ObjectAnimator.ofFloat(btn4RB, "alpha", 0.5f, 0);
            oa4.setDuration(HEARTBEAT_STOP_DURATION);
            oa4.setRepeatCount(0);
            oa4.setRepeatMode(ValueAnimator.RESTART);
            oa4.start();
        }
    }
}

重构后的,这是不工作的。

代码语言:javascript
复制
private void start1HeartBeat() {
    startHeartBeat(oa1, btn1RT);
    stopHeartBeat(oa2, btn2LT);
    stopHeartBeat(oa3, btn3LB);
    stopHeartBeat(oa4, btn4RB);
}

private synchronized void startHeartBeat(ObjectAnimator oa, Object btn) {
        oa = ObjectAnimator.ofFloat(btn, "alpha", 1, 0);
        oa.setDuration(HEARTBEAT_RUN_DURATION);
        oa.setRepeatCount(ValueAnimator.INFINITE);
        oa.setRepeatMode(ValueAnimator.REVERSE);
        oa.start();
    }

private synchronized void stopHeartBeat(ObjectAnimator oa, Object btn) {
    if (oa.isRunning()) {
        oa.end();
        oa = ObjectAnimator.ofFloat(btn, "alpha", 0.5f, 0);
        oa.setDuration(HEARTBEAT_STOP_DURATION);
        oa.setRepeatCount(0);
        oa.setRepeatMode(ValueAnimator.RESTART);
        oa.start();
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-31 15:44:55

为了理解这个问题,我们应该弄清楚按值传递和参照传递之间的区别。对于Java来说,this post更好地澄清了这个概念。

简而言之,在Java中,引用本身是按值传递的.正如我们所知道的,在逐值传递中,方法内部的变化不会在外部反映出来。因此,在方法内部更改传递的引用不反映在外部。

有了这些知识,正确重构代码的方法之一如下

代码语言:javascript
复制
private void start1HeartBeat() {
    oa1 = startHeartBeat(oa1, btn1RT);
    oa2 = stopHeartBeat(oa2, btn2LT);
    oa3 = stopHeartBeat(oa3, btn3LB);
    oa4 = stopHeartBeat(oa4, btn4RB);
}

private synchronized ObjectAnimator startHeartBeat(ObjectAnimator oa, Object btn) {
    oa = ObjectAnimator.ofFloat(btn, "alpha", 1, 0);
    oa.setDuration(HEARTBEAT_RUN_DURATION);
    oa.setRepeatCount(ValueAnimator.INFINITE);
    oa.setRepeatMode(ValueAnimator.REVERSE);
    oa.start();
    return oa;
}

private synchronized ObjectAnimator stopHeartBeat(ObjectAnimator oa, Object btn) {
    if (oa.isRunning()) {
        oa.end();
        oa = ObjectAnimator.ofFloat(btn, "alpha", 0.5f, 0);
        oa.setDuration(HEARTBEAT_STOP_DURATION);
        oa.setRepeatCount(0);
        oa.setRepeatMode(ValueAnimator.RESTART);
        oa.start();
    }
    return oa;
}

我刚才提到了一种可能的重构方法。由于核心问题已被澄清,所以您可以以适当的方式进行重构。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33390716

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档