diff --git a/app/build.gradle.kts b/app/build.gradle.kts index b0bf45e..c492ec7 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -40,7 +40,7 @@ android { dependencies { implementation(project(":snowfall")) - implementation(project(":circlePoints")) + implementation(project(":customLoadingViews")) implementation ("androidx.core:core-ktx:1.12.0") implementation ("androidx.appcompat:appcompat:1.6.1") implementation ("com.google.android.material:material:1.9.0") diff --git a/app/src/main/res/layout/fragment_progress_view.xml b/app/src/main/res/layout/fragment_progress_view.xml index 1f67973..085a13f 100644 --- a/app/src/main/res/layout/fragment_progress_view.xml +++ b/app/src/main/res/layout/fragment_progress_view.xml @@ -10,9 +10,18 @@ android:layout_width="match_parent" android:layout_height="match_parent"> - + + + + + + + + + + package="com.apprajapati.loadingviews"> diff --git a/circlePoints/src/main/java/com/apprajapati/circlepoints/CirclePointsView.kt b/customLoadingViews/src/main/java/com/apprajapati/loadingviews/CirclePointsView.kt similarity index 99% rename from circlePoints/src/main/java/com/apprajapati/circlepoints/CirclePointsView.kt rename to customLoadingViews/src/main/java/com/apprajapati/loadingviews/CirclePointsView.kt index adeffb4..9793401 100644 --- a/circlePoints/src/main/java/com/apprajapati/circlepoints/CirclePointsView.kt +++ b/customLoadingViews/src/main/java/com/apprajapati/loadingviews/CirclePointsView.kt @@ -1,4 +1,4 @@ -package com.apprajapati.circlepoints +package com.apprajapati.loadingviews import android.content.Context import android.graphics.Canvas diff --git a/customLoadingViews/src/main/java/com/apprajapati/loadingviews/CircularLoadingView.kt b/customLoadingViews/src/main/java/com/apprajapati/loadingviews/CircularLoadingView.kt new file mode 100644 index 0000000..e84d1ce --- /dev/null +++ b/customLoadingViews/src/main/java/com/apprajapati/loadingviews/CircularLoadingView.kt @@ -0,0 +1,107 @@ +package com.apprajapati.loadingviews + +import android.animation.PropertyValuesHolder +import android.animation.ValueAnimator +import android.content.Context +import android.graphics.Canvas +import android.graphics.Color +import android.graphics.Paint +import android.graphics.PointF +import android.graphics.RectF +import android.util.AttributeSet +import android.view.View +import android.view.animation.DecelerateInterpolator + +class CircularLoadingView(context: Context, attributeSet: AttributeSet) : View(context, attributeSet), Runnable{ + + private val centerXY= PointF(0f, 0f) + private val mCirclePaint = Paint().apply{ + isAntiAlias = true + style = Paint.Style.STROKE //stroke will make one layer only, fill will draw a filled circle. + color = Color.BLACK + strokeWidth = 10f + } + + var minHeight = 0f //Minimum height and width of the view. + get() = field + set(value) { + field = value //value can only be changed when that's above 100. + } + + val viewRect: RectF = RectF() + var radius = 0f + var outerCircleRadius = 0f + + var valueAnimator = ValueAnimator() + var fadeAnimator = ValueAnimator() + + override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec) + //centerXY.getCenterXY() //at this point in this method doesn't give the correct center points. + //viewRect.set(centerXY.x, centerXY.y, minHeight, minHeight) + outerCircleRadius = minHeight + } + + override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) { + super.onSizeChanged(w, h, oldw, oldh) + //Always pick the minimum value as a radius so full circle can be seen. + if(w < h){ + minHeight = w.toFloat().div(2)-5 + }else{ + minHeight = h.toFloat().div(2)-5 + } + + if(w == h){ + minHeight = w.toFloat().div(2)-5 + } + + mCirclePaint.strokeWidth = minHeight/8 + animateProgress() + } + + override fun onDraw(canvas: Canvas) { + centerXY.getCenterXY() + + canvas.drawCircle(centerXY.x, centerXY.y, radius, mCirclePaint) + } + + fun PointF.getCenterXY(){ + x = width.toFloat().div(2) //width/2).toFloat() + y = height.toFloat().div(2) //height/2).toFloat() + } + + fun animateProgress(){ + val valuesHolder= PropertyValuesHolder.ofFloat("progressValue", 0f, minHeight) + + val colorValues = PropertyValuesHolder.ofInt("colorValues", 0, 255) //0 being black and 255 being white. + + valueAnimator = ValueAnimator().apply { + setValues(valuesHolder, colorValues) + duration = 1200 + repeatCount = ValueAnimator.INFINITE + + interpolator = DecelerateInterpolator(2f) //10f does give some interesting effects + + addUpdateListener { + val colors = it.getAnimatedValue("colorValues") as Int + mCirclePaint.color = Color.rgb(colors, colors, colors) + + val percentage = it.getAnimatedValue("progressValue") as Float + radius = percentage + + invalidate() + } + } + + valueAnimator.start() + } + + + override fun onDetachedFromWindow() { + super.onDetachedFromWindow() + valueAnimator.end() + } + override fun run() { + TODO("Not yet implemented") + } +} \ No newline at end of file diff --git a/circlePoints/src/main/res/drawable/point_indicator.xml b/customLoadingViews/src/main/res/drawable/point_indicator.xml similarity index 100% rename from circlePoints/src/main/res/drawable/point_indicator.xml rename to customLoadingViews/src/main/res/drawable/point_indicator.xml diff --git a/circlePoints/src/main/res/values/attrs.xml b/customLoadingViews/src/main/res/values/attrs.xml similarity index 100% rename from circlePoints/src/main/res/values/attrs.xml rename to customLoadingViews/src/main/res/values/attrs.xml diff --git a/circlePoints/src/main/res/values/colors.xml b/customLoadingViews/src/main/res/values/colors.xml similarity index 100% rename from circlePoints/src/main/res/values/colors.xml rename to customLoadingViews/src/main/res/values/colors.xml diff --git a/circlePoints/src/main/res/values/strings.xml b/customLoadingViews/src/main/res/values/strings.xml similarity index 100% rename from circlePoints/src/main/res/values/strings.xml rename to customLoadingViews/src/main/res/values/strings.xml diff --git a/settings.gradle.kts b/settings.gradle.kts index 77b12e0..9d8a029 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -9,4 +9,4 @@ dependencyResolutionManagement { rootProject.name = "MyAnimations" include(":app") include(":snowfall") -include(":circlePoints") +include(":customLoadingViews")