├── ticker ├── .gitignore ├── gradle.properties ├── src │ ├── main │ │ ├── AndroidManifest.xml │ │ ├── res │ │ │ └── values │ │ │ │ └── attrs.xml │ │ └── java │ │ │ └── com │ │ │ └── robinhood │ │ │ └── ticker │ │ │ ├── TickerDrawMetrics.java │ │ │ ├── TickerUtils.java │ │ │ ├── LevenshteinUtils.java │ │ │ ├── TickerColumnManager.java │ │ │ ├── TickerColumn.java │ │ │ └── TickerView.java │ ├── androidTest │ │ └── java │ │ │ └── com │ │ │ └── robinhood │ │ │ └── ticker │ │ │ └── ApplicationTest.java │ └── test │ │ └── java │ │ └── com │ │ └── robinhood │ │ └── ticker │ │ ├── LevenshteinUtilsTest.java │ │ ├── TickerDrawMetricsTest.java │ │ ├── TickerViewTest.java │ │ ├── TickerColumnManagerTest.java │ │ └── TickerColumnTest.java ├── build.gradle ├── proguard-rules.pro └── gradle-mvn-push.gradle ├── ticker-sample ├── .gitignore ├── src │ └── main │ │ ├── res │ │ ├── mipmap-hdpi │ │ │ └── ic_launcher.png │ │ ├── mipmap-mdpi │ │ │ └── ic_launcher.png │ │ ├── mipmap-xhdpi │ │ │ └── ic_launcher.png │ │ ├── mipmap-xxhdpi │ │ │ └── ic_launcher.png │ │ ├── mipmap-xxxhdpi │ │ │ └── ic_launcher.png │ │ ├── values │ │ │ ├── strings.xml │ │ │ ├── colors.xml │ │ │ ├── dimens.xml │ │ │ └── styles.xml │ │ ├── layout │ │ │ ├── activity_perf.xml │ │ │ ├── row_perf.xml │ │ │ └── activity_main.xml │ │ └── values-w820dp │ │ │ └── dimens.xml │ │ ├── AndroidManifest.xml │ │ └── java │ │ └── com │ │ └── robinhood │ │ └── ticker │ │ └── sample │ │ ├── BaseActivity.java │ │ ├── MainActivity.java │ │ └── PerfActivity.java ├── build.gradle └── proguard-rules.pro ├── settings.gradle ├── assets └── ticker_main.gif ├── .gitignore ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── .travis.yml ├── gradle.properties ├── CHANGELOG.md ├── gradlew.bat ├── README.md ├── gradlew └── LICENSE.txt /ticker/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /ticker-sample/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | include ':ticker', 'ticker-sample' 2 | -------------------------------------------------------------------------------- /ticker/gradle.properties: -------------------------------------------------------------------------------- 1 | POM_NAME=Ticker 2 | POM_ARTIFACT_ID=ticker 3 | POM_PACKAGING=aar 4 | 5 | -------------------------------------------------------------------------------- /assets/ticker_main.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lingarajsankaravelu/ticker/master/assets/ticker_main.gif -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .idea 2 | *.iml 3 | .gradle 4 | /local.properties 5 | .DS_Store 6 | /build 7 | build 8 | /captures 9 | -------------------------------------------------------------------------------- /ticker/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lingarajsankaravelu/ticker/master/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /ticker-sample/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lingarajsankaravelu/ticker/master/ticker-sample/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /ticker-sample/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lingarajsankaravelu/ticker/master/ticker-sample/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /ticker-sample/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lingarajsankaravelu/ticker/master/ticker-sample/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /ticker-sample/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lingarajsankaravelu/ticker/master/ticker-sample/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /ticker-sample/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lingarajsankaravelu/ticker/master/ticker-sample/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /ticker-sample/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | ticker-sample 3 | Perf test 4 | 5 | -------------------------------------------------------------------------------- /ticker-sample/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #3F51B5 4 | #303F9F 5 | #FF4081 6 | 7 | -------------------------------------------------------------------------------- /ticker-sample/src/main/res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 16dp 4 | 16dp 5 | 6 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Tue Nov 08 09:47:04 PST 2016 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip 7 | -------------------------------------------------------------------------------- /ticker-sample/src/main/res/layout/activity_perf.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | -------------------------------------------------------------------------------- /ticker-sample/src/main/res/values-w820dp/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 64dp 6 | 7 | -------------------------------------------------------------------------------- /ticker/src/androidTest/java/com/robinhood/ticker/ApplicationTest.java: -------------------------------------------------------------------------------- 1 | package com.robinhood.ticker; 2 | 3 | import android.app.Application; 4 | import android.test.ApplicationTestCase; 5 | 6 | /** 7 | * Testing Fundamentals 8 | */ 9 | public class ApplicationTest extends ApplicationTestCase { 10 | public ApplicationTest() { 11 | super(Application.class); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: android 2 | 3 | android: 4 | components: 5 | - platform-tools 6 | - tools 7 | - android-23 8 | - build-tools-23.0.3 9 | - extra-android-m2repository 10 | 11 | script: 12 | ./gradlew clean check 13 | 14 | jdk: 15 | - oraclejdk8 16 | 17 | notifications: 18 | email: false 19 | 20 | sudo: false 21 | 22 | before_cache: 23 | - rm -f $HOME/.gradle/caches/modules-2/modules-2.lock 24 | cache: 25 | directories: 26 | - $HOME/.gradle 27 | -------------------------------------------------------------------------------- /ticker/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.library' 2 | 3 | android { 4 | compileSdkVersion 25 5 | buildToolsVersion "25.0.2" 6 | 7 | resourcePrefix 'ticker_' 8 | 9 | defaultConfig { 10 | minSdkVersion 12 11 | targetSdkVersion 25 12 | } 13 | } 14 | 15 | dependencies { 16 | compile fileTree(dir: 'libs', include: ['*.jar']) 17 | 18 | testCompile 'junit:junit:4.12' 19 | testCompile 'org.mockito:mockito-core:1.10.19' 20 | } 21 | 22 | apply from: './gradle-mvn-push.gradle' 23 | -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | VERSION_NAME=1.1.1 2 | GROUP=com.robinhood.ticker 3 | 4 | POM_DESCRIPTION=A textview for Android that supports scrolling text animation. 5 | POM_URL=https://github.com/robinhood/ticker/ 6 | POM_SCM_URL=https://github.com/robinhood/ticker/ 7 | POM_SCM_CONNECTION=scm:git@github.com:robinhood/ticker.git 8 | POM_SCM_DEV_CONNECTION=scm:git@github.com:robinhood/ticker.git 9 | POM_LICENCE_NAME=The Apache Software License, Version 2.0 10 | POM_LICENCE_URL=http://www.apache.org/licenses/LICENSE-2.0.txt 11 | POM_LICENCE_DIST=repo 12 | POM_DEVELOPER_ID=jinyan.09.mlk@gmail.com 13 | POM_DEVELOPER_NAME=Jin Cao 14 | -------------------------------------------------------------------------------- /ticker-sample/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 10 | 11 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /ticker-sample/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | compileSdkVersion 25 5 | buildToolsVersion "25.0.2" 6 | 7 | defaultConfig { 8 | applicationId "com.robinhood.ticker.sample" 9 | minSdkVersion 12 10 | targetSdkVersion 25 11 | } 12 | } 13 | 14 | dependencies { 15 | compile fileTree(dir: 'libs', include: ['*.jar']) 16 | compile project(':ticker') 17 | 18 | compile 'com.android.support:appcompat-v7:25.3.1' 19 | compile 'com.android.support:recyclerview-v7:25.3.1' 20 | 21 | compile 'io.reactivex:rxjava:1.1.1' 22 | compile 'io.reactivex:rxandroid:1.1.0' 23 | } 24 | -------------------------------------------------------------------------------- /ticker/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in /Users/jincao/Library/Android/sdk/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | -------------------------------------------------------------------------------- /ticker-sample/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in /Users/jincao/Library/Android/sdk/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | -------------------------------------------------------------------------------- /ticker-sample/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /ticker/src/main/res/values/attrs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | Version 1.1.1 *(2016-11-08)* 2 | ---------------------------- 3 | * Add minimum support for arbitrary characters. 4 | * Update support and gradle dependencies. 5 | 6 | Version 1.1.0 *(2016-08-11)* 7 | ---------------------------- 8 | * Performance optimizations for re-measure and re-layout. 9 | * Better size change animation with Levenshtein algorithm. 10 | * Added support for `animateMeasurementChange` to animate size changes smoothly during size change. 11 | This will call `requestLayout()` on every animation frame so use with care. 12 | * Added support for animator listener to listen to updates by the main animator. 13 | 14 | Version 1.0.1 *(2016-07-25)* 15 | ---------------------------- 16 | * BREAKING: changed `app:ticker_textColor` into `android:textColor` and `app:ticker_textSize` 17 | into `android:textSize`. 18 | * Added support for getting/setting type face programmatically. 19 | * Added support for `app:ticker_animationDuration`, `android:gravity`, `android:textAppearance`. 20 | 21 | 22 | Version 1.0.0 *(2016-07-15)* 23 | ---------------------------- 24 | 25 | Initial release! 26 | -------------------------------------------------------------------------------- /ticker-sample/src/main/res/layout/row_perf.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 13 | 14 | 20 | 21 | 27 | 28 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /ticker-sample/src/main/java/com/robinhood/ticker/sample/BaseActivity.java: -------------------------------------------------------------------------------- 1 | package com.robinhood.ticker.sample; 2 | 3 | import android.os.Handler; 4 | import android.support.v7.app.AppCompatActivity; 5 | 6 | import java.util.Random; 7 | 8 | public abstract class BaseActivity extends AppCompatActivity { 9 | protected static final Random RANDOM = new Random(System.currentTimeMillis()); 10 | 11 | private Handler handler = new Handler(); 12 | private boolean resumed; 13 | 14 | @Override 15 | protected void onResume() { 16 | super.onResume(); 17 | resumed = true; 18 | handler.post(createRunnable()); 19 | } 20 | 21 | private Runnable createRunnable() { 22 | return new Runnable() { 23 | @Override 24 | public void run() { 25 | onUpdate(); 26 | if (resumed) { 27 | handler.postDelayed(createRunnable(), RANDOM.nextInt(1750) + 250); 28 | } 29 | } 30 | }; 31 | } 32 | 33 | protected abstract void onUpdate(); 34 | 35 | @Override 36 | protected void onPause() { 37 | resumed = false; 38 | super.onPause(); 39 | } 40 | 41 | protected String getRandomNumber(int digits) { 42 | final int digitsInPowerOf10 = (int) Math.pow(10, digits); 43 | return Integer.toString(RANDOM.nextInt(digitsInPowerOf10) + 44 | digitsInPowerOf10 * (RANDOM.nextInt(8) + 1)); 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /ticker-sample/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 16 | 17 | 25 | 26 | 34 | 35 |