1- package com.github.nikartm.support ;
2-
3- import android.animation.Animator;
4- import android.animation.AnimatorListenerAdapter;
5- import android.animation.ValueAnimator;
6- import android.graphics.Canvas;
7- import android.graphics.ColorFilter;
8- import android.graphics.LinearGradient;
9- import android.graphics.Paint;
10- import android.graphics.PixelFormat;
11- import android.graphics.Rect;
12- import android.graphics.RectF;
13- import android.graphics.Shader;
14- import android.graphics.drawable.Drawable;
15- import androidx.annotation.NonNull;
16- import androidx.annotation.Nullable;
1+ package com.github.nikartm.support
2+
3+ import android.animation.ValueAnimator
4+ import android.graphics.*
5+ import android.graphics.drawable.Drawable
6+ import androidx.core.animation.doOnRepeat
177
188/* *
199 * Animated striped drawable
2010 * @author Ivan V on 30.03.2018.
21- * @version 1 .0
11+ * @version 2 .0
2212 */
23- public class AnimatedStripedDrawable extends Drawable {
24-
25- private int viewHeight;
26- private int viewWidth;
27- private float tiltLeft = 0f ;
28- private float tiltRight = 0f ;
29- private boolean running = false ;
30-
31- private StripedDrawable drawable;
32- private ValueAnimator animator;
33- private Shader stripesShader;
34-
35- public AnimatedStripedDrawable (StripedDrawable drawable) {
36- this .drawable = drawable;
37- }
38-
39- @Override
40- protected void onBoundsChange(Rect bounds) {
41- super .onBoundsChange(bounds);
42- viewHeight = bounds.height();
43- viewWidth = bounds.width();
44- adjustStripes();
13+ internal class AnimatedStripedDrawable (private val stripedDrawable : StripedDrawable ) : Drawable() {
14+
15+ private var viewHeight = 0
16+ private var viewWidth = 0
17+ private var tiltLeft = 0f
18+ private var tiltRight = 0f
19+ private var animator: ValueAnimator ? = null
20+ private var stripesShader: Shader ? = null
21+
22+ override fun onBoundsChange (bounds : Rect ) {
23+ super .onBoundsChange(bounds)
24+ with (bounds) {
25+ viewHeight = height()
26+ viewWidth = width()
27+ }
28+ adjustStripes()
4529 }
4630
47- private void adjustStripes() {
48- if (! drawable.isStripeRevert()) {
49- tiltLeft = drawable.getTilt();
50- tiltRight = 0 ;
51- } else {
52- tiltRight = drawable.getTilt();
53- tiltLeft = 0 ;
54- }
31+ private fun adjustStripes () = with (stripedDrawable) {
32+ tiltLeft = if (! isStripeRevert) tilt else 0f
33+ tiltRight = if (isStripeRevert) tilt else 0f
5534 }
5635
57- private void initAnimator() {
36+ private fun initAnimator () = with (stripedDrawable ) {
5837 if (animator == null ) {
59- animator = ValueAnimator .ofInt(0 , 1 );
60- animator.setRepeatCount(ValueAnimator .INFINITE );
61- animator.setDuration(drawable.getStripeDuration());
62- animator.addListener(new AnimatorListenerAdapter () {
63- @Override
64- public void onAnimationRepeat(Animator animation) {
65- shiftColor(drawable.getColorMain(), drawable.getColorSub());
66- invalidateSelf();
38+ animator = ValueAnimator .ofInt(0 , 1 ).apply {
39+ repeatCount = ValueAnimator .INFINITE
40+ duration = stripeDuration.toLong()
41+ doOnRepeat {
42+ shiftColor(colorMain, colorSub)
43+ invalidateSelf()
6744 }
68- });
45+ }
6946 }
7047 }
7148
72- @Override
73- public int getIntrinsicWidth() {
74- return viewWidth > 0 ? viewWidth : super .getIntrinsicWidth();
49+ override fun getIntrinsicWidth (): Int {
50+ return if (viewWidth > 0 ) viewWidth else super .getIntrinsicWidth()
7551 }
7652
77- @Override
78- public int getIntrinsicHeight() {
79- return viewHeight > 0 ? viewHeight : super .getIntrinsicHeight();
53+ override fun getIntrinsicHeight (): Int {
54+ return if (viewHeight > 0 ) viewHeight else super .getIntrinsicHeight()
8055 }
8156
82- @Override
83- public void setAlpha(int alpha) {}
57+ override fun setAlpha (alpha : Int ) {}
8458
85- @Override
86- public void setColorFilter(@Nullable ColorFilter colorFilter) {}
59+ override fun setColorFilter (colorFilter : ColorFilter ? ) {}
8760
88- @Override
89- public int getOpacity() {
90- return PixelFormat .TRANSLUCENT ;
91- }
61+ override fun getOpacity (): Int = PixelFormat .TRANSLUCENT
9262
93- @Override
94- public void draw(@NonNull Canvas canvas) {
95- drawStripes(canvas);
96- startStripesAnimation();
63+ override fun draw (canvas : Canvas ) {
64+ drawStripes(canvas)
65+ startStripesAnimation()
9766 }
9867
99- private void startStripesAnimation() {
100- if (running) {
101- start();
102- } else {
103- drawable.setShowStripes(false );
104- }
68+ private fun startStripesAnimation () {
69+ if (isRunning()) start() else stop()
10570 }
10671
107- private void drawStripes(Canvas canvas) {
108- final Paint paintBack = new Paint (Paint .ANTI_ALIAS_FLAG );
109- final Paint paintStripes = new Paint (Paint .ANTI_ALIAS_FLAG );
110- final Rect rect = new Rect (0 , 0 , viewWidth, viewHeight);
111- final RectF rectF = new RectF (rect);
112- final int stripesAlpha = Util .computeAlpha(drawable.getStripeAlpha());
113-
114- if (drawable.isStripeGradient()) {
115- stripesShader = createGradientShader();
116- } else {
117- stripesShader = createShader();
118- }
119-
120- paintBack.setColor(drawable.getColorBack());
121- float cornerRadius = drawable.getCornerRadius();
122- canvas.drawRoundRect(rectF, cornerRadius, cornerRadius, paintBack);
123-
124- if (drawable.isShowStripes()) {
125- paintStripes.setAlpha(stripesAlpha);
126- paintStripes.setShader(stripesShader);
127- canvas.drawRoundRect(rectF, cornerRadius, cornerRadius, paintStripes);
72+ private fun drawStripes (canvas : Canvas ) = with (stripedDrawable) {
73+ val paintBack = Paint (Paint .ANTI_ALIAS_FLAG )
74+ val paintStripes = Paint (Paint .ANTI_ALIAS_FLAG )
75+ val rect = Rect (0 , 0 , viewWidth, viewHeight)
76+ val rectF = RectF (rect)
77+ val stripesAlpha = Util .computeAlpha(stripeAlpha)
78+ stripesShader = if (isStripeGradient) createGradientShader() else createShader()
79+ paintBack.color = colorBack
80+ val cornerRadius = cornerRadius
81+ canvas.drawRoundRect(rectF, cornerRadius, cornerRadius, paintBack)
82+ if (isShowStripes) {
83+ paintStripes.alpha = stripesAlpha
84+ paintStripes.shader = stripesShader
85+ canvas.drawRoundRect(rectF, cornerRadius, cornerRadius, paintStripes)
12886 }
12987 }
13088
131- @NonNull
132- private LinearGradient createShader() {
133- return new LinearGradient (drawable.getStripeWidth(), tiltLeft, 0 , tiltRight,
134- new int[] { drawable.getColorMain(), drawable.getColorSub() }, new float[] { .5f , .5f },
135- Shader .TileMode .REPEAT );
89+ private fun createShader (): LinearGradient = with (stripedDrawable) {
90+ val position = .5f
91+ return LinearGradient (
92+ stripeWidth,
93+ tiltLeft,
94+ 0f ,
95+ tiltRight,
96+ intArrayOf(colorMain, colorSub),
97+ floatArrayOf(position, position),
98+ Shader .TileMode .REPEAT
99+ )
136100 }
137101
138- @NonNull
139- private LinearGradient createGradientShader() {
140- return new LinearGradient (drawable.getStripeWidth(), tiltLeft, 0 , tiltRight,
141- drawable.getColorMain(), drawable.getColorSub(), Shader .TileMode .REPEAT );
102+ private fun createGradientShader (): LinearGradient = with (stripedDrawable) {
103+ return LinearGradient (
104+ stripeWidth, tiltLeft, 0f , tiltRight,
105+ colorMain, colorSub, Shader .TileMode .REPEAT
106+ )
142107 }
143108
144- private void shiftColor(int mainColor, int subColor) {
145- drawable.setColorMain( subColor);
146- drawable.setColorSub( mainColor);
109+ private fun shiftColor (mainColor : Int , subColor : Int ) = with (stripedDrawable ) {
110+ colorMain = subColor
111+ colorSub = mainColor
147112 }
148113
149114 // Start stripes animation
150- protected void start() {
151- if (isRunning()) {
152- return ;
153- }
154- running = true ;
155- initAnimator();
156- animator.start();
157- drawable.setShowStripes(true );
158- invalidateSelf();
115+ fun start () {
116+ if (isRunning()) return
117+ initAnimator()
118+ animator?.start()
119+ stripedDrawable.isShowStripes = true
120+ invalidateSelf()
159121 }
160122
161123 // Stop stripes animation
162- protected void stop() {
163- if (! isRunning()) {
164- return ;
165- }
166- running = false ;
167- animator.cancel();
168- drawable.setShowStripes(false );
169- invalidateSelf();
124+ fun stop () {
125+ if (! isRunning()) return
126+ animator?.cancel()
127+ animator = null
128+ stripedDrawable.isShowStripes = false
129+ invalidateSelf()
170130 }
171131
172132 // Check if stripes animation running
173- protected boolean isRunning() {
174- return animator != null && animator.isStarted();
133+ fun isRunning (): Boolean {
134+ return animator?.isStarted == true
175135 }
176-
177- }
136+ }
0 commit comments