Skip to content

Commit 1b4457d

Browse files
committed
Merge pull request #20 from bmarrdev/Shadow
Implement DecoView shadow feature
2 parents 6ce9c4b + 917f7e4 commit 1b4457d

File tree

10 files changed

+127
-19
lines changed

10 files changed

+127
-19
lines changed

README.md

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ Step 1. Add the repositories into your build.gradle
2929
Step 2. Add the dependency in the form
3030

3131
dependencies {
32-
compile 'com.github.bmarrdev:android-DecoView-charting:v1.0.1'
32+
compile 'com.github.bmarrdev:android-DecoView-charting:v1.1'
3333
}
3434

3535

@@ -403,6 +403,34 @@ Note that in the example above the color uses transparency to give the edge of t
403403
404404
NOTE: On Android 4.0 to 4.3 Adding an EdgeDetail to a data series will result in Hardware acceleration being turned off for that DecoView. This is due to these platforms not supporting the clipPath() functions with hardware acceleration. It would be unusual for this cause any noticeable difference to the performance of the View.
405405
406+
Adding a shadow to a SeriesItem
407+
===
408+
409+
Shadows were introduced in DecoView 1.1, check you gradle dependency before adding shadows.
410+
411+
![Sample Shadow Image](https://github.com/bmarrdev/android-DecoView-charting/blob/master/art/shadow_example.png)
412+
413+
There are a couple of very important notes before adding shadows.
414+
415+
When creating a DecoView with shadows you must call ```java DecoView.disableHardwareAccelerationForDecoView();``` to disable hardware acceleration for the view. The shadow functionality built into the Android canvas operations are not supported with hardware acceleration. Please note that this may cause performance issues if you are animating multiple views concurrently.
416+
417+
If you are setting a shadow you will most likely want to also add the size of your shadow to the inset of the series item. The reason for this is the the decoView cannot draw outside of the given view canvas. If you don't inset your series then at the top and side edges of the view the shadow will be clipped.
418+
419+
420+
```java
421+
mDecoView = (DecoView) findViewById(R.id.dynamicArcView);
422+
mDecoView.disableHardwareAccelerationForDecoView();
423+
424+
final SeriesItem seriesItem = new SeriesItem.Builder(Color.parseColor("#FFFF8800"))
425+
.setRange(0, mSeriesMax, 0)
426+
.setInset(new PointF(30, 30))
427+
.setShadowSize(30)
428+
.setShadowColor(Color.DKGRAY)
429+
.setInitialVisibility(false)
430+
.build();
431+
```
432+
433+
406434

407435
Fitness tracker Sample
408436
===
@@ -428,7 +456,7 @@ Credits
428456
License
429457
===
430458

431-
Copyright 2015 Brent Marriott
459+
Copyright 2016 Brent Marriott
432460

433461
Licensed under the Apache License, Version 2.0 (the "License");
434462
you may not use this file except in compliance with the License.

app/app.iml

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -47,34 +47,39 @@
4747
<sourceFolder url="file://$MODULE_DIR$/src/debug/java" isTestSource="false" />
4848
<sourceFolder url="file://$MODULE_DIR$/src/debug/jni" isTestSource="false" />
4949
<sourceFolder url="file://$MODULE_DIR$/src/debug/rs" isTestSource="false" />
50+
<sourceFolder url="file://$MODULE_DIR$/src/debug/shaders" isTestSource="false" />
5051
<sourceFolder url="file://$MODULE_DIR$/src/testDebug/res" type="java-test-resource" />
5152
<sourceFolder url="file://$MODULE_DIR$/src/testDebug/resources" type="java-test-resource" />
5253
<sourceFolder url="file://$MODULE_DIR$/src/testDebug/assets" type="java-test-resource" />
5354
<sourceFolder url="file://$MODULE_DIR$/src/testDebug/aidl" isTestSource="true" />
5455
<sourceFolder url="file://$MODULE_DIR$/src/testDebug/java" isTestSource="true" />
5556
<sourceFolder url="file://$MODULE_DIR$/src/testDebug/jni" isTestSource="true" />
5657
<sourceFolder url="file://$MODULE_DIR$/src/testDebug/rs" isTestSource="true" />
58+
<sourceFolder url="file://$MODULE_DIR$/src/testDebug/shaders" isTestSource="true" />
5759
<sourceFolder url="file://$MODULE_DIR$/src/main/res" type="java-resource" />
5860
<sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
5961
<sourceFolder url="file://$MODULE_DIR$/src/main/assets" type="java-resource" />
6062
<sourceFolder url="file://$MODULE_DIR$/src/main/aidl" isTestSource="false" />
6163
<sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
6264
<sourceFolder url="file://$MODULE_DIR$/src/main/jni" isTestSource="false" />
6365
<sourceFolder url="file://$MODULE_DIR$/src/main/rs" isTestSource="false" />
64-
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/res" type="java-test-resource" />
65-
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/resources" type="java-test-resource" />
66-
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/assets" type="java-test-resource" />
67-
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/aidl" isTestSource="true" />
68-
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/java" isTestSource="true" />
69-
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/jni" isTestSource="true" />
70-
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/rs" isTestSource="true" />
66+
<sourceFolder url="file://$MODULE_DIR$/src/main/shaders" isTestSource="false" />
7167
<sourceFolder url="file://$MODULE_DIR$/src/test/res" type="java-test-resource" />
7268
<sourceFolder url="file://$MODULE_DIR$/src/test/resources" type="java-test-resource" />
7369
<sourceFolder url="file://$MODULE_DIR$/src/test/assets" type="java-test-resource" />
7470
<sourceFolder url="file://$MODULE_DIR$/src/test/aidl" isTestSource="true" />
7571
<sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
7672
<sourceFolder url="file://$MODULE_DIR$/src/test/jni" isTestSource="true" />
7773
<sourceFolder url="file://$MODULE_DIR$/src/test/rs" isTestSource="true" />
74+
<sourceFolder url="file://$MODULE_DIR$/src/test/shaders" isTestSource="true" />
75+
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/res" type="java-test-resource" />
76+
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/resources" type="java-test-resource" />
77+
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/assets" type="java-test-resource" />
78+
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/aidl" isTestSource="true" />
79+
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/java" isTestSource="true" />
80+
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/jni" isTestSource="true" />
81+
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/rs" isTestSource="true" />
82+
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/shaders" isTestSource="true" />
7883
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/assets" />
7984
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/blame" />
8085
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/bundles" />
@@ -85,12 +90,14 @@
8590
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/com.android.support/support-v4/23.3.0/jars" />
8691
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/com.android.support/support-vector-drawable/23.3.0/jars" />
8792
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/incremental" />
93+
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/incremental-safeguard" />
8894
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/instant-run-support" />
8995
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/jniLibs" />
9096
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/manifests" />
9197
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/pre-dexed" />
9298
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/res" />
9399
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/rs" />
100+
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/shaders" />
94101
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/symbols" />
95102
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/transforms" />
96103
<excludeFolder url="file://$MODULE_DIR$/build/outputs" />

app/src/main/java/com/hookedonplay/decoviewsample/SampleFitFragment.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ protected void setupEvents() {
142142
.setDuration(2000)
143143
.build());
144144
} else {
145-
decoView.addEvent(new DecoEvent.Builder(DecoDrawEffect.EffectType.EFFECT_SPIRAL_OUT_FILL)
145+
decoView.addEvent(new DecoEvent.Builder(DecoEvent.EventType.EVENT_SHOW, true)
146146
.setIndex(mBackIndex)
147147
.setDuration(3000)
148148
.build());

app/src/main/java/com/hookedonplay/decoviewsample/SamplePauseFragment.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,10 @@ protected void createTracks() {
5555
decoView.executeReset();
5656
decoView.deleteAll();
5757

58+
// Important: As we are going to use shadows on this DecoView, we must disable hardware
59+
// acceleration or the shadow will not render.
60+
decoView.disableHardwareAccelerationForDecoView();
61+
5862
final float seriesMax = 100f;
5963

6064
float circleInset = getDimension(18);
@@ -66,9 +70,15 @@ protected void createTracks() {
6670

6771
mPieIndex = decoView.addSeries(seriesBack1Item);
6872

69-
SeriesItem series1Item = new SeriesItem.Builder(COLOR_YELLOW)
73+
// Note: As we are placing a shadow on this view we are insetting it by the amount of the
74+
// shadow. This is because otherwise at the center of the top and side edge the shadow
75+
// will render outside the bounds of the view.
76+
SeriesItem series1Item = new SeriesItem.Builder(Color.parseColor("#FFFFC107"))
7077
.setRange(0, seriesMax, 0)
7178
.setLineWidth(getDimension(36))
79+
.setInset(new PointF(getDimension(8f), getDimension(8f)))
80+
.setShadowSize(getDimension(8f))
81+
.setShadowColor(Color.BLACK)
7282
.setInterpolator(new LinearInterpolator())
7383
.build();
7484

art/shadow_example.png

18.3 KB
Loading

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ buildscript {
55
jcenter()
66
}
77
dependencies {
8-
classpath 'com.android.tools.build:gradle:2.0.0'
8+
classpath 'com.android.tools.build:gradle:2.1.0'
99

1010
// NOTE: Do not place your application dependencies here; they belong
1111
// in the individual module build.gradle files

decoviewlib/decoviewlib.iml

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -48,45 +48,52 @@
4848
<sourceFolder url="file://$MODULE_DIR$/src/debug/java" isTestSource="false" />
4949
<sourceFolder url="file://$MODULE_DIR$/src/debug/jni" isTestSource="false" />
5050
<sourceFolder url="file://$MODULE_DIR$/src/debug/rs" isTestSource="false" />
51+
<sourceFolder url="file://$MODULE_DIR$/src/debug/shaders" isTestSource="false" />
5152
<sourceFolder url="file://$MODULE_DIR$/src/testDebug/res" type="java-test-resource" />
5253
<sourceFolder url="file://$MODULE_DIR$/src/testDebug/resources" type="java-test-resource" />
5354
<sourceFolder url="file://$MODULE_DIR$/src/testDebug/assets" type="java-test-resource" />
5455
<sourceFolder url="file://$MODULE_DIR$/src/testDebug/aidl" isTestSource="true" />
5556
<sourceFolder url="file://$MODULE_DIR$/src/testDebug/java" isTestSource="true" />
5657
<sourceFolder url="file://$MODULE_DIR$/src/testDebug/jni" isTestSource="true" />
5758
<sourceFolder url="file://$MODULE_DIR$/src/testDebug/rs" isTestSource="true" />
59+
<sourceFolder url="file://$MODULE_DIR$/src/testDebug/shaders" isTestSource="true" />
5860
<sourceFolder url="file://$MODULE_DIR$/src/main/res" type="java-resource" />
5961
<sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
6062
<sourceFolder url="file://$MODULE_DIR$/src/main/assets" type="java-resource" />
6163
<sourceFolder url="file://$MODULE_DIR$/src/main/aidl" isTestSource="false" />
6264
<sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
6365
<sourceFolder url="file://$MODULE_DIR$/src/main/jni" isTestSource="false" />
6466
<sourceFolder url="file://$MODULE_DIR$/src/main/rs" isTestSource="false" />
65-
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/res" type="java-test-resource" />
66-
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/resources" type="java-test-resource" />
67-
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/assets" type="java-test-resource" />
68-
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/aidl" isTestSource="true" />
69-
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/java" isTestSource="true" />
70-
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/jni" isTestSource="true" />
71-
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/rs" isTestSource="true" />
67+
<sourceFolder url="file://$MODULE_DIR$/src/main/shaders" isTestSource="false" />
7268
<sourceFolder url="file://$MODULE_DIR$/src/test/res" type="java-test-resource" />
7369
<sourceFolder url="file://$MODULE_DIR$/src/test/resources" type="java-test-resource" />
7470
<sourceFolder url="file://$MODULE_DIR$/src/test/assets" type="java-test-resource" />
7571
<sourceFolder url="file://$MODULE_DIR$/src/test/aidl" isTestSource="true" />
7672
<sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
7773
<sourceFolder url="file://$MODULE_DIR$/src/test/jni" isTestSource="true" />
7874
<sourceFolder url="file://$MODULE_DIR$/src/test/rs" isTestSource="true" />
75+
<sourceFolder url="file://$MODULE_DIR$/src/test/shaders" isTestSource="true" />
76+
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/res" type="java-test-resource" />
77+
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/resources" type="java-test-resource" />
78+
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/assets" type="java-test-resource" />
79+
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/aidl" isTestSource="true" />
80+
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/java" isTestSource="true" />
81+
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/jni" isTestSource="true" />
82+
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/rs" isTestSource="true" />
83+
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/shaders" isTestSource="true" />
7984
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/annotations" />
8085
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/assets" />
8186
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/blame" />
8287
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/bundles" />
8388
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/classes" />
8489
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/dependency-cache" />
8590
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/incremental" />
91+
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/incremental-safeguard" />
8692
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/jniLibs" />
8793
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/lint" />
8894
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/res" />
8995
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/rs" />
96+
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/shaders" />
9097
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/symbols" />
9198
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/transforms" />
9299
<excludeFolder url="file://$MODULE_DIR$/build/outputs" />

decoviewlib/src/main/java/com/hookedonplay/decoviewlib/DecoView.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -655,6 +655,17 @@ public void enableCompatibilityMode() {
655655
}
656656
}
657657

658+
/**
659+
* Allows DecoView to draw drop shadows. This should be enabled if you plan on using the
660+
* feature SeriesItem.setShadowSize(float) to add a drop shadow on one or more of your arc
661+
* series. Calling this function need only be done once.
662+
*/
663+
public void disableHardwareAccelerationForDecoView() {
664+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
665+
setLayerType(LAYER_TYPE_SOFTWARE, null);
666+
}
667+
}
668+
658669
/**
659670
* Retrieve the {@link SeriesItem} based on the index
660671
*

decoviewlib/src/main/java/com/hookedonplay/decoviewlib/charts/ChartSeries.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -451,6 +451,10 @@ public void reset() {
451451
mPaint.setStrokeCap(mSeriesItem.getRoundCap() ? Paint.Cap.ROUND : Paint.Cap.BUTT);
452452
mPaint.setAntiAlias(true);
453453

454+
if (mSeriesItem.getShadowSize() > 0) {
455+
mPaint.setShadowLayer(mSeriesItem.getShadowSize(), 0, 0, mSeriesItem.getShadowColor());
456+
}
457+
454458
// We need to reset the bounds for the case we are drawing a gradient and need to recreate
455459
// based on the bounds
456460
mBounds = null;

decoviewlib/src/main/java/com/hookedonplay/decoviewlib/charts/SeriesItem.java

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,18 @@ public class SeriesItem {
110110
* Label for the data series
111111
*/
112112
private SeriesLabel mSeriesLabel;
113+
/**
114+
* Set the shadow size for the series. This is drawn as a fade around the series that goes from
115+
* the color set mShadowColor and fades for mShadowSize pixels until it is transparent
116+
*
117+
* IMPORTANT: If you set this you need to call DecoView.disableHardwareAccelerationForDecoView()
118+
* as drawing of this shadow cannot be done with hardware acceleration enabled
119+
*/
120+
private float mShadowSize;
121+
/**
122+
* Set the color of the shadow surrounding the series
123+
*/
124+
private int mShadowColor;
113125
/**
114126
* Provides optional callback functionality on progress update of animation
115127
*/
@@ -133,6 +145,8 @@ private SeriesItem(Builder builder) {
133145
mInset = builder.mInset;
134146
mEdgeDetail = builder.mEdgeDetail;
135147
mSeriesLabel = builder.mSeriesLabel;
148+
mShadowSize = builder.mShadowSize;
149+
mShadowColor = builder.mShadowColor;
136150
}
137151

138152
public int getColor() {
@@ -233,6 +247,22 @@ public SeriesLabel getSeriesLabel() {
233247
return mSeriesLabel;
234248
}
235249

250+
public void setShadowSize(float shadowSize) {
251+
mShadowSize = shadowSize;
252+
}
253+
254+
public float getShadowSize() {
255+
return mShadowSize;
256+
}
257+
258+
public void setShadowColor(int shadowColor) {
259+
mShadowColor = shadowColor;
260+
}
261+
262+
public int getShadowColor() {
263+
return mShadowColor;
264+
}
265+
236266
/**
237267
* Set a listener to get notification of completion of animation
238268
*
@@ -284,6 +314,8 @@ public static class Builder {
284314
private PointF mInset;
285315
private ArrayList<EdgeDetail> mEdgeDetail;
286316
private SeriesLabel mSeriesLabel;
317+
private float mShadowSize = 0f;
318+
private int mShadowColor = Color.BLACK;
287319

288320
public Builder(int color) {
289321
mColor = color;
@@ -384,6 +416,15 @@ public Builder setSeriesLabel(@Nullable SeriesLabel seriesLabel) {
384416
return this;
385417
}
386418

419+
public Builder setShadowSize(float shadowSize) {
420+
mShadowSize = shadowSize;
421+
return this;
422+
}
423+
424+
public Builder setShadowColor(int shadowColor) {
425+
mShadowColor = shadowColor;
426+
return this;
427+
}
387428
/**
388429
* Creates a {@link SeriesItem} with the arguments supplied to this builder.
389430
*/

0 commit comments

Comments
 (0)