├── LICENSE.md ├── README.md └── RollingTextAnimation ├── .gitignore ├── .idea ├── caches │ └── build_file_checksums.ser ├── codeStyles │ └── Project.xml ├── gradle.xml ├── misc.xml ├── runConfigurations.xml └── vcs.xml ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── textanimation │ │ └── com │ │ └── rollingtextanimation │ │ └── ExampleInstrumentedTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── textanimation │ │ │ └── com │ │ │ └── rollingtextanimation │ │ │ ├── MainActivity.java │ │ │ └── TextAnimationFields.java │ └── res │ │ ├── drawable-v24 │ │ └── ic_launcher_foreground.xml │ │ ├── drawable │ │ ├── bg.xml │ │ ├── bg_new.xml │ │ └── ic_launcher_background.xml │ │ ├── layout │ │ └── activity_main.xml │ │ ├── mipmap-anydpi-v26 │ │ ├── ic_launcher.xml │ │ └── ic_launcher_round.xml │ │ ├── mipmap-hdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-mdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxxhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ └── values │ │ ├── colors.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── test │ └── java │ └── textanimation │ └── com │ └── rollingtextanimation │ └── ExampleUnitTest.java ├── build.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── settings.gradle /LICENSE.md: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 Kavita Patil 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Rolling-TextView-Animation 2 | 3 | # Gif: 4 | ![rolling-textview](https://user-images.githubusercontent.com/20037228/49328085-87f6e300-f590-11e8-98cb-afc364494cff.gif) 5 | 6 | # What is Rolling-TextView? 7 | As name indicates Rolling text is an Android UI animation given to text view, in which number scrolls one after other in an incremental order. The idea of animation is to give a feel of scrolling number which we ususally gets to see on petrol pump's display. The number starts rolling from 0 and ends on a number which has to be displayed. 8 | 9 | Like 2345 will start animating from 0000--->2345. Currently we are supporting numbers only for animation. 10 | 11 | # Customizations: 12 | 1. We can have animation on any number of text views, if we enter two numbers(56) the two text fields will be created dynamically. 13 | 2. We can customize the font size and style of the text view. 14 | 3. We can customize the animation duration. 15 | 4. We can increase or decrease the gap between two animating text views. 16 | 17 | # Use: 18 | 1. We can use this animation while validating otp numbers. 19 | 2. This can be used in any number display UI. 20 | 21 | ## License: 22 | 23 | MIT License 24 | 25 | Copyright (c) 2018 Kavita Patil 26 | 27 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 28 | 29 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 30 | 31 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 32 | -------------------------------------------------------------------------------- /RollingTextAnimation/.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/libraries 5 | /.idea/modules.xml 6 | /.idea/workspace.xml 7 | .DS_Store 8 | /build 9 | /captures 10 | .externalNativeBuild 11 | -------------------------------------------------------------------------------- /RollingTextAnimation/.idea/caches/build_file_checksums.ser: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kavitamp/Rolling-TextView-Animation/HEAD/RollingTextAnimation/.idea/caches/build_file_checksums.ser -------------------------------------------------------------------------------- /RollingTextAnimation/.idea/codeStyles/Project.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 15 | 16 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /RollingTextAnimation/.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 17 | 18 | -------------------------------------------------------------------------------- /RollingTextAnimation/.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 17 | 27 | 28 | 29 | 30 | 31 | 32 | 34 | -------------------------------------------------------------------------------- /RollingTextAnimation/.idea/runConfigurations.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 12 | -------------------------------------------------------------------------------- /RollingTextAnimation/.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /RollingTextAnimation/app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /RollingTextAnimation/app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | compileSdkVersion 28 5 | defaultConfig { 6 | applicationId "textanimation.com.rollingtextanimation" 7 | minSdkVersion 15 8 | targetSdkVersion 28 9 | versionCode 1 10 | versionName "1.0" 11 | testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 12 | } 13 | buildTypes { 14 | release { 15 | minifyEnabled false 16 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 17 | } 18 | } 19 | } 20 | 21 | dependencies { 22 | implementation fileTree(dir: 'libs', include: ['*.jar']) 23 | implementation 'com.android.support:appcompat-v7:28.0.0' 24 | implementation 'com.android.support.constraint:constraint-layout:1.1.3' 25 | testImplementation 'junit:junit:4.12' 26 | androidTestImplementation 'com.android.support.test:runner:1.0.2' 27 | androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' 28 | } 29 | -------------------------------------------------------------------------------- /RollingTextAnimation/app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile 22 | -------------------------------------------------------------------------------- /RollingTextAnimation/app/src/androidTest/java/textanimation/com/rollingtextanimation/ExampleInstrumentedTest.java: -------------------------------------------------------------------------------- 1 | package textanimation.com.rollingtextanimation; 2 | 3 | import android.content.Context; 4 | import android.support.test.InstrumentationRegistry; 5 | import android.support.test.runner.AndroidJUnit4; 6 | 7 | import org.junit.Test; 8 | import org.junit.runner.RunWith; 9 | 10 | import static org.junit.Assert.*; 11 | 12 | /** 13 | * Instrumented test, which will execute on an Android device. 14 | * 15 | * @see Testing documentation 16 | */ 17 | @RunWith(AndroidJUnit4.class) 18 | public class ExampleInstrumentedTest { 19 | @Test 20 | public void useAppContext() { 21 | // Context of the app under test. 22 | Context appContext = InstrumentationRegistry.getTargetContext(); 23 | 24 | assertEquals("textanimation.com.rollingtextanimation", appContext.getPackageName()); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /RollingTextAnimation/app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /RollingTextAnimation/app/src/main/java/textanimation/com/rollingtextanimation/MainActivity.java: -------------------------------------------------------------------------------- 1 | package textanimation.com.rollingtextanimation; 2 | 3 | import android.animation.Animator; 4 | import android.animation.AnimatorListenerAdapter; 5 | import android.animation.AnimatorSet; 6 | import android.animation.ObjectAnimator; 7 | import android.graphics.Color; 8 | import android.graphics.Typeface; 9 | import android.os.Bundle; 10 | import android.os.Handler; 11 | import android.support.v7.app.AppCompatActivity; 12 | import android.view.Gravity; 13 | import android.view.View; 14 | import android.view.animation.LinearInterpolator; 15 | import android.widget.AdapterView; 16 | import android.widget.ArrayAdapter; 17 | import android.widget.Button; 18 | import android.widget.EditText; 19 | import android.widget.LinearLayout; 20 | import android.widget.RelativeLayout; 21 | import android.widget.Spinner; 22 | import android.widget.TableLayout; 23 | import android.widget.TextView; 24 | import android.widget.Toast; 25 | 26 | 27 | public class MainActivity extends AppCompatActivity implements View.OnClickListener { 28 | 29 | final String textSizeArray[] = new String[]{"20", "25", "30", "35", "40", "45"}; 30 | final String textStyle[] = new String[]{"Bold", "Normal"}; 31 | int[] animatingNumbers = {1, 6, 9, 5}; 32 | LinearLayout linearLayout; 33 | Button tryAgain; 34 | TextView[] myTextViews, myTextViewsOut; 35 | RelativeLayout childLayout; 36 | LinearLayout.LayoutParams linearParams; 37 | TextView rowTextView, rowTextViewOut; 38 | EditText editText, animationDurationET, gapBetweenTwoNos; 39 | Spinner textSizeSpinner, textStyleSpinner; 40 | TextAnimationFields textAnimationFields; 41 | 42 | @Override 43 | public void onCreate(Bundle savedInstanceState) { 44 | super.onCreate(savedInstanceState); 45 | setContentView(R.layout.activity_main); 46 | textAnimationFields = new TextAnimationFields(); 47 | 48 | editText = findViewById(R.id.editText); 49 | animationDurationET = findViewById(R.id.animationDurationET); 50 | gapBetweenTwoNos = findViewById(R.id.gapBetweenTwoNos); 51 | tryAgain = findViewById(R.id.tryAgain); 52 | textSizeSpinner = findViewById(R.id.textSizeSpinner); 53 | textStyleSpinner = findViewById(R.id.textStyleSpinner); 54 | linearLayout = findViewById(R.id.linearLayout); 55 | 56 | 57 | ArrayAdapter stringArrayAdapter = new ArrayAdapter(MainActivity.this, android.R.layout.simple_spinner_item, textSizeArray); 58 | stringArrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 59 | textSizeSpinner.setAdapter(stringArrayAdapter); 60 | 61 | ArrayAdapter textStyleArrayAdapter = new ArrayAdapter(MainActivity.this, android.R.layout.simple_spinner_item, textStyle); 62 | stringArrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 63 | textStyleSpinner.setAdapter(textStyleArrayAdapter); 64 | 65 | textSizeSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 66 | @Override 67 | public void onItemSelected(AdapterView adapterView, View view, int i, long l) { 68 | textAnimationFields.setTextSize(Integer.parseInt(textSizeArray[i])); 69 | } 70 | 71 | @Override 72 | public void onNothingSelected(AdapterView adapterView) { 73 | } 74 | }); 75 | 76 | textStyleSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 77 | @Override 78 | public void onItemSelected(AdapterView adapterView, View view, int i, long l) { 79 | textAnimationFields.setTextStyleString("" + textStyle[i]); 80 | } 81 | 82 | @Override 83 | public void onNothingSelected(AdapterView adapterView) { 84 | } 85 | }); 86 | 87 | createNumberOfTextFields(); 88 | 89 | tryAgain.setOnClickListener(this); 90 | 91 | } 92 | 93 | 94 | public void createNumberOfTextFields() { 95 | 96 | myTextViews = new TextView[textAnimationFields.getMaxNumbers()]; // create an empty array; 97 | myTextViewsOut = new TextView[textAnimationFields.getMaxNumbers()]; // create an empty array; 98 | 99 | for (int i = 0; i < textAnimationFields.getMaxNumbers(); i++) { 100 | childLayout = new RelativeLayout(MainActivity.this); 101 | 102 | linearParams = new LinearLayout.LayoutParams((textAnimationFields.getTextSize() * 3), 103 | LinearLayout.LayoutParams.WRAP_CONTENT); 104 | childLayout.setBackgroundDrawable(getBaseContext().getResources().getDrawable(R.drawable.bg)); 105 | linearParams.setMargins(30, 0, 30, 0); 106 | 107 | childLayout.setLayoutParams(linearParams); 108 | 109 | // create a new textview 110 | rowTextView = new TextView(this); 111 | rowTextViewOut = new TextView(this); 112 | 113 | rowTextView.setLayoutParams(new TableLayout.LayoutParams( 114 | LinearLayout.LayoutParams.WRAP_CONTENT, 115 | LinearLayout.LayoutParams.WRAP_CONTENT, 1f)); 116 | rowTextViewOut.setLayoutParams(new TableLayout.LayoutParams( 117 | LinearLayout.LayoutParams.WRAP_CONTENT, 118 | LinearLayout.LayoutParams.WRAP_CONTENT, 1f)); 119 | rowTextView.setGravity(Gravity.CENTER); 120 | rowTextViewOut.setGravity(Gravity.CENTER); 121 | 122 | childLayout.addView(rowTextViewOut, 0); 123 | childLayout.addView(rowTextView, 0); 124 | 125 | linearLayout.addView(childLayout); 126 | rowTextView.setTextSize((float) textAnimationFields.getTextSize()); 127 | rowTextViewOut.setTextSize((float) textAnimationFields.getTextSize()); 128 | rowTextView.setTextColor(Color.WHITE); 129 | rowTextViewOut.setTextColor(Color.WHITE); 130 | 131 | if (textAnimationFields.getTextStyleString().equals(textStyle[0])) { 132 | rowTextView.setTypeface(Typeface.DEFAULT_BOLD); 133 | rowTextViewOut.setTypeface(Typeface.DEFAULT_BOLD); 134 | } else { 135 | rowTextView.setTypeface(Typeface.defaultFromStyle(Typeface.NORMAL)); 136 | rowTextViewOut.setTypeface(Typeface.defaultFromStyle(Typeface.NORMAL)); 137 | } 138 | 139 | myTextViews[i] = rowTextView; 140 | myTextViewsOut[i] = rowTextViewOut; 141 | 142 | animateTexts(animatingNumbers[i], 0, myTextViews[i], myTextViewsOut[i]); 143 | 144 | } 145 | } 146 | 147 | @Override 148 | public void onClick(View view) { 149 | switch (view.getId()) { 150 | case R.id.tryAgain: 151 | setEditTextFields(); 152 | createNumberOfTextFields(); 153 | break; 154 | 155 | } 156 | } 157 | 158 | public void setEditTextFields() { 159 | String editedTextNumber = editText.getText().toString().trim(); 160 | String vvv = animationDurationET.getText().toString().trim(); 161 | String gapBetweenTwoNumbersDurationString = gapBetweenTwoNos.getText().toString().trim(); 162 | 163 | if (editedTextNumber.equals("")) { 164 | editText.setText("1695"); 165 | } 166 | if (vvv.equals("")) { 167 | vvv = "" + 200; 168 | animationDurationET.setText("" + vvv); 169 | } 170 | 171 | if (gapBetweenTwoNumbersDurationString.equals("")) { 172 | gapBetweenTwoNumbersDurationString = "" + 100; 173 | gapBetweenTwoNos.setText("" + textAnimationFields.getGapBetweenTwoNumbersDuration()); 174 | } 175 | 176 | textAnimationFields.setGapBetweenTwoNumbersDuration(Integer.parseInt(gapBetweenTwoNumbersDurationString)); 177 | textAnimationFields.setAnimationDuration(Integer.parseInt(vvv)); 178 | if (textAnimationFields.getAnimationDuration() < 100) { 179 | textAnimationFields.setAnimationDuration(100); 180 | Toast.makeText(getApplicationContext(), "We have set 100 as minimum animation time!", Toast.LENGTH_LONG).show(); 181 | } 182 | 183 | linearLayout.removeAllViews(); 184 | if (editedTextNumber.length() != 0) { 185 | textAnimationFields.setMaxNumbers(editedTextNumber.length()); 186 | char NArray[] = editedTextNumber.toCharArray(); 187 | animatingNumbers = new int[7]; 188 | for (int i = 0; i < editedTextNumber.length(); i++) { 189 | animatingNumbers[i] = Integer.parseInt("" + NArray[i]); 190 | } 191 | } else { 192 | animatingNumbers = new int[]{1, 6, 9, 5}; 193 | textAnimationFields.setMaxNumbers(animatingNumbers.length); 194 | } 195 | } 196 | 197 | public void animateTexts(final int actualNo, final int loopNo, final TextView textView, final TextView textViewOut) { 198 | textViewOut.setText(" " + loopNo + " "); 199 | textView.setVisibility(View.GONE); 200 | 201 | 202 | if (actualNo == loopNo) { 203 | textViewOut.setText(" " + actualNo + " "); 204 | textView.setText(" " + actualNo + " "); 205 | textView.setVisibility(View.VISIBLE); 206 | } else { 207 | AnimatorSet animatorSet2 = new AnimatorSet(); 208 | animatorSet2.setInterpolator(new LinearInterpolator()); 209 | animatorSet2.playTogether( 210 | ObjectAnimator.ofFloat(textViewOut, "translationY", 0, (textAnimationFields.getTextSize() * 3)) 211 | ); 212 | animatorSet2.setDuration(textAnimationFields.getAnimationDuration()); 213 | animatorSet2.addListener(new AnimatorListenerAdapter() { 214 | 215 | @Override 216 | public void onAnimationEnd(Animator animation) { 217 | super.onAnimationEnd(animation); 218 | } 219 | }); 220 | animatorSet2.start(); 221 | 222 | 223 | Handler handler = new Handler(); 224 | handler.postDelayed(new Runnable() { 225 | @Override 226 | public void run() { 227 | textView.setVisibility(View.VISIBLE); 228 | AnimatorSet animatorSet2 = new AnimatorSet(); 229 | animatorSet2.playTogether( 230 | ObjectAnimator.ofFloat(textView, "translationY", -(textAnimationFields.getTextSize() * 3), 0) 231 | ); 232 | animatorSet2.setDuration(textAnimationFields.getAnimationDuration()); 233 | animatorSet2.setInterpolator(new LinearInterpolator()); 234 | animatorSet2.addListener(new AnimatorListenerAdapter() { 235 | @Override 236 | public void onAnimationStart(Animator animation) { 237 | super.onAnimationStart(animation); 238 | if (actualNo < loopNo) 239 | textView.setText(" " + (loopNo - 1) + " "); 240 | else 241 | textView.setText(" " + (loopNo + 1) + " "); 242 | } 243 | 244 | @Override 245 | public void onAnimationEnd(Animator animation) { 246 | super.onAnimationEnd(animation); 247 | if (actualNo < loopNo) 248 | animateTexts(actualNo, loopNo - 1, textView, textViewOut); 249 | else 250 | animateTexts(actualNo, loopNo + 1, textView, textViewOut); 251 | } 252 | }); 253 | animatorSet2.start(); 254 | } 255 | }, textAnimationFields.getGapBetweenTwoNumbersDuration()); 256 | } 257 | 258 | } 259 | } 260 | -------------------------------------------------------------------------------- /RollingTextAnimation/app/src/main/java/textanimation/com/rollingtextanimation/TextAnimationFields.java: -------------------------------------------------------------------------------- 1 | package textanimation.com.rollingtextanimation; 2 | 3 | public class TextAnimationFields { 4 | 5 | 6 | int textSize = 20; 7 | String textStyleString = "Bold"; 8 | int maxNumbers = 4; 9 | long animationDuration = 200, gapBetweenTwoNumbersDuration = 100; 10 | 11 | public int getTextSize() { 12 | return textSize; 13 | } 14 | 15 | public void setTextSize(int textSize) { 16 | this.textSize = textSize; 17 | } 18 | 19 | public String getTextStyleString() { 20 | return textStyleString; 21 | } 22 | 23 | public void setTextStyleString(String textStyleString) { 24 | this.textStyleString = textStyleString; 25 | } 26 | 27 | public int getMaxNumbers() { 28 | return maxNumbers; 29 | } 30 | 31 | public void setMaxNumbers(int maxNumbers) { 32 | this.maxNumbers = maxNumbers; 33 | } 34 | 35 | public long getAnimationDuration() { 36 | return animationDuration; 37 | } 38 | 39 | public void setAnimationDuration(long animationDuration) { 40 | this.animationDuration = animationDuration; 41 | } 42 | 43 | public long getGapBetweenTwoNumbersDuration() { 44 | return gapBetweenTwoNumbersDuration; 45 | } 46 | 47 | public void setGapBetweenTwoNumbersDuration(long gapBetweenTwoNumbersDuration) { 48 | this.gapBetweenTwoNumbersDuration = gapBetweenTwoNumbersDuration; 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /RollingTextAnimation/app/src/main/res/drawable-v24/ic_launcher_foreground.xml: -------------------------------------------------------------------------------- 1 | 7 | 12 | 13 | 19 | 22 | 25 | 26 | 27 | 28 | 34 | 35 | -------------------------------------------------------------------------------- /RollingTextAnimation/app/src/main/res/drawable/bg.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 7 | 8 | 14 | 15 | 19 | -------------------------------------------------------------------------------- /RollingTextAnimation/app/src/main/res/drawable/bg_new.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 8 | 9 | -------------------------------------------------------------------------------- /RollingTextAnimation/app/src/main/res/drawable/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | 15 | 20 | 25 | 30 | 35 | 40 | 45 | 50 | 55 | 60 | 65 | 70 | 75 | 80 | 85 | 90 | 95 | 100 | 105 | 110 | 115 | 120 | 125 | 130 | 135 | 140 | 145 | 150 | 155 | 160 | 165 | 170 | 171 | -------------------------------------------------------------------------------- /RollingTextAnimation/app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 9 | 10 | 18 | 19 | 20 | 29 | 30 | 41 | 42 | 51 | 52 | 63 | 64 | 75 | 76 | 86 | 87 | 93 | 94 | 99 | 100 | 106 | 107 | 108 | 109 | 110 | 111 | 121 | 122 | 128 | 129 | 134 | 135 | 141 | 142 | 143 | 144 | 145 | 146 |