【问题标题】:How to make a clickable and animated textview?如何制作可点击的动画文本视图?
【发布时间】:2018-09-10 09:00:27
【问题描述】:

我需要实现一个具有可点击范围的移动/滚动文本视图。我还需要让动画看起来像新闻下方那些不断重复的横幅广告。我之前将 TranslateAnimation 用于电视应用程序并且能够让它工作,因为我得到的是 keyEvent 和触摸。我现在需要在除了触摸屏本身之外没有任何外部输入源的平板电脑应用程序上实现它。

我尝试再次对平板电脑应用使用 TranslateAnimation,但它不起作用。在搜索了我可以使用的不同动画后,我了解到 TranslateAnimation 只是为视图的外观和整个视图本身设置动画。它不会随着外观移动可点击部分,所以我寻找了一个不同的部分。

然后我偶然发现了 PropertyAnimator。这显然是我的问题所需要的。但它也有一个缺点。不支持重复。

我目前拥有的是下面的这段代码。

        lbl.animate();
        lbl.animate().x(-lblWidth).y(0);
        lbl.animate().setDuration(animDuration);
        lbl.animate().setInterpolator(new LinearInterpolator());
        lbl.animate().setListener(new Animator.AnimatorListener() {
            @Override
            public void onAnimationStart(Animator animation) {

            }

            @Override
            public void onAnimationEnd(Animator animation) {
                lbl.animate();
                lbl.animate().x(lblWidth).y(0);
                lbl.animate().setDuration(0);
                lbl.animate().x(-lblWidth).y(0);
                lbl.animate().setDuration(animDuration);
                lbl.animate().setInterpolator(new LinearInterpolator());
                lbl.animate().setListener(this);
            }

            @Override
            public void onAnimationCancel(Animator animation) {

            }

            @Override
            public void onAnimationRepeat(Animator animation) {

            }
        });

第一次运行后,动画结束。它重复,因为它打印了我的日志,但它没有显示在屏幕上。

我试图用该代码制作重复效果。我试图在下面重新创建类似这样的代码。

            transAnim = new TranslateAnimation(
                    TranslateAnimation.RELATIVE_TO_PARENT, 1.0f,
                    TranslateAnimation.RELATIVE_TO_SELF, -1.0f,
                    TranslateAnimation.ABSOLUTE, 0f,
                    TranslateAnimation.ABSOLUTE, 0f
            );

            transAnim.setRepeatCount(-1);
            transAnim.setRepeatMode(Animation.RESTART);
            transAnim.setInterpolator(new LinearInterpolator());
            transAnim.setDuration(animDuration);
            transAnim.setFillAfter(true);

上面的代码所做的是从屏幕外的右侧开始,我启动了一个向左侧移动到屏幕外的动画。然后,如果视图的末端到达屏幕左侧的左侧,则告诉动画从头开始。

我现在通过在所有内容之上添加一行短代码使其工作。

    lbl.setX(screenWidth);
    lbl.animate().x(-lblWidth).y(0);
    lbl.animate().setDuration(animDuration);
    lbl.animate().setInterpolator(new LinearInterpolator());

然后在动画侦听器的 onAnimationEnd 上再次使用这行代码。现在我想到了另一件事,我可以暂停这个动画吗?因为我为 TranslateAnimation 找到了一种方法。有没有破解方法?

【问题讨论】:

  • 在您的onAnimationEnd 上,您正在使用两个setDuration。有必要吗?
  • 试试这个Link
  • @Tepits tbh,我真的不知道如何使用它。我今天才知道。
  • @Sniffer 我以前使用过,但如果它支持暂停,我不这样做,这就是我在当前案例中没有使用它的原因

标签: android viewpropertyanimator


【解决方案1】:

试试这个,希望对你有用。

 lbl.animate();
 lbl.animate().x(-lblWidth).y(0);
 lbl.animate().setDuration(animDuration);
 lbl.animate().setInterpolator(new LinearInterpolator());
 lbl.animate().setRepeatCount(Animation.INFINITE);

【讨论】:

  • animate() 上没有 setRepeatCount
  • 动画动画 = new TranslateAnimation(0, 500,0, 0);动画.setDuration(1000);动画.setFillAfter(true); animation.setRepeatCount(Animation.INFINITE); view.startAnimation(动画);试试这个。
  • 所以,它也使用了 TranslateAnimation。您有使用 ViewPropertyAnimation 的解决方案吗?
猜你喜欢
  • 2014-01-25
  • 2017-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多