I did exactly this for a Christmas present for my daughter. My solution was to put the text in a ScrollView and programmatically scroll with a Runnable that reschedules itself if there is still more content to scroll.
Layout:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/layout_root" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".activities.MainActivity"> <ImageView android:layout_width="match_parent" android:layout_height="match_parent" android:contentDescription="@string/background" android:src="@drawable/background" android:scaleType="centerCrop" /> <ScrollView android:id="@+id/scrollview" android:layout_width="match_parent" android:layout_height="match_parent" android:scrollbars="none" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" > <Space android:layout_width="match_parent" android:layout_height="@dimen/leading_space" tools:layout_height="1dp" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginEnd="@dimen/activity_horizontal_margin" android:layout_marginStart="@dimen/activity_horizontal_margin" android:layout_marginTop="@dimen/activity_vertical_margin" android:orientation="vertical" > <TextView android:id="@+id/textview_a_long_time_ago" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginBottom="@dimen/trailing_space" android:layout_gravity="center_horizontal" android:text="@string/a_long_time_ago" android:textStyle="bold" android:lineSpacingMultiplier="1.1" style="@style/Text" /> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/episode_2015" style="@style/Text.Episode" /> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/merry_christmas" style="@style/Text.Title" /> </LinearLayout> <TextView android:id="@+id/textview_crawl" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginBottom="@dimen/activity_vertical_margin" android:layout_marginEnd="@dimen/activity_horizontal_margin" android:layout_marginStart="@dimen/activity_horizontal_margin" android:text="@string/opening_text" android:textStyle="bold" android:lineSpacingMultiplier="1.1" style="@style/Text" /> <!-- <Space android:layout_width="match_parent" android:layout_height="@dimen/trailing_space" tools:layout_height="1dp" /> --> <RelativeLayout android:id="@+id/layout_next" android:layout_width="match_parent" android:layout_height="@dimen/leading_space" android:background="?attr/selectableItemBackground" > <ImageView android:id="@+id/imageview_lightsabers" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:contentDescription="@string/lightsaber" android:scaleType="centerInside" android:src="@drawable/lightsabers" /> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingEnd="@dimen/activity_horizontal_margin" android:paddingStart="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:text="@string/click_to_continue" android:textAllCaps="true" style="@style/Text.Title" /> </RelativeLayout> </LinearLayout> </ScrollView> </RelativeLayout>
Code snippet from my Activity:
private ScrollView _scrollView; private Runnable _smoothScrollRunnable = new Runnable() { @Override public void run() { _scrollView.smoothScrollBy(2, 2); if (_scrollView.canScrollVertically(1)) { _scrollView.postDelayed(_smoothScrollRunnable, 75); } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); _scrollView = (ScrollView) findViewById(R.id.scrollview); } @Override protected void onResume() { super.onResume(); _scrollView.post(_smoothScrollRunnable); }
Result (video quality sucks and it wasn't finished yet but you get the idea):
https://www.youtube.com/watch?v=TfKxGraLNLA
Edit:
Response to the comment:
hi sir i liked you way it works when the text is more than the screen ,can is this be implemented something like to scroll the text till some height and then back like up and down in loop till some width ?
Sure it could be modified to do that. Check out the ScrollView.canScrollVertically method:
public boolean canScrollVertically (int direction)
Check if this view can be scrolled vertically in a certain direction.
Parameters
direction - Negative to check scrolling up, positive to check scrolling down.
Returns
boolean - true if this view can be scrolled in the specified direction, false otherwise.
And the ScrollView.smoothScrollBy method:
public final void smoothScrollBy (int dx, int dy)
Like scrollBy(int, int), but scroll smoothly instead of immediately.
Parameters
dx - the number of pixels to scroll by on the X axis
dy - the number of pixels to scroll by on the Y axis
So if you modified the code snippet to remember which direction you were scrolling (up or down) and then flip it when you couldn't go any further you would achieve what you are looking for.
Edit:
Quick, incomplete, code snippet to explain what I'm talking about:
private boolean isScrollingDown = true; private Runnable _smoothScrollRunnable = new Runnable() { @Override public void run() { if (isScrollingDown && !_scrollView.canScrollVertically(1)) { // We can't scroll down any further so start scrolling up ... isScrollingDown = false; } else if (!isScrollingDown && !_scrollView.canScrollVertically(-1) { // We can't scroll up any further so start scrolling down ... isScrollingDown = true; } if (isScrollingDown) { // Scroll down by 2 _scrollView.smoothScrollBy(0, 2); } else { // Scroll up by 2 _scrollView.smoothScrollBy(0, -2); } // Just keep scrolling forever ... _scrollView.postDelayed(_smoothScrollRunnable, 75); } };