From a50110e18a218782bc785bee61e99ff2dfe96740 Mon Sep 17 00:00:00 2001 From: Enrico Monese Date: Sat, 10 Mar 2018 19:21:27 +0100 Subject: [PATCH 1/5] Implement fading sides --- .../java/com/robinhood/spark/SparkView.java | 45 ++++++++++++++++++- spark/src/main/res/values/attrs.xml | 2 + 2 files changed, 45 insertions(+), 2 deletions(-) diff --git a/spark/src/main/java/com/robinhood/spark/SparkView.java b/spark/src/main/java/com/robinhood/spark/SparkView.java index 4a92c0d..1a3b3eb 100644 --- a/spark/src/main/java/com/robinhood/spark/SparkView.java +++ b/spark/src/main/java/com/robinhood/spark/SparkView.java @@ -22,10 +22,13 @@ import android.content.res.TypedArray; import android.database.DataSetObserver; import android.graphics.Canvas; +import android.graphics.Color; import android.graphics.CornerPathEffect; +import android.graphics.LinearGradient; import android.graphics.Paint; import android.graphics.Path; import android.graphics.RectF; +import android.graphics.Shader; import android.os.Build; import android.os.Handler; import android.support.annotation.ColorInt; @@ -104,6 +107,8 @@ public class SparkView extends View implements ScrubGestureDetector.ScrubListene private final Path sparkPath = new Path(); private final Path baseLinePath = new Path(); private final Path scrubLinePath = new Path(); + private final Path fadeLineLeftPath = new Path(); + private final Path fadeLineRightPath = new Path(); // adapter private SparkAdapter adapter; @@ -114,10 +119,13 @@ public class SparkView extends View implements ScrubGestureDetector.ScrubListene private Paint sparkFillPaint = new Paint(Paint.ANTI_ALIAS_FLAG); private Paint baseLinePaint = new Paint(Paint.ANTI_ALIAS_FLAG); private Paint scrubLinePaint = new Paint(Paint.ANTI_ALIAS_FLAG); + private Paint fadeLineLeftPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + private Paint fadeLineRightPaint = new Paint(Paint.ANTI_ALIAS_FLAG); private OnScrubListener scrubListener; private ScrubGestureDetector scrubGestureDetector; private Animator pathAnimator; private final RectF contentRect = new RectF(); + private float fadeLength; private List xPoints; private List yPoints; @@ -151,6 +159,7 @@ private void init(Context context, AttributeSet attrs, int defStyleAttr, int def fillColor = a.getColor(R.styleable.SparkView_spark_fillColor, 0); lineWidth = a.getDimension(R.styleable.SparkView_spark_lineWidth, 0); cornerRadius = a.getDimension(R.styleable.SparkView_spark_cornerRadius, 0); + fadeLength = a.getFloat(R.styleable.SparkView_spark_fadeLength, 0); // for backwards compatibility, set fill type based on spark_fill first, then overwrite if // new spark_fillType attribute is set @@ -190,6 +199,9 @@ private void init(Context context, AttributeSet attrs, int defStyleAttr, int def scrubLinePaint.setColor(scrubLineColor); scrubLinePaint.setStrokeCap(Paint.Cap.ROUND); + fadeLineLeftPaint.set(sparkLinePaint); + fadeLineRightPaint.set(sparkLinePaint); + final Handler handler = new Handler(); final float touchSlop = ViewConfiguration.get(context).getScaledTouchSlop(); scrubGestureDetector = new ScrubGestureDetector(this, handler, touchSlop); @@ -271,6 +283,21 @@ private void populatePath() { baseLinePath.lineTo(getWidth(), scaledBaseLine); } + fadeLineLeftPath.reset(); + fadeLineRightPath.reset(); + if(fadeLength > 0) { + final float firstY = scaleHelper.getY(adapter.getY(0)); + fadeLineLeftPath.moveTo(0, firstY); + fadeLineLeftPath.rLineTo(fadeLength, 0); + + final float lastY = scaleHelper.getY(adapter.getY(adapter.getCount() - 1)); + fadeLineRightPath.moveTo(contentRect.right, lastY); + fadeLineRightPath.rLineTo(fadeLength, 0); + + fadeLineLeftPaint.setShader(new LinearGradient(0,0, fadeLength, 0, Color.TRANSPARENT, lineColor, Shader.TileMode.CLAMP)); + fadeLineRightPaint.setShader(new LinearGradient(contentRect.right,0, contentRect.right + fadeLength, 0, lineColor, Color.TRANSPARENT, Shader.TileMode.CLAMP)); + } + renderPath.reset(); renderPath.addPath(sparkPath); @@ -391,6 +418,11 @@ protected void onDraw(Canvas canvas) { canvas.drawPath(renderPath, sparkLinePaint); canvas.drawPath(scrubLinePath, scrubLinePaint); + + if(fadeLength > 0) { + canvas.drawPath(fadeLineLeftPath, fadeLineLeftPaint); + canvas.drawPath(fadeLineRightPath, fadeLineRightPaint); + } } /** @@ -630,6 +662,15 @@ public void setBaseLinePaint(Paint baseLinePaint) { invalidate(); } + /** + * Set side fading amount, set 0 to disable fading + * @param length of faded line + */ + public void setFadeLength(float length) { + this.fadeLength = length; + invalidate(); + } + /** * Get the color of the scrub line */ @@ -842,9 +883,9 @@ private void updateContentRect() { if (contentRect == null) return; contentRect.set( - getPaddingStart(), + getPaddingStart() + fadeLength, getPaddingTop(), - getWidth() - getPaddingEnd(), + getWidth() - getPaddingEnd() - fadeLength, getHeight() - getPaddingBottom() ); } diff --git a/spark/src/main/res/values/attrs.xml b/spark/src/main/res/values/attrs.xml index 898ed0f..bc9ff66 100644 --- a/spark/src/main/res/values/attrs.xml +++ b/spark/src/main/res/values/attrs.xml @@ -25,6 +25,8 @@ + + From 33bc7bf2340e0064d46ea3083540317a83d7a9c5 Mon Sep 17 00:00:00 2001 From: Enrico Monese Date: Sun, 11 Mar 2018 18:31:42 +0100 Subject: [PATCH 2/5] Use dimension attr instead of float for fadeLength --- spark/src/main/java/com/robinhood/spark/SparkView.java | 2 +- spark/src/main/res/values/attrs.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/spark/src/main/java/com/robinhood/spark/SparkView.java b/spark/src/main/java/com/robinhood/spark/SparkView.java index 1a3b3eb..4ada5a0 100644 --- a/spark/src/main/java/com/robinhood/spark/SparkView.java +++ b/spark/src/main/java/com/robinhood/spark/SparkView.java @@ -159,7 +159,7 @@ private void init(Context context, AttributeSet attrs, int defStyleAttr, int def fillColor = a.getColor(R.styleable.SparkView_spark_fillColor, 0); lineWidth = a.getDimension(R.styleable.SparkView_spark_lineWidth, 0); cornerRadius = a.getDimension(R.styleable.SparkView_spark_cornerRadius, 0); - fadeLength = a.getFloat(R.styleable.SparkView_spark_fadeLength, 0); + fadeLength = a.getDimension(R.styleable.SparkView_spark_fadeLength, 0); // for backwards compatibility, set fill type based on spark_fill first, then overwrite if // new spark_fillType attribute is set diff --git a/spark/src/main/res/values/attrs.xml b/spark/src/main/res/values/attrs.xml index bc9ff66..e3e15bb 100644 --- a/spark/src/main/res/values/attrs.xml +++ b/spark/src/main/res/values/attrs.xml @@ -25,7 +25,7 @@ - + From 6c24148c9fe6c095dc24f5dc7c35fd65c03b9b8b Mon Sep 17 00:00:00 2001 From: Enrico Monese Date: Sun, 11 Mar 2018 18:32:30 +0100 Subject: [PATCH 3/5] Move fadeLength near other styleable values --- spark/src/main/java/com/robinhood/spark/SparkView.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spark/src/main/java/com/robinhood/spark/SparkView.java b/spark/src/main/java/com/robinhood/spark/SparkView.java index 4ada5a0..c8d97e1 100644 --- a/spark/src/main/java/com/robinhood/spark/SparkView.java +++ b/spark/src/main/java/com/robinhood/spark/SparkView.java @@ -101,6 +101,7 @@ public class SparkView extends View implements ScrubGestureDetector.ScrubListene private float scrubLineWidth; private boolean scrubEnabled; private SparkAnimator sparkAnimator; + private float fadeLength; // the onDraw data private final Path renderPath = new Path(); @@ -125,7 +126,6 @@ public class SparkView extends View implements ScrubGestureDetector.ScrubListene private ScrubGestureDetector scrubGestureDetector; private Animator pathAnimator; private final RectF contentRect = new RectF(); - private float fadeLength; private List xPoints; private List yPoints; From 27bd0248986d8cf1749034d2132a267b3ee08ccb Mon Sep 17 00:00:00 2001 From: Enrico Monese Date: Sun, 11 Mar 2018 19:02:10 +0100 Subject: [PATCH 4/5] Better fade color --- spark/src/main/java/com/robinhood/spark/SparkView.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/spark/src/main/java/com/robinhood/spark/SparkView.java b/spark/src/main/java/com/robinhood/spark/SparkView.java index c8d97e1..3986780 100644 --- a/spark/src/main/java/com/robinhood/spark/SparkView.java +++ b/spark/src/main/java/com/robinhood/spark/SparkView.java @@ -126,6 +126,7 @@ public class SparkView extends View implements ScrubGestureDetector.ScrubListene private ScrubGestureDetector scrubGestureDetector; private Animator pathAnimator; private final RectF contentRect = new RectF(); + @ColorInt private int fadeColor; private List xPoints; private List yPoints; @@ -201,6 +202,7 @@ private void init(Context context, AttributeSet attrs, int defStyleAttr, int def fadeLineLeftPaint.set(sparkLinePaint); fadeLineRightPaint.set(sparkLinePaint); + fadeColor = Color.argb(0, Color.red(lineColor), Color.green(lineColor), Color.blue(lineColor)); final Handler handler = new Handler(); final float touchSlop = ViewConfiguration.get(context).getScaledTouchSlop(); @@ -294,7 +296,7 @@ private void populatePath() { fadeLineRightPath.moveTo(contentRect.right, lastY); fadeLineRightPath.rLineTo(fadeLength, 0); - fadeLineLeftPaint.setShader(new LinearGradient(0,0, fadeLength, 0, Color.TRANSPARENT, lineColor, Shader.TileMode.CLAMP)); + fadeLineLeftPaint.setShader(new LinearGradient(0,0, fadeLength, 0, fadeColor, lineColor, Shader.TileMode.CLAMP)); fadeLineRightPaint.setShader(new LinearGradient(contentRect.right,0, contentRect.right + fadeLength, 0, lineColor, Color.TRANSPARENT, Shader.TileMode.CLAMP)); } @@ -437,6 +439,7 @@ protected void onDraw(Canvas canvas) { */ public void setLineColor(@ColorInt int lineColor) { this.lineColor = lineColor; + this.fadeColor = Color.argb(0, Color.red(lineColor), Color.green(lineColor), Color.blue(lineColor)); sparkLinePaint.setColor(lineColor); invalidate(); } From 90453e631e9717f9dc779e53e37216ed8d1a04ee Mon Sep 17 00:00:00 2001 From: Enrico Monese Date: Sun, 11 Mar 2018 19:05:39 +0100 Subject: [PATCH 5/5] Actually use fadeColor on both sides --- spark/src/main/java/com/robinhood/spark/SparkView.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spark/src/main/java/com/robinhood/spark/SparkView.java b/spark/src/main/java/com/robinhood/spark/SparkView.java index 3986780..054bfaf 100644 --- a/spark/src/main/java/com/robinhood/spark/SparkView.java +++ b/spark/src/main/java/com/robinhood/spark/SparkView.java @@ -297,7 +297,7 @@ private void populatePath() { fadeLineRightPath.rLineTo(fadeLength, 0); fadeLineLeftPaint.setShader(new LinearGradient(0,0, fadeLength, 0, fadeColor, lineColor, Shader.TileMode.CLAMP)); - fadeLineRightPaint.setShader(new LinearGradient(contentRect.right,0, contentRect.right + fadeLength, 0, lineColor, Color.TRANSPARENT, Shader.TileMode.CLAMP)); + fadeLineRightPaint.setShader(new LinearGradient(contentRect.right,0, contentRect.right + fadeLength, 0, lineColor, fadeColor, Shader.TileMode.CLAMP)); } renderPath.reset();