2016-11-17 6 views
2

Я пытаюсь создать анимацию, которая перемещает TextView слева направо и цикл бесконечно. Это TextView я хочу анимировать:Непрерывно анимировать текст слева направо

<TextView 
    android:id="@+id/txtTitle" 
    android:layout_width="280dp" 
    android:layout_height="wrap_content" 
    android:textSize="16sp" 
    android:textStyle="italic" 
    android:layout_marginLeft="20dp" 
    android:layout_marginRight="20dp" 
    android:layout_marginTop="20dp" 
    android:ellipsize="end" 
    android:maxLines="1" 
    android:layout_centerHorizontal="true" 
    android:layout_below="@id/cardView" /> 

И это, как я пытаюсь оживить TextView:

Animation animation = new TranslateAnimation(0, -280, 0, 0); 
animation.setDuration(9000); 
animation.setRepeatMode(Animation.RELATIVE_TO_SELF); 
animation.setRepeatCount(Animation.INFINITE); 
textView.setAnimation(animation); 

То, что я хочу добиться для текста, чтобы начать в центре экран, переместитесь вправо, и как только первая буква покинет экран, он снова появится на другой стороне.

+0

Так же, как примечание стороны: Вы действительно должны использовать 'Animator' API вместо анимации просмотра. API «Animator» - это гораздо более новый, намного превосходящий API анимации, и он широко поддерживается (99% всех устройств). Как правило: каждый класс, который имеет «Анимацию» в своем имени (например, «TranslateAnimation»), является частью старого API анимации представлений, и все с «Animator» в его имени является частью нового API «Animator». –

ответ

7

То, что вы хотите сделать, легко достигается с помощью простого ValueAnimator.

Что вам нужно сделать, это поместить две идентичные версии TextView, которые вы хотите анимировать в свой макет. В этом примере мой макет выглядит следующим образом:

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <TextView 
     android:id="@+id/first" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center" 
     android:textSize="32sp" 
     android:text="@string/hello_word"/> 

    <TextView 
     android:id="@+id/second" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center" 
     android:textSize="32sp" 
     android:text="@string/hello_word"/> 

</FrameLayout> 

Тогда - как я уже говорил - вы используете ValueAnimator анимировать свойство translationX обоих Views, но компенсируют друг от ширины экрана (так как выше TextViews используйте match_parent, поскольку ширина их ширины равна ширине экрана, и именно это я буду использовать, чтобы компенсировать положение одного из них). Ваш код должен выглядеть следующим образом:

final TextView first = (TextView) findViewById(R.id.first); 
final TextView second = (TextView) findViewById(R.id.second); 

final ValueAnimator animator = ValueAnimator.ofFloat(0.0f, 1.0f); 
animator.setRepeatCount(ValueAnimator.INFINITE); 
animator.setInterpolator(new LinearInterpolator()); 
animator.setDuration(9000L); 
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 
    @Override 
    public void onAnimationUpdate(ValueAnimator animation) { 
     final float progress = (float) animation.getAnimatedValue(); 
     final float width = first.getWidth(); 
     final float translationX = width * progress; 
     first.setTranslationX(translationX); 
     second.setTranslationX(translationX - width); 
    } 
}); 
animator.start(); 

И результат должен выглядеть примерно так:

looing text demo

+0

это отлично работает, спасибо. – Julia

0

если кто-то пытается найти относительно текста бегущей строки на игровом холсте непрерывно вот код достигните этого в своем игровом цикле. StartingLine.java является класс, который возвращает холст быть обращено на игру поверхности его функции в настоящее время называют gameview петлей

public class StartingLine { 
private int screenWidth; 
private int screenHeight; 
private int xStartPosition; 
private int yStartPosition; 
private int xEndPosition; 
private int yEndPosition; 
private int width = 50; 
private int tv1y = 0; 
private int tv2y = 0; 
private int tv3y = 0; 
private Paint paint; 


public StartingLine(Context context, int screenX, int screenY, int laneCount) { 
    screenWidth = screenX; 
    screenHeight = screenY; 
    this.xStartPosition = screenWidth - width - (screenHeight/laneCount) * 2; 
    this.yStartPosition = 0; 
    this.xEndPosition = screenWidth - width - (screenHeight/laneCount) * 2; 
    this.yEndPosition = screenHeight; 
    paint = new Paint(); 
} 

public void update(int color) { 
    paint.setColor(color); 
    paint.setStrokeWidth(2); 
    paint.setTextSize(30); 
    paint.setTextAlign(Paint.Align.CENTER); 
} 

public void draw(Canvas canvas) { 
    Rect tb = new Rect(); 
    paint.getTextBounds("STOP AFTER THIS POINT", 0, "STOP AFTER THIS POINT".length(), tb); 
    if (tv1y == 0 && tv2y == 0 && tv3y == 0) { 
     tv1y = 0; 
     tv2y = tb.width() + width;//tb.width()+width = gap between two texts 
     tv3y = 2 * (tb.width() + width); 
    } else { 
     if (tv3y >= (3 * (tb.width() + width))) { 
      tv3y = 2 * (tb.width() + width); 
     } 

     tv1y = tv3y - 2 * (width + tb.width()); 
     tv2y = tv1y + width + tb.width(); 
     tv3y = tv2y + width + tb.width(); 
    } 

    canvas.drawLine(xStartPosition, yStartPosition, xEndPosition, yEndPosition, paint); 
    canvas.drawLine(xStartPosition + width, yStartPosition, xEndPosition + width, yEndPosition, paint); 
    canvas.save(); 
    canvas.rotate(270, screenWidth/2, screenHeight/2); 

    canvas.drawText("STOP AFTER THIS POINT", tv1y += 5, yEndPosition - 20, paint); 
    canvas.drawText("STOP AFTER THIS POINT", tv2y += 5, yEndPosition - 20, paint); 
    canvas.drawText("STOP AFTER THIS POINT", tv3y += 5, yEndPosition - 20, paint); 
    canvas.restore(); 
} 
} 
Смежные вопросы