滚动学分文字的Andr​​oid学分、文字、oid、Andr

2023-09-06 08:37:00 作者:Last Kiss最后一吻

我需要做一个学分屏幕(活动)在我的游戏。这将只是没有任何图像的垂直滚动文本行。滚动自动执行并且允许没有用户交互。就这样,从下往上推移电影代表作。最后的文本行已高于屏幕上方消失后,应重新启动。

I need to make a credits screen (Activity) in my game. It would be just a vertically scrolling text lines without any images. Scrolling is to be performed automatically and no user interaction is allowed. Just like movie credits that goes from bottom to top. After the last text line has disappeared above top of the screen, it should restart.

我该怎么办呢?这足以只使用的TextView 不知何故动画呢?或者我应该把那个的TextView 滚动型?您有什么建议?

How do I do it? It is sufficient to just use TextView and animate it somehow? Or should I put that TextView into ScrollView? What would you suggest?

推荐答案

我用这: -

    /**
 * A TextView that scrolls it contents across the screen, in a similar fashion as movie credits roll
 * across the theater screen.
 *
 * @author Matthias Kaeppler
 */
public class ScrollingTextView extends TextView implements Runnable {

    private static final float DEFAULT_SPEED = 15.0f;

    private Scroller scroller;
    private float speed = DEFAULT_SPEED;
    private boolean continuousScrolling = true;

    public ScrollingTextView(Context context) {
        super(context);
        setup(context);
    }

    public ScrollingTextView(Context context, AttributeSet attributes) {
        super(context, attributes);
        setup(context);
    }

    private void setup(Context context) {
        scroller = new Scroller(context, new LinearInterpolator());
        setScroller(scroller);
    }

    @Override
    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
        super.onLayout(changed, left, top, right, bottom);
        if (scroller.isFinished()) {
            scroll();
        }
    }

    private void scroll() {
        int viewHeight = getHeight();
        int visibleHeight = viewHeight - getPaddingBottom() - getPaddingTop();
        int lineHeight = getLineHeight();

        int offset = -1 * visibleHeight;
        int totallineHeight = getLineCount() * lineHeight;
        int distance = totallineHeight + visibleHeight;
        int duration = (int) (distance * speed);

        if (totallineHeight > visibleHeight) {
            scroller.startScroll(0, offset, 0, distance, duration);

            if (continuousScrolling) {
                post(this);
            }
        }
    }

    @Override
    public void run() {
        if (scroller.isFinished()) {
            scroll();
        } else {
            post(this);
        }
    }

    public void setSpeed(float speed) {
        this.speed = speed;
    }

    public float getSpeed() {
        return speed;
    }

    public void setContinuousScrolling(boolean continuousScrolling) {
        this.continuousScrolling = continuousScrolling;
    }

    public boolean isContinuousScrolling() {
        return continuousScrolling;
    }
}