Android 如何制作可点击的动画文本视图?

Android 如何制作可点击的动画文本视图?,android,viewpropertyanimator,Android,Viewpropertyanimator,我需要实现一个可点击范围的移动/滚动文本视图。我还需要使动画看起来像那些横幅广告下面的新闻,不断重复。我以前在一个电视应用程序中使用了TranslateAnimation,并且能够让它工作,因为我得到的是按键事件和触摸。我现在需要在一个除了触摸屏本身没有任何外部输入源的平板电脑应用程序上实现它 我尝试再次在平板电脑应用程序中使用TranslateAnimation,但它不起作用。在搜索我可以使用的不同动画后,我了解到TranslateAnimation只是为视图的外观和整个视图本身设置动画。它不

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

我尝试再次在平板电脑应用程序中使用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.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上再次使用这些代码行。现在我想到另一件事,我可以暂停这个动画吗?因为我找到了一种翻译的方法。有没有什么好办法呢?

试试这个,我希望它对你有用

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

在onAnimationEnd上,您正在使用两个
setDuration
。有必要吗?试试这个@Tepits-tbh,我真的不知道如何使用它。我今天才知道。@Sniffer我以前用过,但我不知道它是否支持暂停,这就是为什么我在当前案例中没有使用它。没有setRepeatCount on animate()Animation Animation=new TranslateAnimation(0500,0,0);动画。设置持续时间(1000);animation.setFillAfter(true);setRepeatCount(animation.INFINITE);视图。开始动画(动画);试试这个。所以,它也使用了translateImation。您有使用ViewPropertyImation的解决方案吗?