From e5824bc80c5a1faa3fa2594207c8573435f21625 Mon Sep 17 00:00:00 2001 From: Suneet Agrawal Date: Mon, 26 Mar 2018 11:32:45 +0100 Subject: [PATCH 1/9] removed cached files --- .gitignore | 4 ++++ .idea/caches/build_file_checksums.ser | Bin 588 -> 0 bytes .idea/modules.xml | 10 ---------- .idea/runConfigurations.xml | 12 ------------ .idea/vcs.xml | 6 ------ .../loaders/TrailingCircularDotsLoader.kt | 4 ++++ 6 files changed, 8 insertions(+), 28 deletions(-) delete mode 100644 .idea/caches/build_file_checksums.ser delete mode 100644 .idea/modules.xml delete mode 100644 .idea/runConfigurations.xml delete mode 100644 .idea/vcs.xml create mode 100644 dotsloader/src/main/java/com/agrawalsuneet/dotsloader/loaders/TrailingCircularDotsLoader.kt diff --git a/.gitignore b/.gitignore index f5302c4..f962ca5 100644 --- a/.gitignore +++ b/.gitignore @@ -34,6 +34,7 @@ captures/ # Intellij *.iml +.idea .idea/workspace.xml .idea/tasks.xml .idea/gradle.xml @@ -41,6 +42,9 @@ captures/ .idea/libraries .idea/cache .idea/misc.xml +.idea/caches +.idea/codeStyles +.idea/modules.xml # Keystore files *.jks diff --git a/.idea/caches/build_file_checksums.ser b/.idea/caches/build_file_checksums.ser deleted file mode 100644 index e165c0b70294befd1769c1458de2288ce7f837d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 588 zcmZ4UmVvdnh`~NNKUXg?FQq6yGexf?KR>5fFEb@IQ7^qHF(oHeub?PDD>b=9F91S2 zm1gFoxMk*~I%lLNXBU^|7Q2L-Ts|(GuF1r}l-a(W(##Th_( zR`y#54~r#SWM*J;W8likPfT%3OfJbU@?_vF$tX%K&dAS6sVJ~_U;qK0at>#y!qi&SHd8ONA;H8IN@twJ08WJ l2!7ytBXu3nd5HxDI6Uo}-tmRk_S4hkYvq&MvZrjT005JB()R!W diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index 2118693..0000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml deleted file mode 100644 index 7f68460..0000000 --- a/.idea/runConfigurations.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 94a25f7..0000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/dotsloader/src/main/java/com/agrawalsuneet/dotsloader/loaders/TrailingCircularDotsLoader.kt b/dotsloader/src/main/java/com/agrawalsuneet/dotsloader/loaders/TrailingCircularDotsLoader.kt new file mode 100644 index 0000000..c55d3f9 --- /dev/null +++ b/dotsloader/src/main/java/com/agrawalsuneet/dotsloader/loaders/TrailingCircularDotsLoader.kt @@ -0,0 +1,4 @@ +package com.agrawalsuneet.dotsloader.loaders + +class TrailingCircularDotsLoader { +} \ No newline at end of file From 9bac1b1827050c6c3da2f50f7adf056b9d0c2fda Mon Sep 17 00:00:00 2001 From: Suneet Agrawal Date: Wed, 28 Mar 2018 12:48:54 +0100 Subject: [PATCH 2/9] add loader and animation --- .../com/agrawalsuneet/loaders/MainActivity.kt | 44 ++++- .../layout/activity_main_trailingcirculer.xml | 20 +++ .../loaders/TrailingCircularDotsLoader.kt | 170 +++++++++++++++++- 3 files changed, 231 insertions(+), 3 deletions(-) create mode 100644 app/src/main/res/layout/activity_main_trailingcirculer.xml diff --git a/app/src/main/java/com/agrawalsuneet/loaders/MainActivity.kt b/app/src/main/java/com/agrawalsuneet/loaders/MainActivity.kt index c921aa6..31eaaf2 100644 --- a/app/src/main/java/com/agrawalsuneet/loaders/MainActivity.kt +++ b/app/src/main/java/com/agrawalsuneet/loaders/MainActivity.kt @@ -3,9 +3,12 @@ package com.agrawalsuneet.loaders import android.os.Bundle import android.support.v4.content.ContextCompat import android.support.v7.app.AppCompatActivity +import android.view.animation.Animation import android.view.animation.DecelerateInterpolator import android.view.animation.LinearInterpolator +import android.view.animation.RotateAnimation import android.widget.LinearLayout +import android.widget.RelativeLayout import com.agrawalsuneet.dotsloader.loaders.* class MainActivity : AppCompatActivity() { @@ -14,9 +17,9 @@ class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setContentView(R.layout.activity_main_tashieloader) + setContentView(R.layout.activity_main_trailingcirculer) - supportActionBar!!.title = "TashieLoader" + supportActionBar!!.title = "TrailingCircularDotsLoader" containerLL = findViewById(R.id.container) as LinearLayout @@ -26,8 +29,45 @@ class MainActivity : AppCompatActivity() { //initTashieLoader() //initSlidongLoader() //initRotatingCircularDotsLoader() + + initTrailingCirculerDotsLoader() } + private fun initTrailingCirculerDotsLoader() { + /*var loader = findViewById(R.id.trailingloaderRL) + + var circle = findViewById(R.id.circleview) + + val layoutparams = circle.getLayoutParams() as RelativeLayout.LayoutParams + layoutparams.addRule(RelativeLayout.CENTER_HORIZONTAL) + circle.setLayoutParams(layoutparams)*/ + +// var rotateAnim = getRotateAnimation() +// +// loader.startAnimation(rotateAnim) + + + //var trailingLoader = findViewById(R.id.trailingloader) + + /* val layoutparams = trailingLoader.getLayoutParams() as RelativeLayout.LayoutParams + layoutparams.addRule(RelativeLayout.CENTER_HORIZONTAL) + mainCircle.setLayoutParams(layoutparams)*/ + } + + + private fun getRotateAnimation(): RotateAnimation { + + val transAnim = RotateAnimation(0f, 360f, + Animation.RELATIVE_TO_SELF, 0.5f, + Animation.RELATIVE_TO_SELF, 0.5f) + transAnim.duration = 2000 + transAnim.fillAfter = true + transAnim.repeatCount = Animation.INFINITE + transAnim.repeatMode = Animation.RESTART + transAnim.interpolator = LinearInterpolator() + + return transAnim + } private fun initRotatingCircularDotsLoader() { val loader = RotatingCircularDotsLoader(this, diff --git a/app/src/main/res/layout/activity_main_trailingcirculer.xml b/app/src/main/res/layout/activity_main_trailingcirculer.xml new file mode 100644 index 0000000..ee0e6c5 --- /dev/null +++ b/app/src/main/res/layout/activity_main_trailingcirculer.xml @@ -0,0 +1,20 @@ + + + + + + + diff --git a/dotsloader/src/main/java/com/agrawalsuneet/dotsloader/loaders/TrailingCircularDotsLoader.kt b/dotsloader/src/main/java/com/agrawalsuneet/dotsloader/loaders/TrailingCircularDotsLoader.kt index c55d3f9..b9c2e76 100644 --- a/dotsloader/src/main/java/com/agrawalsuneet/dotsloader/loaders/TrailingCircularDotsLoader.kt +++ b/dotsloader/src/main/java/com/agrawalsuneet/dotsloader/loaders/TrailingCircularDotsLoader.kt @@ -1,4 +1,172 @@ package com.agrawalsuneet.dotsloader.loaders -class TrailingCircularDotsLoader { +import android.content.Context +import android.graphics.Canvas +import android.graphics.Color +import android.os.Handler +import android.util.AttributeSet +import android.view.Gravity +import android.view.View +import android.view.ViewTreeObserver +import android.view.animation.* +import android.widget.LinearLayout +import android.widget.RelativeLayout +import android.widget.TextView +import com.agrawalsuneet.dotsloader.R +import com.agrawalsuneet.dotsloader.basicviews.CircleView +import com.agrawalsuneet.dotsloader.basicviews.LoaderContract + +class TrailingCircularDotsLoader : LinearLayout, LoaderContract { + + var circleColor: Int = resources.getColor(R.color.loader_selected) + + var circleRadius: Int = 50 + var BigCircleRadius: Int = 200 + + var animDuration: Int = 2000 + + private var calWidthHeight: Int = 0 + private lateinit var mainCircle: CircleView + private lateinit var relativeLayout: RelativeLayout + private lateinit var trailingCirclesArray: Array + + constructor(context: Context) : super(context) { + initView() + } + + constructor(context: Context, attrs: AttributeSet) : super(context, attrs) { + initAttributes(attrs) + initView() + } + + constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(context, attrs, defStyleAttr) { + initAttributes(attrs) + initView() + } + + + override fun initAttributes(attrs: AttributeSet) { + } + + override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec) + + if (calWidthHeight == 0) { + calWidthHeight = (2 * BigCircleRadius) + (2 * circleRadius) + } + + setMeasuredDimension(calWidthHeight, calWidthHeight) + } + + private fun initView() { + removeAllViews() + removeAllViewsInLayout() + + this.gravity = Gravity.CENTER_HORIZONTAL + + relativeLayout = RelativeLayout(context); + relativeLayout.gravity = Gravity.CENTER_HORIZONTAL + + + if (calWidthHeight == 0) { + calWidthHeight = (2 * BigCircleRadius) + (2 * circleRadius) + } + + var relParam = RelativeLayout.LayoutParams(calWidthHeight, calWidthHeight) + + mainCircle = CircleView(context, circleRadius, circleColor) + relativeLayout.addView(mainCircle) + + this.addView(relativeLayout, relParam) + + + trailingCirclesArray = arrayOfNulls(6) + + for (i in 0..5) { + var circleColor = 0 + when (i) { + 0, 3 -> circleColor = resources.getColor(android.R.color.holo_red_light) + 1, 4 -> circleColor = resources.getColor(android.R.color.holo_green_light) + 2, 5 -> circleColor = resources.getColor(android.R.color.holo_blue_light) + } + + val circle = CircleView(context, circleRadius, circleColor) + relativeLayout.addView(circle) + trailingCirclesArray[i] = circle + } + + val loaderView = this + + + viewTreeObserver.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener { + override fun onGlobalLayout() { + startLoading() + + val vto = loaderView.viewTreeObserver + vto.removeOnGlobalLayoutListener(this) + } + }) + } + + private fun startLoading() { + + val mainCircleAnim = getRotateAnimation() + mainCircle.startAnimation(mainCircleAnim) + + for (i in 1..6) { + val animSet = getTrainlingAnim((animDuration / 10) + ((animDuration * i) / 30)) + trailingCirclesArray[i - 1]!!.startAnimation(animSet) + } + + mainCircleAnim.setAnimationListener(object : Animation.AnimationListener { + override fun onAnimationEnd(p0: Animation?) { + Handler().postDelayed({ + startLoading() + }, (animDuration / 10).toLong()) + } + + override fun onAnimationRepeat(p0: Animation?) { + } + + override fun onAnimationStart(p0: Animation?) { + } + + }) + + } + + private fun getRotateAnimation(): RotateAnimation { + + val rotateAnim = RotateAnimation(0f, 360f, + Animation.RELATIVE_TO_SELF, 0.5f, + Animation.RELATIVE_TO_PARENT, 0.5f) + rotateAnim.duration = animDuration.toLong() + rotateAnim.fillAfter = true + rotateAnim.interpolator = AccelerateDecelerateInterpolator() + rotateAnim.startOffset = (animDuration / 10).toLong() + + return rotateAnim + } + + private fun getTrainlingAnim(delay: Int): AnimationSet { + val animSet = AnimationSet(true) + + val scaleAnim = ScaleAnimation(1.0f, 0.75f, 1.0f, 0.75f) + scaleAnim.duration = (animDuration / 2).toLong() + + + val rotateAnim = RotateAnimation(0f, 360f, + Animation.RELATIVE_TO_SELF, 0.5f, + Animation.RELATIVE_TO_PARENT, 0.5f) + rotateAnim.duration = animDuration.toLong() + + animSet.addAnimation(rotateAnim) + animSet.duration = animDuration.toLong() + animSet.fillAfter = true + animSet.interpolator = AccelerateDecelerateInterpolator() + animSet.startOffset = delay.toLong() + + + return animSet + } } \ No newline at end of file From c8c5891f4b8fa6563bddf3124676a4f9e8a1b90b Mon Sep 17 00:00:00 2001 From: Suneet Agrawal Date: Fri, 27 Apr 2018 14:01:58 +0100 Subject: [PATCH 3/9] adjusted animation --- .../loaders/TrailingCircularDotsLoader.kt | 57 ++++++++++--------- 1 file changed, 29 insertions(+), 28 deletions(-) diff --git a/dotsloader/src/main/java/com/agrawalsuneet/dotsloader/loaders/TrailingCircularDotsLoader.kt b/dotsloader/src/main/java/com/agrawalsuneet/dotsloader/loaders/TrailingCircularDotsLoader.kt index b9c2e76..ff9915b 100644 --- a/dotsloader/src/main/java/com/agrawalsuneet/dotsloader/loaders/TrailingCircularDotsLoader.kt +++ b/dotsloader/src/main/java/com/agrawalsuneet/dotsloader/loaders/TrailingCircularDotsLoader.kt @@ -1,17 +1,13 @@ package com.agrawalsuneet.dotsloader.loaders import android.content.Context -import android.graphics.Canvas -import android.graphics.Color import android.os.Handler import android.util.AttributeSet import android.view.Gravity -import android.view.View import android.view.ViewTreeObserver import android.view.animation.* import android.widget.LinearLayout import android.widget.RelativeLayout -import android.widget.TextView import com.agrawalsuneet.dotsloader.R import com.agrawalsuneet.dotsloader.basicviews.CircleView import com.agrawalsuneet.dotsloader.basicviews.LoaderContract @@ -20,10 +16,13 @@ class TrailingCircularDotsLoader : LinearLayout, LoaderContract { var circleColor: Int = resources.getColor(R.color.loader_selected) + var noOfTrailingDots: Int = 6 + var circleRadius: Int = 50 var BigCircleRadius: Int = 200 var animDuration: Int = 2000 + var animDelay: Int = animDuration / 5 private var calWidthHeight: Int = 0 private lateinit var mainCircle: CircleView @@ -80,15 +79,15 @@ class TrailingCircularDotsLoader : LinearLayout, LoaderContract { this.addView(relativeLayout, relParam) - trailingCirclesArray = arrayOfNulls(6) + trailingCirclesArray = arrayOfNulls(noOfTrailingDots) - for (i in 0..5) { - var circleColor = 0 + for (i in 0 until noOfTrailingDots) { + /*var circleColor = 0 when (i) { 0, 3 -> circleColor = resources.getColor(android.R.color.holo_red_light) 1, 4 -> circleColor = resources.getColor(android.R.color.holo_green_light) 2, 5 -> circleColor = resources.getColor(android.R.color.holo_blue_light) - } + }*/ val circle = CircleView(context, circleRadius, circleColor) relativeLayout.addView(circle) @@ -113,26 +112,26 @@ class TrailingCircularDotsLoader : LinearLayout, LoaderContract { val mainCircleAnim = getRotateAnimation() mainCircle.startAnimation(mainCircleAnim) - for (i in 1..6) { - val animSet = getTrainlingAnim((animDuration / 10) + ((animDuration * i) / 30)) + for (i in 1..noOfTrailingDots) { + val animSet = getTrainlingAnim(i, (animDuration / 10) + ((animDuration * i) / 20)) trailingCirclesArray[i - 1]!!.startAnimation(animSet) - } - mainCircleAnim.setAnimationListener(object : Animation.AnimationListener { - override fun onAnimationEnd(p0: Animation?) { - Handler().postDelayed({ - startLoading() - }, (animDuration / 10).toLong()) - } + if (i == noOfTrailingDots - 1) { + animSet.setAnimationListener(object : Animation.AnimationListener { + override fun onAnimationEnd(p0: Animation?) { + Handler().postDelayed({ + startLoading() + }, animDelay.toLong()) + } - override fun onAnimationRepeat(p0: Animation?) { - } + override fun onAnimationStart(p0: Animation?) { + } - override fun onAnimationStart(p0: Animation?) { + override fun onAnimationRepeat(p0: Animation?) { + } + }) } - - }) - + } } private fun getRotateAnimation(): RotateAnimation { @@ -148,11 +147,14 @@ class TrailingCircularDotsLoader : LinearLayout, LoaderContract { return rotateAnim } - private fun getTrainlingAnim(delay: Int): AnimationSet { + private fun getTrainlingAnim(count: Int, delay: Int): AnimationSet { val animSet = AnimationSet(true) - val scaleAnim = ScaleAnimation(1.0f, 0.75f, 1.0f, 0.75f) - scaleAnim.duration = (animDuration / 2).toLong() + val scaleFactor: Float = 1.00f - (count.toFloat() / 20) + + val scaleAnim = ScaleAnimation(scaleFactor, scaleFactor, scaleFactor, scaleFactor, + Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f) + animSet.addAnimation(scaleAnim) val rotateAnim = RotateAnimation(0f, 360f, @@ -162,11 +164,10 @@ class TrailingCircularDotsLoader : LinearLayout, LoaderContract { animSet.addAnimation(rotateAnim) animSet.duration = animDuration.toLong() - animSet.fillAfter = true + animSet.fillAfter = false animSet.interpolator = AccelerateDecelerateInterpolator() animSet.startOffset = delay.toLong() - return animSet } } \ No newline at end of file From 1b49959fadefbaf370d7db05c636e8f996a1ab55 Mon Sep 17 00:00:00 2001 From: Suneet Agrawal Date: Fri, 27 Apr 2018 14:11:22 +0100 Subject: [PATCH 4/9] added attributes --- .../loaders/TrailingCircularDotsLoader.kt | 13 +++---------- dotsloader/src/main/res/values/attrs.xml | 9 +++++++++ 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/dotsloader/src/main/java/com/agrawalsuneet/dotsloader/loaders/TrailingCircularDotsLoader.kt b/dotsloader/src/main/java/com/agrawalsuneet/dotsloader/loaders/TrailingCircularDotsLoader.kt index ff9915b..7e88cef 100644 --- a/dotsloader/src/main/java/com/agrawalsuneet/dotsloader/loaders/TrailingCircularDotsLoader.kt +++ b/dotsloader/src/main/java/com/agrawalsuneet/dotsloader/loaders/TrailingCircularDotsLoader.kt @@ -22,7 +22,7 @@ class TrailingCircularDotsLoader : LinearLayout, LoaderContract { var BigCircleRadius: Int = 200 var animDuration: Int = 2000 - var animDelay: Int = animDuration / 5 + var animDelay: Int = animDuration / 10 private var calWidthHeight: Int = 0 private lateinit var mainCircle: CircleView @@ -82,13 +82,6 @@ class TrailingCircularDotsLoader : LinearLayout, LoaderContract { trailingCirclesArray = arrayOfNulls(noOfTrailingDots) for (i in 0 until noOfTrailingDots) { - /*var circleColor = 0 - when (i) { - 0, 3 -> circleColor = resources.getColor(android.R.color.holo_red_light) - 1, 4 -> circleColor = resources.getColor(android.R.color.holo_green_light) - 2, 5 -> circleColor = resources.getColor(android.R.color.holo_blue_light) - }*/ - val circle = CircleView(context, circleRadius, circleColor) relativeLayout.addView(circle) trailingCirclesArray[i] = circle @@ -141,7 +134,7 @@ class TrailingCircularDotsLoader : LinearLayout, LoaderContract { Animation.RELATIVE_TO_PARENT, 0.5f) rotateAnim.duration = animDuration.toLong() rotateAnim.fillAfter = true - rotateAnim.interpolator = AccelerateDecelerateInterpolator() + rotateAnim.interpolator = AccelerateInterpolator() rotateAnim.startOffset = (animDuration / 10).toLong() return rotateAnim @@ -165,7 +158,7 @@ class TrailingCircularDotsLoader : LinearLayout, LoaderContract { animSet.addAnimation(rotateAnim) animSet.duration = animDuration.toLong() animSet.fillAfter = false - animSet.interpolator = AccelerateDecelerateInterpolator() + animSet.interpolator = AccelerateInterpolator() animSet.startOffset = delay.toLong() return animSet diff --git a/dotsloader/src/main/res/values/attrs.xml b/dotsloader/src/main/res/values/attrs.xml index 679b20a..22cbb18 100644 --- a/dotsloader/src/main/res/values/attrs.xml +++ b/dotsloader/src/main/res/values/attrs.xml @@ -68,4 +68,13 @@ + + + + + + + + + \ No newline at end of file From 58ad5aab12b4b8a4ebbb99c879f5db6600519454 Mon Sep 17 00:00:00 2001 From: Suneet Agrawal Date: Fri, 27 Apr 2018 14:25:01 +0100 Subject: [PATCH 5/9] read value from attributes --- .../loaders/TrailingCircularDotsLoader.kt | 40 +++++++++++++------ dotsloader/src/main/res/values/attrs.xml | 2 +- 2 files changed, 28 insertions(+), 14 deletions(-) diff --git a/dotsloader/src/main/java/com/agrawalsuneet/dotsloader/loaders/TrailingCircularDotsLoader.kt b/dotsloader/src/main/java/com/agrawalsuneet/dotsloader/loaders/TrailingCircularDotsLoader.kt index 7e88cef..261ef7c 100644 --- a/dotsloader/src/main/java/com/agrawalsuneet/dotsloader/loaders/TrailingCircularDotsLoader.kt +++ b/dotsloader/src/main/java/com/agrawalsuneet/dotsloader/loaders/TrailingCircularDotsLoader.kt @@ -14,13 +14,12 @@ import com.agrawalsuneet.dotsloader.basicviews.LoaderContract class TrailingCircularDotsLoader : LinearLayout, LoaderContract { - var circleColor: Int = resources.getColor(R.color.loader_selected) + var dotsRadius: Int = 50 + var bigCircleRadius: Int = 200 + var circleColor: Int = resources.getColor(R.color.loader_selected) var noOfTrailingDots: Int = 6 - var circleRadius: Int = 50 - var BigCircleRadius: Int = 200 - var animDuration: Int = 2000 var animDelay: Int = animDuration / 10 @@ -45,13 +44,28 @@ class TrailingCircularDotsLoader : LinearLayout, LoaderContract { override fun initAttributes(attrs: AttributeSet) { + val typedArray = context.obtainStyledAttributes(attrs, R.styleable.TrailingCircularDotsLoader, 0, 0) + + this.dotsRadius = typedArray.getDimensionPixelSize(R.styleable.TrailingCircularDotsLoader_trailingcircular_dotsRadius, 50) + this.bigCircleRadius = typedArray.getDimensionPixelSize(R.styleable.TrailingCircularDotsLoader_trailingcircular_bigCircleRadius, 200) + + this.circleColor = typedArray.getColor(R.styleable.TrailingCircularDotsLoader_trailingcircular_dotsColor, + resources.getColor(R.color.loader_selected)) + + this.noOfTrailingDots = typedArray.getInt(R.styleable.TrailingCircularDotsLoader_trailingcircular_noOfTrailingDots, 6) + + + this.animDuration = typedArray.getInt(R.styleable.TrailingCircularDotsLoader_trailingcircular_animDuration, 2000) + this.animDelay = typedArray.getInt(R.styleable.TrailingCircularDotsLoader_trailingcircular_animDelay, animDuration / 10) + + typedArray.recycle() } override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { super.onMeasure(widthMeasureSpec, heightMeasureSpec) if (calWidthHeight == 0) { - calWidthHeight = (2 * BigCircleRadius) + (2 * circleRadius) + calWidthHeight = (2 * bigCircleRadius) + (2 * dotsRadius) } setMeasuredDimension(calWidthHeight, calWidthHeight) @@ -63,17 +77,17 @@ class TrailingCircularDotsLoader : LinearLayout, LoaderContract { this.gravity = Gravity.CENTER_HORIZONTAL - relativeLayout = RelativeLayout(context); + relativeLayout = RelativeLayout(context) relativeLayout.gravity = Gravity.CENTER_HORIZONTAL if (calWidthHeight == 0) { - calWidthHeight = (2 * BigCircleRadius) + (2 * circleRadius) + calWidthHeight = (2 * bigCircleRadius) + (2 * dotsRadius) } - var relParam = RelativeLayout.LayoutParams(calWidthHeight, calWidthHeight) + val relParam = RelativeLayout.LayoutParams(calWidthHeight, calWidthHeight) - mainCircle = CircleView(context, circleRadius, circleColor) + mainCircle = CircleView(context, dotsRadius, circleColor) relativeLayout.addView(mainCircle) this.addView(relativeLayout, relParam) @@ -82,7 +96,7 @@ class TrailingCircularDotsLoader : LinearLayout, LoaderContract { trailingCirclesArray = arrayOfNulls(noOfTrailingDots) for (i in 0 until noOfTrailingDots) { - val circle = CircleView(context, circleRadius, circleColor) + val circle = CircleView(context, dotsRadius, circleColor) relativeLayout.addView(circle) trailingCirclesArray[i] = circle } @@ -106,7 +120,7 @@ class TrailingCircularDotsLoader : LinearLayout, LoaderContract { mainCircle.startAnimation(mainCircleAnim) for (i in 1..noOfTrailingDots) { - val animSet = getTrainlingAnim(i, (animDuration / 10) + ((animDuration * i) / 20)) + val animSet = getTrainlingAnim(i, ((animDuration * (2 + i)) / 20)) trailingCirclesArray[i - 1]!!.startAnimation(animSet) if (i == noOfTrailingDots - 1) { @@ -134,7 +148,7 @@ class TrailingCircularDotsLoader : LinearLayout, LoaderContract { Animation.RELATIVE_TO_PARENT, 0.5f) rotateAnim.duration = animDuration.toLong() rotateAnim.fillAfter = true - rotateAnim.interpolator = AccelerateInterpolator() + rotateAnim.interpolator = AccelerateDecelerateInterpolator() rotateAnim.startOffset = (animDuration / 10).toLong() return rotateAnim @@ -158,7 +172,7 @@ class TrailingCircularDotsLoader : LinearLayout, LoaderContract { animSet.addAnimation(rotateAnim) animSet.duration = animDuration.toLong() animSet.fillAfter = false - animSet.interpolator = AccelerateInterpolator() + animSet.interpolator = AccelerateDecelerateInterpolator() animSet.startOffset = delay.toLong() return animSet diff --git a/dotsloader/src/main/res/values/attrs.xml b/dotsloader/src/main/res/values/attrs.xml index 22cbb18..1624e6b 100644 --- a/dotsloader/src/main/res/values/attrs.xml +++ b/dotsloader/src/main/res/values/attrs.xml @@ -73,7 +73,7 @@ - + From 28a7f37dfcd186cfa367a18702110b77a1d1ccb9 Mon Sep 17 00:00:00 2001 From: Suneet Agrawal Date: Fri, 27 Apr 2018 14:40:50 +0100 Subject: [PATCH 6/9] added using xml --- README.md | 49 +++++++++++++++++++ .../com/agrawalsuneet/loaders/MainActivity.kt | 34 ------------- .../layout/activity_main_trailingcirculer.xml | 10 +++- 3 files changed, 57 insertions(+), 36 deletions(-) diff --git a/README.md b/README.md index 319769d..bd4b579 100644 --- a/README.md +++ b/README.md @@ -28,6 +28,10 @@ ![RotatingCircularDotsLoader](https://user-images.githubusercontent.com/12999622/34453427-d9aa8294-ed4c-11e7-8b1d-fe98d0c2c3dc.gif) +### TrailingCircularDotsLoader +![circulardotsloader](https://user-images.githubusercontent.com/12999622/36224573-f274b956-11bf-11e8-8f97-e4c031959465.gif) + + Other loaders: [SVGLoader](https://github.com/agrawalsuneet/SVGLoadersPack-Android), [ClockLoader](https://github.com/agrawalsuneet/LoadersPack), [RippleLoader](https://github.com/agrawalsuneet/LoadersPack), [RotatingCircularSticksLoader](https://github.com/agrawalsuneet/LoadersPack), [CircularSticksLoader](https://github.com/agrawalsuneet/LoadersPack), [ZipZapLoader](https://github.com/agrawalsuneet/SquareLoadersPack-Android), [WaveLoader](https://github.com/agrawalsuneet/SquareLoadersPack-Android), [MusicPlayerLoader](https://github.com/agrawalsuneet/SquareLoadersPack-Android), [RotatingSquareLoader](https://github.com/agrawalsuneet/SquareLoadersPack-Android), [FourFoldLoader](https://github.com/agrawalsuneet/FourFoldLoader) ## How To use @@ -325,6 +329,51 @@ RotatingCircularDotsLoader loader = new RotatingCircularDotsLoader(this, containerLL.addView(loader); ``` +### TrailingCircularDotsLoader +##### Through XML +``` + +``` + +##### Through Code + +* Kotlin +``` +var cirLoader = CircularDotsLoader(this) + cirLoader.defaultColor = ContextCompat.getColor(this, R.color.blue_delfault) + cirLoader.selectedColor = ContextCompat.getColor(this, R.color.blue_selected) + cirLoader.bigCircleRadius = 120 + cirLoader.radius = 40 + cirLoader.animDur = 100 + cirLoader.firstShadowColor = ContextCompat.getColor(this, R.color.pink_selected) + cirLoader.secondShadowColor = ContextCompat.getColor(this, R.color.purple_selected) + cirLoader.showRunningShadow = true + + containerLL.addView(cirLoader) + +``` + +* Java +``` +CircularDotsLoader loader = new CircularDotsLoader(this); + loader.setDefaultColor(ContextCompat.getColor(this,R.color.blue_delfault)); + loader.setSelectedColor(ContextCompat.getColor(this,R.color.blue_selected)); + loader.setBigCircleRadius(80); + loader.setRadius(24); + loader.setAnimDur(300); + loader.setShowRunningShadow(true); + loader.setFirstShadowColor(ContextCompat.getColor(this, R.color.blue_selected)); + loader.setSecondShadowColor(ContextCompat.getColor(this, R.color.blue_delfault)); +``` + Please take a 2 mins survey to make this library better [here](https://goo.gl/forms/81Cf63sL2X1WhXHl2). It won't take more than 2 mins I promise :) or feel free to drop an email at agrawalsuneet@gmail.com if face any issue or require any additional functionality in it. ``` diff --git a/app/src/main/java/com/agrawalsuneet/loaders/MainActivity.kt b/app/src/main/java/com/agrawalsuneet/loaders/MainActivity.kt index 31eaaf2..605fa6f 100644 --- a/app/src/main/java/com/agrawalsuneet/loaders/MainActivity.kt +++ b/app/src/main/java/com/agrawalsuneet/loaders/MainActivity.kt @@ -3,12 +3,9 @@ package com.agrawalsuneet.loaders import android.os.Bundle import android.support.v4.content.ContextCompat import android.support.v7.app.AppCompatActivity -import android.view.animation.Animation import android.view.animation.DecelerateInterpolator import android.view.animation.LinearInterpolator -import android.view.animation.RotateAnimation import android.widget.LinearLayout -import android.widget.RelativeLayout import com.agrawalsuneet.dotsloader.loaders.* class MainActivity : AppCompatActivity() { @@ -34,41 +31,10 @@ class MainActivity : AppCompatActivity() { } private fun initTrailingCirculerDotsLoader() { - /*var loader = findViewById(R.id.trailingloaderRL) - var circle = findViewById(R.id.circleview) - - val layoutparams = circle.getLayoutParams() as RelativeLayout.LayoutParams - layoutparams.addRule(RelativeLayout.CENTER_HORIZONTAL) - circle.setLayoutParams(layoutparams)*/ - -// var rotateAnim = getRotateAnimation() -// -// loader.startAnimation(rotateAnim) - - - //var trailingLoader = findViewById(R.id.trailingloader) - - /* val layoutparams = trailingLoader.getLayoutParams() as RelativeLayout.LayoutParams - layoutparams.addRule(RelativeLayout.CENTER_HORIZONTAL) - mainCircle.setLayoutParams(layoutparams)*/ } - private fun getRotateAnimation(): RotateAnimation { - - val transAnim = RotateAnimation(0f, 360f, - Animation.RELATIVE_TO_SELF, 0.5f, - Animation.RELATIVE_TO_SELF, 0.5f) - transAnim.duration = 2000 - transAnim.fillAfter = true - transAnim.repeatCount = Animation.INFINITE - transAnim.repeatMode = Animation.RESTART - transAnim.interpolator = LinearInterpolator() - - return transAnim - } - private fun initRotatingCircularDotsLoader() { val loader = RotatingCircularDotsLoader(this, 20, 60, ContextCompat.getColor(this, R.color.red)) diff --git a/app/src/main/res/layout/activity_main_trailingcirculer.xml b/app/src/main/res/layout/activity_main_trailingcirculer.xml index ee0e6c5..09b9668 100644 --- a/app/src/main/res/layout/activity_main_trailingcirculer.xml +++ b/app/src/main/res/layout/activity_main_trailingcirculer.xml @@ -12,9 +12,15 @@ + android:layout_margin="16dp" + app:trailingcircular_animDelay="200" + app:trailingcircular_animDuration="1200" + app:trailingcircular_bigCircleRadius="40dp" + app:trailingcircular_dotsColor="@color/loader_selected" + app:trailingcircular_dotsRadius="11dp" + app:trailingcircular_noOfTrailingDots="5" /> + From 3af801f0557e3a27d4df3b530a8207c603bb8dc8 Mon Sep 17 00:00:00 2001 From: Suneet Agrawal Date: Fri, 27 Apr 2018 14:56:59 +0100 Subject: [PATCH 7/9] changed gradle version --- README.md | 41 ++++++++++--------- .../com/agrawalsuneet/loaders/MainActivity.kt | 11 +++++ .../loaders/MainActivityJava.java | 14 +++++++ .../layout/activity_main_trailingcirculer.xml | 4 +- dotsloader/build.gradle | 6 +-- .../loaders/TrailingCircularDotsLoader.kt | 8 ++++ 6 files changed, 59 insertions(+), 25 deletions(-) diff --git a/README.md b/README.md index bd4b579..46f2e9e 100644 --- a/README.md +++ b/README.md @@ -347,31 +347,32 @@ RotatingCircularDotsLoader loader = new RotatingCircularDotsLoader(this, * Kotlin ``` -var cirLoader = CircularDotsLoader(this) - cirLoader.defaultColor = ContextCompat.getColor(this, R.color.blue_delfault) - cirLoader.selectedColor = ContextCompat.getColor(this, R.color.blue_selected) - cirLoader.bigCircleRadius = 120 - cirLoader.radius = 40 - cirLoader.animDur = 100 - cirLoader.firstShadowColor = ContextCompat.getColor(this, R.color.pink_selected) - cirLoader.secondShadowColor = ContextCompat.getColor(this, R.color.purple_selected) - cirLoader.showRunningShadow = true +var trailingCircularDotsLoader = TrailingCircularDotsLoader( + this, + 24, + ContextCompat.getColor(this, android.R.color.holo_green_light), + 100, + 5) + .apply { + animDuration = 1200 + animDelay = 200 + } - containerLL.addView(cirLoader) - + containerLL.addView(trailingCircularDotsLoader) ``` * Java ``` -CircularDotsLoader loader = new CircularDotsLoader(this); - loader.setDefaultColor(ContextCompat.getColor(this,R.color.blue_delfault)); - loader.setSelectedColor(ContextCompat.getColor(this,R.color.blue_selected)); - loader.setBigCircleRadius(80); - loader.setRadius(24); - loader.setAnimDur(300); - loader.setShowRunningShadow(true); - loader.setFirstShadowColor(ContextCompat.getColor(this, R.color.blue_selected)); - loader.setSecondShadowColor(ContextCompat.getColor(this, R.color.blue_delfault)); +TrailingCircularDotsLoader trailingCircularDotsLoader = new TrailingCircularDotsLoader( + this, + 24, + ContextCompat.getColor(this, android.R.color.holo_green_light), + 100, + 5); + trailingCircularDotsLoader.setAnimDuration(1200); + trailingCircularDotsLoader.setAnimDelay(200); + + containerLL.addView(trailingCircularDotsLoader); ``` Please take a 2 mins survey to make this library better [here](https://goo.gl/forms/81Cf63sL2X1WhXHl2). diff --git a/app/src/main/java/com/agrawalsuneet/loaders/MainActivity.kt b/app/src/main/java/com/agrawalsuneet/loaders/MainActivity.kt index 605fa6f..3b7eca8 100644 --- a/app/src/main/java/com/agrawalsuneet/loaders/MainActivity.kt +++ b/app/src/main/java/com/agrawalsuneet/loaders/MainActivity.kt @@ -31,7 +31,18 @@ class MainActivity : AppCompatActivity() { } private fun initTrailingCirculerDotsLoader() { + var trailingCircularDotsLoader = TrailingCircularDotsLoader( + this, + 24, + ContextCompat.getColor(this, android.R.color.holo_green_light), + 100, + 5) + .apply { + animDuration = 1200 + animDelay = 200 + } + containerLL.addView(trailingCircularDotsLoader) } diff --git a/app/src/main/java/com/agrawalsuneet/loaders/MainActivityJava.java b/app/src/main/java/com/agrawalsuneet/loaders/MainActivityJava.java index 32ee2d6..ff02a9c 100644 --- a/app/src/main/java/com/agrawalsuneet/loaders/MainActivityJava.java +++ b/app/src/main/java/com/agrawalsuneet/loaders/MainActivityJava.java @@ -10,6 +10,7 @@ import com.agrawalsuneet.dotsloader.loaders.RotatingCircularDotsLoader; import com.agrawalsuneet.dotsloader.loaders.SlidingLoader; import com.agrawalsuneet.dotsloader.loaders.TashieLoader; +import com.agrawalsuneet.dotsloader.loaders.TrailingCircularDotsLoader; /** * Created by suneet on 9/22/17. @@ -59,5 +60,18 @@ protected void onCreate(@Nullable Bundle savedInstanceState) { loader.setAnimDuration(3000); containerLL.addView(loader); + + + //trailingCircularDotsLoader + TrailingCircularDotsLoader trailingCircularDotsLoader = new TrailingCircularDotsLoader( + this, + 24, + ContextCompat.getColor(this, android.R.color.holo_green_light), + 100, + 5); + trailingCircularDotsLoader.setAnimDuration(1200); + trailingCircularDotsLoader.setAnimDelay(200); + + containerLL.addView(trailingCircularDotsLoader); } } diff --git a/app/src/main/res/layout/activity_main_trailingcirculer.xml b/app/src/main/res/layout/activity_main_trailingcirculer.xml index 09b9668..d231f85 100644 --- a/app/src/main/res/layout/activity_main_trailingcirculer.xml +++ b/app/src/main/res/layout/activity_main_trailingcirculer.xml @@ -11,7 +11,7 @@ tools:context="com.agrawalsuneet.loaders.MainActivity"> - + app:trailingcircular_noOfTrailingDots="5" />--> diff --git a/dotsloader/build.gradle b/dotsloader/build.gradle index cdf3e3c..615fc50 100644 --- a/dotsloader/build.gradle +++ b/dotsloader/build.gradle @@ -20,7 +20,7 @@ buildscript { ext { PUBLISH_GROUP_ID = 'com.agrawalsuneet.androidlibs' PUBLISH_ARTIFACT_ID = 'dotsloader' - PUBLISH_VERSION = '0.8' + PUBLISH_VERSION = '0.9' } configurations { @@ -34,8 +34,8 @@ android { defaultConfig { minSdkVersion 16 targetSdkVersion 25 - versionCode 8 - versionName "0.8" + versionCode 9 + versionName "0.9" } buildTypes { release { diff --git a/dotsloader/src/main/java/com/agrawalsuneet/dotsloader/loaders/TrailingCircularDotsLoader.kt b/dotsloader/src/main/java/com/agrawalsuneet/dotsloader/loaders/TrailingCircularDotsLoader.kt index 261ef7c..f58e277 100644 --- a/dotsloader/src/main/java/com/agrawalsuneet/dotsloader/loaders/TrailingCircularDotsLoader.kt +++ b/dotsloader/src/main/java/com/agrawalsuneet/dotsloader/loaders/TrailingCircularDotsLoader.kt @@ -42,6 +42,14 @@ class TrailingCircularDotsLoader : LinearLayout, LoaderContract { initView() } + constructor(context: Context?, dotsRadius: Int, circleColor: Int, bigCircleRadius: Int, noOfTrailingDots: Int) : super(context) { + this.dotsRadius = dotsRadius + this.circleColor = circleColor + this.bigCircleRadius = bigCircleRadius + this.noOfTrailingDots = noOfTrailingDots + initView() + } + override fun initAttributes(attrs: AttributeSet) { val typedArray = context.obtainStyledAttributes(attrs, R.styleable.TrailingCircularDotsLoader, 0, 0) From 6dea9ce5e5133c5b96c941eb1b0c981a1ea83fa9 Mon Sep 17 00:00:00 2001 From: Suneet Agrawal Date: Fri, 27 Apr 2018 15:09:17 +0100 Subject: [PATCH 8/9] set layout for demo --- .../com/agrawalsuneet/loaders/MainActivity.kt | 2 +- .../layout/activity_main_trailingcirculer.xml | 63 +++++++++++++++++-- 2 files changed, 60 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/agrawalsuneet/loaders/MainActivity.kt b/app/src/main/java/com/agrawalsuneet/loaders/MainActivity.kt index 3b7eca8..70f8c75 100644 --- a/app/src/main/java/com/agrawalsuneet/loaders/MainActivity.kt +++ b/app/src/main/java/com/agrawalsuneet/loaders/MainActivity.kt @@ -27,7 +27,7 @@ class MainActivity : AppCompatActivity() { //initSlidongLoader() //initRotatingCircularDotsLoader() - initTrailingCirculerDotsLoader() + //initTrailingCirculerDotsLoader() } private fun initTrailingCirculerDotsLoader() { diff --git a/app/src/main/res/layout/activity_main_trailingcirculer.xml b/app/src/main/res/layout/activity_main_trailingcirculer.xml index d231f85..bd5c64a 100644 --- a/app/src/main/res/layout/activity_main_trailingcirculer.xml +++ b/app/src/main/res/layout/activity_main_trailingcirculer.xml @@ -10,17 +10,72 @@ android:orientation="vertical" tools:context="com.agrawalsuneet.loaders.MainActivity"> + + + + + + + + - + app:trailingcircular_noOfTrailingDots="6" /> + + From da163b30297a482f1d8e185fe0cbc7111a8c512f Mon Sep 17 00:00:00 2001 From: Suneet Agrawal Date: Fri, 27 Apr 2018 15:17:36 +0100 Subject: [PATCH 9/9] updated readme --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 46f2e9e..0ba4c13 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ ### TrailingCircularDotsLoader -![circulardotsloader](https://user-images.githubusercontent.com/12999622/36224573-f274b956-11bf-11e8-8f97-e4c031959465.gif) +![trailingcirculardotsloader](https://user-images.githubusercontent.com/12999622/39367184-f3bb706a-4a2d-11e8-9120-5027bbef2861.gif) Other loaders: [SVGLoader](https://github.com/agrawalsuneet/SVGLoadersPack-Android), [ClockLoader](https://github.com/agrawalsuneet/LoadersPack), [RippleLoader](https://github.com/agrawalsuneet/LoadersPack), [RotatingCircularSticksLoader](https://github.com/agrawalsuneet/LoadersPack), [CircularSticksLoader](https://github.com/agrawalsuneet/LoadersPack), [ZipZapLoader](https://github.com/agrawalsuneet/SquareLoadersPack-Android), [WaveLoader](https://github.com/agrawalsuneet/SquareLoadersPack-Android), [MusicPlayerLoader](https://github.com/agrawalsuneet/SquareLoadersPack-Android), [RotatingSquareLoader](https://github.com/agrawalsuneet/SquareLoadersPack-Android), [FourFoldLoader](https://github.com/agrawalsuneet/FourFoldLoader) @@ -37,7 +37,7 @@ Other loaders: [SVGLoader](https://github.com/agrawalsuneet/SVGLoadersPack-Andro ## How To use include below dependency in build.gradle of application and compile it ``` -compile 'com.agrawalsuneet.androidlibs:dotsloader:0.8' +compile 'com.agrawalsuneet.androidlibs:dotsloader:0.9' ``` ### LinearDotsLoader