From 7e6d8dcb96d9d16693de882c09ccd7bab1699a7e Mon Sep 17 00:00:00 2001 From: Brent Marriott Date: Tue, 19 Apr 2016 07:52:36 +1000 Subject: [PATCH 01/17] DrawArc with sweep of 0 differs by device Prevent drawArc being called with a sweep of 0 as on the Nexus 6P this draws a complete circle, every other device with Android 6.0 draws nothing. --- .../java/com/hookedonplay/decoviewlib/charts/ArcSeries.java | 3 +++ .../com/hookedonplay/decoviewlib/charts/LineArcSeries.java | 3 +++ 2 files changed, 6 insertions(+) diff --git a/decoviewlib/src/main/java/com/hookedonplay/decoviewlib/charts/ArcSeries.java b/decoviewlib/src/main/java/com/hookedonplay/decoviewlib/charts/ArcSeries.java index dc1c441..eb97e71 100644 --- a/decoviewlib/src/main/java/com/hookedonplay/decoviewlib/charts/ArcSeries.java +++ b/decoviewlib/src/main/java/com/hookedonplay/decoviewlib/charts/ArcSeries.java @@ -63,8 +63,11 @@ public boolean draw(Canvas canvas, RectF bounds) { if (mSeriesItem.getDrawAsPoint()) { mArcAngleStart = adjustDrawPointAngle(mArcAngleSweep); mArcAngleSweep = adjustSweepDirection(getMinSweepAngle()); + } else if (mArcAngleSweep == 0) { + return true; } + return false; } diff --git a/decoviewlib/src/main/java/com/hookedonplay/decoviewlib/charts/LineArcSeries.java b/decoviewlib/src/main/java/com/hookedonplay/decoviewlib/charts/LineArcSeries.java index 728034c..1dc19cd 100644 --- a/decoviewlib/src/main/java/com/hookedonplay/decoviewlib/charts/LineArcSeries.java +++ b/decoviewlib/src/main/java/com/hookedonplay/decoviewlib/charts/LineArcSeries.java @@ -53,6 +53,9 @@ public boolean draw(Canvas canvas, RectF bounds) { } protected void drawArc(@NonNull Canvas canvas) { + if (mArcAngleSweep == 0) { + return; + } canvas.drawArc(mBoundsInset, mArcAngleStart, mArcAngleSweep, From 486ca3addcd622eceb8ffbcb91b24e8a211ec89a Mon Sep 17 00:00:00 2001 From: Brent Marriott Date: Tue, 19 Apr 2016 07:53:17 +1000 Subject: [PATCH 02/17] Increment versionName to 1.0.1 versionCode to 8 --- decoviewlib/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/decoviewlib/build.gradle b/decoviewlib/build.gradle index 1678b6a..1a0383e 100644 --- a/decoviewlib/build.gradle +++ b/decoviewlib/build.gradle @@ -7,8 +7,8 @@ android { defaultConfig { minSdkVersion 8 targetSdkVersion 23 - versionCode 7 - versionName "1.0.0" + versionCode 8 + versionName "1.0.1" } buildTypes { release { From 272a2d87620ac44c5a8f9ae2e523d42742cc28a8 Mon Sep 17 00:00:00 2001 From: Brent Marriott Date: Tue, 19 Apr 2016 08:23:19 +1000 Subject: [PATCH 03/17] Increment version and build number --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 03bd154..172a01f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -7,8 +7,8 @@ android { applicationId 'com.hookedonplay.decoviewsample' minSdkVersion 8 targetSdkVersion 23 - versionCode 7 - versionName "1.0.0" + versionCode 8 + versionName "1.0.1" } buildTypes { release { From 6ce9c4bced4bce30f95b92a818ff27163c251832 Mon Sep 17 00:00:00 2001 From: Brent Date: Tue, 19 Apr 2016 08:37:51 +1000 Subject: [PATCH 04/17] Update gradle dependency to v1.0.1 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index cccc922..1bf9419 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ Step 1. Add the repositories into your build.gradle Step 2. Add the dependency in the form dependencies { - compile 'com.github.bmarrdev:android-DecoView-charting:v0.9.6' + compile 'com.github.bmarrdev:android-DecoView-charting:v1.0.1' } From 1b0999755a2706005fbfd5d57b4ac800e6c5a1d6 Mon Sep 17 00:00:00 2001 From: Brent Marriott Date: Mon, 2 May 2016 18:37:49 +1000 Subject: [PATCH 05/17] Implement shadows for SeriesItem Implement shadows the appear around SeriesItem. This is done using the Paint.setShadowLayer() feature, which will not work for canvas draw operations such as drawArc() when Hardware acceleration is enabled, which is the case on API 14+ by default. --- .../hookedonplay/decoviewlib/DecoView.java | 11 +++++ .../decoviewlib/charts/ChartSeries.java | 4 ++ .../decoviewlib/charts/SeriesItem.java | 41 +++++++++++++++++++ 3 files changed, 56 insertions(+) diff --git a/decoviewlib/src/main/java/com/hookedonplay/decoviewlib/DecoView.java b/decoviewlib/src/main/java/com/hookedonplay/decoviewlib/DecoView.java index eb57c9e..31a4a15 100644 --- a/decoviewlib/src/main/java/com/hookedonplay/decoviewlib/DecoView.java +++ b/decoviewlib/src/main/java/com/hookedonplay/decoviewlib/DecoView.java @@ -655,6 +655,17 @@ public void enableCompatibilityMode() { } } + /** + * Allows DecoView to draw drop shadows. This should be enabled if you plan on using the + * feature SeriesItem.setShadowSize(float) to add a drop shadow on one or more of your arc + * series. Calling this function need only be done once. + */ + public void disableHardwareAccelerationForDecoView() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { + setLayerType(LAYER_TYPE_SOFTWARE, null); + } + } + /** * Retrieve the {@link SeriesItem} based on the index * diff --git a/decoviewlib/src/main/java/com/hookedonplay/decoviewlib/charts/ChartSeries.java b/decoviewlib/src/main/java/com/hookedonplay/decoviewlib/charts/ChartSeries.java index ec957cc..3cf45a3 100644 --- a/decoviewlib/src/main/java/com/hookedonplay/decoviewlib/charts/ChartSeries.java +++ b/decoviewlib/src/main/java/com/hookedonplay/decoviewlib/charts/ChartSeries.java @@ -451,6 +451,10 @@ public void reset() { mPaint.setStrokeCap(mSeriesItem.getRoundCap() ? Paint.Cap.ROUND : Paint.Cap.BUTT); mPaint.setAntiAlias(true); + if (mSeriesItem.getShadowSize() > 0) { + mPaint.setShadowLayer(mSeriesItem.getShadowSize(), 0, 0, mSeriesItem.getShadowColor()); + } + // We need to reset the bounds for the case we are drawing a gradient and need to recreate // based on the bounds mBounds = null; diff --git a/decoviewlib/src/main/java/com/hookedonplay/decoviewlib/charts/SeriesItem.java b/decoviewlib/src/main/java/com/hookedonplay/decoviewlib/charts/SeriesItem.java index d4616ae..a20852a 100644 --- a/decoviewlib/src/main/java/com/hookedonplay/decoviewlib/charts/SeriesItem.java +++ b/decoviewlib/src/main/java/com/hookedonplay/decoviewlib/charts/SeriesItem.java @@ -110,6 +110,18 @@ public class SeriesItem { * Label for the data series */ private SeriesLabel mSeriesLabel; + /** + * Set the shadow size for the series. This is drawn as a fade around the series that goes from + * the color set mShadowColor and fades for mShadowSize pixels until it is transparent + * + * IMPORTANT: If you set this you need to call DecoView.disableHardwareAccelerationForDecoView() + * as drawing of this shadow cannot be done with hardware acceleration enabled + */ + private float mShadowSize; + /** + * Set the color of the shadow surrounding the series + */ + private int mShadowColor; /** * Provides optional callback functionality on progress update of animation */ @@ -133,6 +145,8 @@ private SeriesItem(Builder builder) { mInset = builder.mInset; mEdgeDetail = builder.mEdgeDetail; mSeriesLabel = builder.mSeriesLabel; + mShadowSize = builder.mShadowSize; + mShadowColor = builder.mShadowColor; } public int getColor() { @@ -233,6 +247,22 @@ public SeriesLabel getSeriesLabel() { return mSeriesLabel; } + public void setShadowSize(float shadowSize) { + mShadowSize = shadowSize; + } + + public float getShadowSize() { + return mShadowSize; + } + + public void setShadowColor(int shadowColor) { + mShadowColor = shadowColor; + } + + public int getShadowColor() { + return mShadowColor; + } + /** * Set a listener to get notification of completion of animation * @@ -284,6 +314,8 @@ public static class Builder { private PointF mInset; private ArrayList mEdgeDetail; private SeriesLabel mSeriesLabel; + private float mShadowSize = 0f; + private int mShadowColor = Color.BLACK; public Builder(int color) { mColor = color; @@ -384,6 +416,15 @@ public Builder setSeriesLabel(@Nullable SeriesLabel seriesLabel) { return this; } + public Builder setShadowSize(float shadowSize) { + mShadowSize = shadowSize; + return this; + } + + public Builder setShadowColor(int shadowColor) { + mShadowColor = shadowColor; + return this; + } /** * Creates a {@link SeriesItem} with the arguments supplied to this builder. */ From 82c93de8466202be5aa08207a5bafa74faca4f8b Mon Sep 17 00:00:00 2001 From: Brent Marriott Date: Mon, 9 May 2016 06:39:13 +1000 Subject: [PATCH 06/17] Update gradle to 2.1 --- app/app.iml | 21 ++++++++++++++------- build.gradle | 2 +- decoviewlib/decoviewlib.iml | 21 ++++++++++++++------- 3 files changed, 29 insertions(+), 15 deletions(-) diff --git a/app/app.iml b/app/app.iml index 15c4fcb..a42d7db 100644 --- a/app/app.iml +++ b/app/app.iml @@ -47,6 +47,7 @@ + @@ -54,6 +55,7 @@ + @@ -61,13 +63,7 @@ - - - - - - - + @@ -75,6 +71,15 @@ + + + + + + + + + @@ -85,12 +90,14 @@ + + diff --git a/build.gradle b/build.gradle index cb98401..f6e9073 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:2.0.0' + classpath 'com.android.tools.build:gradle:2.1.0' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files diff --git a/decoviewlib/decoviewlib.iml b/decoviewlib/decoviewlib.iml index f033181..5a37007 100644 --- a/decoviewlib/decoviewlib.iml +++ b/decoviewlib/decoviewlib.iml @@ -48,6 +48,7 @@ + @@ -55,6 +56,7 @@ + @@ -62,13 +64,7 @@ - - - - - - - + @@ -76,6 +72,15 @@ + + + + + + + + + @@ -83,10 +88,12 @@ + + From 471fcf7e40ab20065cb3c2dd41b36bf6ed5a7f4f Mon Sep 17 00:00:00 2001 From: Brent Marriott Date: Mon, 9 May 2016 07:19:44 +1000 Subject: [PATCH 07/17] Fade in background SeriesItem in Fit sample --- .../java/com/hookedonplay/decoviewsample/SampleFitFragment.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/hookedonplay/decoviewsample/SampleFitFragment.java b/app/src/main/java/com/hookedonplay/decoviewsample/SampleFitFragment.java index ff4d49b..d809bf6 100644 --- a/app/src/main/java/com/hookedonplay/decoviewsample/SampleFitFragment.java +++ b/app/src/main/java/com/hookedonplay/decoviewsample/SampleFitFragment.java @@ -142,7 +142,7 @@ protected void setupEvents() { .setDuration(2000) .build()); } else { - decoView.addEvent(new DecoEvent.Builder(DecoDrawEffect.EffectType.EFFECT_SPIRAL_OUT_FILL) + decoView.addEvent(new DecoEvent.Builder(DecoEvent.EventType.EVENT_SHOW, true) .setIndex(mBackIndex) .setDuration(3000) .build()); From 16eac7b958043c955c56dc1d74f9e3af4417ebcb Mon Sep 17 00:00:00 2001 From: Brent Marriott Date: Mon, 9 May 2016 07:22:09 +1000 Subject: [PATCH 08/17] Update SamplePauseFragment to add shadow Added a demonstration of applying a shadow to a DecoView SeriesItem. This includes disabling the hardware acceleration which is unsupported for shadows, and insetting the SeriesItem to prevent the shadow from attempting to render outside the bounds of the view --- .../decoviewsample/SamplePauseFragment.java | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/hookedonplay/decoviewsample/SamplePauseFragment.java b/app/src/main/java/com/hookedonplay/decoviewsample/SamplePauseFragment.java index 8465127..c304fcb 100644 --- a/app/src/main/java/com/hookedonplay/decoviewsample/SamplePauseFragment.java +++ b/app/src/main/java/com/hookedonplay/decoviewsample/SamplePauseFragment.java @@ -55,6 +55,10 @@ protected void createTracks() { decoView.executeReset(); decoView.deleteAll(); + // Important: As we are going to use shadows on this DecoView, we must disable hardware + // acceleration or the shadow will not render. + decoView.disableHardwareAccelerationForDecoView(); + final float seriesMax = 100f; float circleInset = getDimension(18); @@ -66,9 +70,15 @@ protected void createTracks() { mPieIndex = decoView.addSeries(seriesBack1Item); - SeriesItem series1Item = new SeriesItem.Builder(COLOR_YELLOW) + // Note: As we are placing a shadow on this view we are insetting it by the amount of the + // shadow. This is because otherwise at the center of the top and side edge the shadow + // will render outside the bounds of the view. + SeriesItem series1Item = new SeriesItem.Builder(Color.parseColor("#FFFFC107")) .setRange(0, seriesMax, 0) .setLineWidth(getDimension(36)) + .setInset(new PointF(getDimension(8f), getDimension(8f))) + .setShadowSize(getDimension(8f)) + .setShadowColor(Color.BLACK) .setInterpolator(new LinearInterpolator()) .build(); From 917f7e4cd3c50184d559b9d1c20cafca3ad0cfaf Mon Sep 17 00:00:00 2001 From: Brent Marriott Date: Mon, 9 May 2016 07:49:54 +1000 Subject: [PATCH 09/17] Update readme with new 1.1 features --- README.md | 32 ++++++++++++++++++++++++++++++-- art/shadow_example.png | Bin 0 -> 18773 bytes 2 files changed, 30 insertions(+), 2 deletions(-) create mode 100644 art/shadow_example.png diff --git a/README.md b/README.md index 1bf9419..77efc5d 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ Step 1. Add the repositories into your build.gradle Step 2. Add the dependency in the form dependencies { - compile 'com.github.bmarrdev:android-DecoView-charting:v1.0.1' + compile 'com.github.bmarrdev:android-DecoView-charting:v1.1' } @@ -403,6 +403,34 @@ Note that in the example above the color uses transparency to give the edge of t 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. +Adding a shadow to a SeriesItem +=== + +Shadows were introduced in DecoView 1.1, check you gradle dependency before adding shadows. + +![Sample Shadow Image](https://github.com/bmarrdev/android-DecoView-charting/blob/master/art/shadow_example.png) + +There are a couple of very important notes before adding shadows. + +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. + +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. + + +```java +mDecoView = (DecoView) findViewById(R.id.dynamicArcView); +mDecoView.disableHardwareAccelerationForDecoView(); + +final SeriesItem seriesItem = new SeriesItem.Builder(Color.parseColor("#FFFF8800")) + .setRange(0, mSeriesMax, 0) + .setInset(new PointF(30, 30)) + .setShadowSize(30) + .setShadowColor(Color.DKGRAY) + .setInitialVisibility(false) + .build(); +``` + + Fitness tracker Sample === @@ -428,7 +456,7 @@ Credits License === - Copyright 2015 Brent Marriott + Copyright 2016 Brent Marriott Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/art/shadow_example.png b/art/shadow_example.png new file mode 100644 index 0000000000000000000000000000000000000000..1b3dc406de1fa0faf4ad07db6d8b8ae9e88a18e9 GIT binary patch literal 18773 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 Date: Sun, 3 Jul 2016 13:30:59 +1000 Subject: [PATCH 10/17] On EFFECT_SHOW reveal Paint width may not yet be set, use the seriesItem object to get the width instead of Paint object. Github issue #22 --- .../java/com/hookedonplay/decoviewlib/charts/LineArcSeries.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/decoviewlib/src/main/java/com/hookedonplay/decoviewlib/charts/LineArcSeries.java b/decoviewlib/src/main/java/com/hookedonplay/decoviewlib/charts/LineArcSeries.java index 1dc19cd..edeb54b 100644 --- a/decoviewlib/src/main/java/com/hookedonplay/decoviewlib/charts/LineArcSeries.java +++ b/decoviewlib/src/main/java/com/hookedonplay/decoviewlib/charts/LineArcSeries.java @@ -80,7 +80,7 @@ private void drawArcEdgeDetail(@NonNull Canvas canvas) { for (EdgeDetail edgeDetail : edgeDetailList) { final boolean drawInner = edgeDetail.getEdgeType() == EdgeDetail.EdgeType.EDGE_INNER; if (edgeDetail.getClipPath() == null) { - float inset = (edgeDetail.getRatio() - 0.5f) * mPaint.getStrokeWidth(); + float inset = (edgeDetail.getRatio() - 0.5f) * mSeriesItem.getLineWidth(); if (drawInner) { inset = -inset; } From 69eec22432b1abe38ca103b9959959992b1d36fa Mon Sep 17 00:00:00 2001 From: BRM Date: Sun, 3 Jul 2016 13:52:27 +1000 Subject: [PATCH 11/17] Rename sample project from 'app' to 'sampleapp' to make it clear this is a sample showing how to use DecoView and does not contain the DecoView library itself --- {app => sampleapp}/.gitignore | 0 {app => sampleapp}/build.gradle | 0 {app => sampleapp}/proguard-rules.pro | 0 app/app.iml => sampleapp/sampleapp.iml | 8 ++------ .../decoviewsample/ApplicationTest.java | 0 {app => sampleapp}/src/main/AndroidManifest.xml | 0 {app => sampleapp}/src/main/assets/fonts/kotak.ttf | Bin .../hookedonplay/decoviewsample/DecoFragment.java | 0 .../decoviewsample/DecoViewSampleActivity.java | 0 .../decoviewsample/Sample1Fragment.java | 0 .../decoviewsample/Sample2Fragment.java | 0 .../decoviewsample/Sample3Fragment.java | 0 .../decoviewsample/Sample4Fragment.java | 0 .../decoviewsample/SampleFit2Fragment.java | 0 .../decoviewsample/SampleFitFragment.java | 0 .../hookedonplay/decoviewsample/SampleFragment.java | 0 .../decoviewsample/SampleGenericFragment.java | 0 .../decoviewsample/SampleInterpolatorsFragment.java | 0 .../decoviewsample/SamplePauseFragment.java | 10 ---------- .../decoviewsample/SamplePeopleFragment.java | 0 .../hookedonplay/decoviewsample/SamplerAdapter.java | 0 .../src/main/res/anim/rotate_hide.xml | 0 .../src/main/res/drawable-hdpi/ic_acme_fit.png | Bin .../src/main/res/drawable-hdpi/ic_activity1.png | Bin .../src/main/res/drawable-hdpi/ic_activity2.png | Bin .../src/main/res/drawable-hdpi/ic_activity3.png | Bin .../src/main/res/drawable-hdpi/ic_avatar_child.png | Bin .../src/main/res/drawable-hdpi/ic_avatar_group.png | Bin .../src/main/res/drawable-hdpi/ic_avatar_man.png | Bin .../src/main/res/drawable-hdpi/ic_avatar_woman.png | Bin .../src/main/res/drawable-hdpi/ic_fit_bike.png | Bin .../src/main/res/drawable-hdpi/ic_fit_gym.png | Bin .../src/main/res/drawable-hdpi/ic_fit_logo.png | Bin .../src/main/res/drawable-hdpi/ic_fit_run.png | Bin .../src/main/res/drawable-hdpi/ic_fit_swim.png | Bin .../src/main/res/drawable-hdpi/ic_logo.png | Bin .../src/main/res/drawable-hdpi/ic_refresh.png | Bin .../src/main/res/drawable-hdpi/ic_swipe_hint.png | Bin .../src/main/res/drawable-hdpi/ic_swipe_left.png | Bin .../src/main/res/drawable-hdpi/ic_swipe_right.png | Bin .../main/res/drawable-nodpi/circle_activity1.xml | 0 .../main/res/drawable-nodpi/circle_activity2.xml | 0 .../src/main/res/drawable-nodpi/circle_refresh.xml | 0 .../main/res/layout-land/fragment_sample_fit.xml | 0 .../layout-land/fragment_sample_interpolators.xml | 0 .../main/res/layout/activity_deco_view_sample.xml | 0 .../src/main/res/layout/fragment_deco.xml | 0 .../main/res/layout/fragment_deco_view_sample.xml | 0 .../src/main/res/layout/fragment_sample1.xml | 0 .../src/main/res/layout/fragment_sample_fit.xml | 0 .../src/main/res/layout/fragment_sample_fit2.xml | 0 .../src/main/res/layout/fragment_sample_generic.xml | 0 .../res/layout/fragment_sample_interpolators.xml | 0 .../src/main/res/layout/fragment_sample_pause.xml | 0 .../src/main/res/layout/fragment_sample_people.xml | 0 .../src/main/res/layout/layout_replay.xml | 0 .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin .../src/main/res/mipmap-xxhdpi/ic_launcher.png | Bin {app => sampleapp}/src/main/res/values/dimens.xml | 0 {app => sampleapp}/src/main/res/values/strings.xml | 0 {app => sampleapp}/src/main/res/values/styles.xml | 0 63 files changed, 2 insertions(+), 16 deletions(-) rename {app => sampleapp}/.gitignore (100%) rename {app => sampleapp}/build.gradle (100%) rename {app => sampleapp}/proguard-rules.pro (100%) rename app/app.iml => sampleapp/sampleapp.iml (90%) rename {app => sampleapp}/src/androidTest/java/com/hookedonplay/decoviewsample/ApplicationTest.java (100%) rename {app => sampleapp}/src/main/AndroidManifest.xml (100%) rename {app => sampleapp}/src/main/assets/fonts/kotak.ttf (100%) rename {app => sampleapp}/src/main/java/com/hookedonplay/decoviewsample/DecoFragment.java (100%) rename {app => sampleapp}/src/main/java/com/hookedonplay/decoviewsample/DecoViewSampleActivity.java (100%) rename {app => sampleapp}/src/main/java/com/hookedonplay/decoviewsample/Sample1Fragment.java (100%) rename {app => sampleapp}/src/main/java/com/hookedonplay/decoviewsample/Sample2Fragment.java (100%) rename {app => sampleapp}/src/main/java/com/hookedonplay/decoviewsample/Sample3Fragment.java (100%) rename {app => sampleapp}/src/main/java/com/hookedonplay/decoviewsample/Sample4Fragment.java (100%) rename {app => sampleapp}/src/main/java/com/hookedonplay/decoviewsample/SampleFit2Fragment.java (100%) rename {app => sampleapp}/src/main/java/com/hookedonplay/decoviewsample/SampleFitFragment.java (100%) rename {app => sampleapp}/src/main/java/com/hookedonplay/decoviewsample/SampleFragment.java (100%) rename {app => sampleapp}/src/main/java/com/hookedonplay/decoviewsample/SampleGenericFragment.java (100%) rename {app => sampleapp}/src/main/java/com/hookedonplay/decoviewsample/SampleInterpolatorsFragment.java (100%) rename {app => sampleapp}/src/main/java/com/hookedonplay/decoviewsample/SamplePauseFragment.java (89%) rename {app => sampleapp}/src/main/java/com/hookedonplay/decoviewsample/SamplePeopleFragment.java (100%) rename {app => sampleapp}/src/main/java/com/hookedonplay/decoviewsample/SamplerAdapter.java (100%) rename {app => sampleapp}/src/main/res/anim/rotate_hide.xml (100%) rename {app => sampleapp}/src/main/res/drawable-hdpi/ic_acme_fit.png (100%) rename {app => sampleapp}/src/main/res/drawable-hdpi/ic_activity1.png (100%) rename {app => sampleapp}/src/main/res/drawable-hdpi/ic_activity2.png (100%) rename {app => sampleapp}/src/main/res/drawable-hdpi/ic_activity3.png (100%) rename {app => sampleapp}/src/main/res/drawable-hdpi/ic_avatar_child.png (100%) rename {app => sampleapp}/src/main/res/drawable-hdpi/ic_avatar_group.png (100%) rename {app => sampleapp}/src/main/res/drawable-hdpi/ic_avatar_man.png (100%) rename {app => sampleapp}/src/main/res/drawable-hdpi/ic_avatar_woman.png (100%) rename {app => sampleapp}/src/main/res/drawable-hdpi/ic_fit_bike.png (100%) rename {app => sampleapp}/src/main/res/drawable-hdpi/ic_fit_gym.png (100%) rename {app => sampleapp}/src/main/res/drawable-hdpi/ic_fit_logo.png (100%) rename {app => sampleapp}/src/main/res/drawable-hdpi/ic_fit_run.png (100%) rename {app => sampleapp}/src/main/res/drawable-hdpi/ic_fit_swim.png (100%) rename {app => sampleapp}/src/main/res/drawable-hdpi/ic_logo.png (100%) rename {app => sampleapp}/src/main/res/drawable-hdpi/ic_refresh.png (100%) rename {app => sampleapp}/src/main/res/drawable-hdpi/ic_swipe_hint.png (100%) rename {app => sampleapp}/src/main/res/drawable-hdpi/ic_swipe_left.png (100%) rename {app => sampleapp}/src/main/res/drawable-hdpi/ic_swipe_right.png (100%) rename {app => sampleapp}/src/main/res/drawable-nodpi/circle_activity1.xml (100%) rename {app => sampleapp}/src/main/res/drawable-nodpi/circle_activity2.xml (100%) rename {app => sampleapp}/src/main/res/drawable-nodpi/circle_refresh.xml (100%) rename {app => sampleapp}/src/main/res/layout-land/fragment_sample_fit.xml (100%) rename {app => sampleapp}/src/main/res/layout-land/fragment_sample_interpolators.xml (100%) rename {app => sampleapp}/src/main/res/layout/activity_deco_view_sample.xml (100%) rename {app => sampleapp}/src/main/res/layout/fragment_deco.xml (100%) rename {app => sampleapp}/src/main/res/layout/fragment_deco_view_sample.xml (100%) rename {app => sampleapp}/src/main/res/layout/fragment_sample1.xml (100%) rename {app => sampleapp}/src/main/res/layout/fragment_sample_fit.xml (100%) rename {app => sampleapp}/src/main/res/layout/fragment_sample_fit2.xml (100%) rename {app => sampleapp}/src/main/res/layout/fragment_sample_generic.xml (100%) rename {app => sampleapp}/src/main/res/layout/fragment_sample_interpolators.xml (100%) rename {app => sampleapp}/src/main/res/layout/fragment_sample_pause.xml (100%) rename {app => sampleapp}/src/main/res/layout/fragment_sample_people.xml (100%) rename {app => sampleapp}/src/main/res/layout/layout_replay.xml (100%) rename {app => sampleapp}/src/main/res/mipmap-hdpi/ic_launcher.png (100%) rename {app => sampleapp}/src/main/res/mipmap-mdpi/ic_launcher.png (100%) rename {app => sampleapp}/src/main/res/mipmap-xhdpi/ic_launcher.png (100%) rename {app => sampleapp}/src/main/res/mipmap-xxhdpi/ic_launcher.png (100%) rename {app => sampleapp}/src/main/res/values/dimens.xml (100%) rename {app => sampleapp}/src/main/res/values/strings.xml (100%) rename {app => sampleapp}/src/main/res/values/styles.xml (100%) diff --git a/app/.gitignore b/sampleapp/.gitignore similarity index 100% rename from app/.gitignore rename to sampleapp/.gitignore diff --git a/app/build.gradle b/sampleapp/build.gradle similarity index 100% rename from app/build.gradle rename to sampleapp/build.gradle diff --git a/app/proguard-rules.pro b/sampleapp/proguard-rules.pro similarity index 100% rename from app/proguard-rules.pro rename to sampleapp/proguard-rules.pro diff --git a/app/app.iml b/sampleapp/sampleapp.iml similarity index 90% rename from app/app.iml rename to sampleapp/sampleapp.iml index a42d7db..44eac82 100644 --- a/app/app.iml +++ b/sampleapp/sampleapp.iml @@ -1,9 +1,9 @@ - + - @@ -85,10 +85,6 @@ - - - - diff --git a/app/src/androidTest/java/com/hookedonplay/decoviewsample/ApplicationTest.java b/sampleapp/src/androidTest/java/com/hookedonplay/decoviewsample/ApplicationTest.java similarity index 100% rename from app/src/androidTest/java/com/hookedonplay/decoviewsample/ApplicationTest.java rename to sampleapp/src/androidTest/java/com/hookedonplay/decoviewsample/ApplicationTest.java diff --git a/app/src/main/AndroidManifest.xml b/sampleapp/src/main/AndroidManifest.xml similarity index 100% rename from app/src/main/AndroidManifest.xml rename to sampleapp/src/main/AndroidManifest.xml diff --git a/app/src/main/assets/fonts/kotak.ttf b/sampleapp/src/main/assets/fonts/kotak.ttf similarity index 100% rename from app/src/main/assets/fonts/kotak.ttf rename to sampleapp/src/main/assets/fonts/kotak.ttf diff --git a/app/src/main/java/com/hookedonplay/decoviewsample/DecoFragment.java b/sampleapp/src/main/java/com/hookedonplay/decoviewsample/DecoFragment.java similarity index 100% rename from app/src/main/java/com/hookedonplay/decoviewsample/DecoFragment.java rename to sampleapp/src/main/java/com/hookedonplay/decoviewsample/DecoFragment.java diff --git a/app/src/main/java/com/hookedonplay/decoviewsample/DecoViewSampleActivity.java b/sampleapp/src/main/java/com/hookedonplay/decoviewsample/DecoViewSampleActivity.java similarity index 100% rename from app/src/main/java/com/hookedonplay/decoviewsample/DecoViewSampleActivity.java rename to sampleapp/src/main/java/com/hookedonplay/decoviewsample/DecoViewSampleActivity.java diff --git a/app/src/main/java/com/hookedonplay/decoviewsample/Sample1Fragment.java b/sampleapp/src/main/java/com/hookedonplay/decoviewsample/Sample1Fragment.java similarity index 100% rename from app/src/main/java/com/hookedonplay/decoviewsample/Sample1Fragment.java rename to sampleapp/src/main/java/com/hookedonplay/decoviewsample/Sample1Fragment.java diff --git a/app/src/main/java/com/hookedonplay/decoviewsample/Sample2Fragment.java b/sampleapp/src/main/java/com/hookedonplay/decoviewsample/Sample2Fragment.java similarity index 100% rename from app/src/main/java/com/hookedonplay/decoviewsample/Sample2Fragment.java rename to sampleapp/src/main/java/com/hookedonplay/decoviewsample/Sample2Fragment.java diff --git a/app/src/main/java/com/hookedonplay/decoviewsample/Sample3Fragment.java b/sampleapp/src/main/java/com/hookedonplay/decoviewsample/Sample3Fragment.java similarity index 100% rename from app/src/main/java/com/hookedonplay/decoviewsample/Sample3Fragment.java rename to sampleapp/src/main/java/com/hookedonplay/decoviewsample/Sample3Fragment.java diff --git a/app/src/main/java/com/hookedonplay/decoviewsample/Sample4Fragment.java b/sampleapp/src/main/java/com/hookedonplay/decoviewsample/Sample4Fragment.java similarity index 100% rename from app/src/main/java/com/hookedonplay/decoviewsample/Sample4Fragment.java rename to sampleapp/src/main/java/com/hookedonplay/decoviewsample/Sample4Fragment.java diff --git a/app/src/main/java/com/hookedonplay/decoviewsample/SampleFit2Fragment.java b/sampleapp/src/main/java/com/hookedonplay/decoviewsample/SampleFit2Fragment.java similarity index 100% rename from app/src/main/java/com/hookedonplay/decoviewsample/SampleFit2Fragment.java rename to sampleapp/src/main/java/com/hookedonplay/decoviewsample/SampleFit2Fragment.java diff --git a/app/src/main/java/com/hookedonplay/decoviewsample/SampleFitFragment.java b/sampleapp/src/main/java/com/hookedonplay/decoviewsample/SampleFitFragment.java similarity index 100% rename from app/src/main/java/com/hookedonplay/decoviewsample/SampleFitFragment.java rename to sampleapp/src/main/java/com/hookedonplay/decoviewsample/SampleFitFragment.java diff --git a/app/src/main/java/com/hookedonplay/decoviewsample/SampleFragment.java b/sampleapp/src/main/java/com/hookedonplay/decoviewsample/SampleFragment.java similarity index 100% rename from app/src/main/java/com/hookedonplay/decoviewsample/SampleFragment.java rename to sampleapp/src/main/java/com/hookedonplay/decoviewsample/SampleFragment.java diff --git a/app/src/main/java/com/hookedonplay/decoviewsample/SampleGenericFragment.java b/sampleapp/src/main/java/com/hookedonplay/decoviewsample/SampleGenericFragment.java similarity index 100% rename from app/src/main/java/com/hookedonplay/decoviewsample/SampleGenericFragment.java rename to sampleapp/src/main/java/com/hookedonplay/decoviewsample/SampleGenericFragment.java diff --git a/app/src/main/java/com/hookedonplay/decoviewsample/SampleInterpolatorsFragment.java b/sampleapp/src/main/java/com/hookedonplay/decoviewsample/SampleInterpolatorsFragment.java similarity index 100% rename from app/src/main/java/com/hookedonplay/decoviewsample/SampleInterpolatorsFragment.java rename to sampleapp/src/main/java/com/hookedonplay/decoviewsample/SampleInterpolatorsFragment.java diff --git a/app/src/main/java/com/hookedonplay/decoviewsample/SamplePauseFragment.java b/sampleapp/src/main/java/com/hookedonplay/decoviewsample/SamplePauseFragment.java similarity index 89% rename from app/src/main/java/com/hookedonplay/decoviewsample/SamplePauseFragment.java rename to sampleapp/src/main/java/com/hookedonplay/decoviewsample/SamplePauseFragment.java index c304fcb..2204e0b 100644 --- a/app/src/main/java/com/hookedonplay/decoviewsample/SamplePauseFragment.java +++ b/sampleapp/src/main/java/com/hookedonplay/decoviewsample/SamplePauseFragment.java @@ -55,10 +55,6 @@ protected void createTracks() { decoView.executeReset(); decoView.deleteAll(); - // Important: As we are going to use shadows on this DecoView, we must disable hardware - // acceleration or the shadow will not render. - decoView.disableHardwareAccelerationForDecoView(); - final float seriesMax = 100f; float circleInset = getDimension(18); @@ -70,15 +66,9 @@ protected void createTracks() { mPieIndex = decoView.addSeries(seriesBack1Item); - // Note: As we are placing a shadow on this view we are insetting it by the amount of the - // shadow. This is because otherwise at the center of the top and side edge the shadow - // will render outside the bounds of the view. SeriesItem series1Item = new SeriesItem.Builder(Color.parseColor("#FFFFC107")) .setRange(0, seriesMax, 0) .setLineWidth(getDimension(36)) - .setInset(new PointF(getDimension(8f), getDimension(8f))) - .setShadowSize(getDimension(8f)) - .setShadowColor(Color.BLACK) .setInterpolator(new LinearInterpolator()) .build(); diff --git a/app/src/main/java/com/hookedonplay/decoviewsample/SamplePeopleFragment.java b/sampleapp/src/main/java/com/hookedonplay/decoviewsample/SamplePeopleFragment.java similarity index 100% rename from app/src/main/java/com/hookedonplay/decoviewsample/SamplePeopleFragment.java rename to sampleapp/src/main/java/com/hookedonplay/decoviewsample/SamplePeopleFragment.java diff --git a/app/src/main/java/com/hookedonplay/decoviewsample/SamplerAdapter.java b/sampleapp/src/main/java/com/hookedonplay/decoviewsample/SamplerAdapter.java similarity index 100% rename from app/src/main/java/com/hookedonplay/decoviewsample/SamplerAdapter.java rename to sampleapp/src/main/java/com/hookedonplay/decoviewsample/SamplerAdapter.java diff --git a/app/src/main/res/anim/rotate_hide.xml b/sampleapp/src/main/res/anim/rotate_hide.xml similarity index 100% rename from app/src/main/res/anim/rotate_hide.xml rename to sampleapp/src/main/res/anim/rotate_hide.xml diff --git a/app/src/main/res/drawable-hdpi/ic_acme_fit.png b/sampleapp/src/main/res/drawable-hdpi/ic_acme_fit.png similarity index 100% rename from app/src/main/res/drawable-hdpi/ic_acme_fit.png rename to sampleapp/src/main/res/drawable-hdpi/ic_acme_fit.png diff --git a/app/src/main/res/drawable-hdpi/ic_activity1.png b/sampleapp/src/main/res/drawable-hdpi/ic_activity1.png similarity index 100% rename from app/src/main/res/drawable-hdpi/ic_activity1.png rename to sampleapp/src/main/res/drawable-hdpi/ic_activity1.png diff --git a/app/src/main/res/drawable-hdpi/ic_activity2.png b/sampleapp/src/main/res/drawable-hdpi/ic_activity2.png similarity index 100% rename from app/src/main/res/drawable-hdpi/ic_activity2.png rename to sampleapp/src/main/res/drawable-hdpi/ic_activity2.png diff --git a/app/src/main/res/drawable-hdpi/ic_activity3.png b/sampleapp/src/main/res/drawable-hdpi/ic_activity3.png similarity index 100% rename from app/src/main/res/drawable-hdpi/ic_activity3.png rename to sampleapp/src/main/res/drawable-hdpi/ic_activity3.png diff --git a/app/src/main/res/drawable-hdpi/ic_avatar_child.png b/sampleapp/src/main/res/drawable-hdpi/ic_avatar_child.png similarity index 100% rename from app/src/main/res/drawable-hdpi/ic_avatar_child.png rename to sampleapp/src/main/res/drawable-hdpi/ic_avatar_child.png diff --git a/app/src/main/res/drawable-hdpi/ic_avatar_group.png b/sampleapp/src/main/res/drawable-hdpi/ic_avatar_group.png similarity index 100% rename from app/src/main/res/drawable-hdpi/ic_avatar_group.png rename to sampleapp/src/main/res/drawable-hdpi/ic_avatar_group.png diff --git a/app/src/main/res/drawable-hdpi/ic_avatar_man.png b/sampleapp/src/main/res/drawable-hdpi/ic_avatar_man.png similarity index 100% rename from app/src/main/res/drawable-hdpi/ic_avatar_man.png rename to sampleapp/src/main/res/drawable-hdpi/ic_avatar_man.png diff --git a/app/src/main/res/drawable-hdpi/ic_avatar_woman.png b/sampleapp/src/main/res/drawable-hdpi/ic_avatar_woman.png similarity index 100% rename from app/src/main/res/drawable-hdpi/ic_avatar_woman.png rename to sampleapp/src/main/res/drawable-hdpi/ic_avatar_woman.png diff --git a/app/src/main/res/drawable-hdpi/ic_fit_bike.png b/sampleapp/src/main/res/drawable-hdpi/ic_fit_bike.png similarity index 100% rename from app/src/main/res/drawable-hdpi/ic_fit_bike.png rename to sampleapp/src/main/res/drawable-hdpi/ic_fit_bike.png diff --git a/app/src/main/res/drawable-hdpi/ic_fit_gym.png b/sampleapp/src/main/res/drawable-hdpi/ic_fit_gym.png similarity index 100% rename from app/src/main/res/drawable-hdpi/ic_fit_gym.png rename to sampleapp/src/main/res/drawable-hdpi/ic_fit_gym.png diff --git a/app/src/main/res/drawable-hdpi/ic_fit_logo.png b/sampleapp/src/main/res/drawable-hdpi/ic_fit_logo.png similarity index 100% rename from app/src/main/res/drawable-hdpi/ic_fit_logo.png rename to sampleapp/src/main/res/drawable-hdpi/ic_fit_logo.png diff --git a/app/src/main/res/drawable-hdpi/ic_fit_run.png b/sampleapp/src/main/res/drawable-hdpi/ic_fit_run.png similarity index 100% rename from app/src/main/res/drawable-hdpi/ic_fit_run.png rename to sampleapp/src/main/res/drawable-hdpi/ic_fit_run.png diff --git a/app/src/main/res/drawable-hdpi/ic_fit_swim.png b/sampleapp/src/main/res/drawable-hdpi/ic_fit_swim.png similarity index 100% rename from app/src/main/res/drawable-hdpi/ic_fit_swim.png rename to sampleapp/src/main/res/drawable-hdpi/ic_fit_swim.png diff --git a/app/src/main/res/drawable-hdpi/ic_logo.png b/sampleapp/src/main/res/drawable-hdpi/ic_logo.png similarity index 100% rename from app/src/main/res/drawable-hdpi/ic_logo.png rename to sampleapp/src/main/res/drawable-hdpi/ic_logo.png diff --git a/app/src/main/res/drawable-hdpi/ic_refresh.png b/sampleapp/src/main/res/drawable-hdpi/ic_refresh.png similarity index 100% rename from app/src/main/res/drawable-hdpi/ic_refresh.png rename to sampleapp/src/main/res/drawable-hdpi/ic_refresh.png diff --git a/app/src/main/res/drawable-hdpi/ic_swipe_hint.png b/sampleapp/src/main/res/drawable-hdpi/ic_swipe_hint.png similarity index 100% rename from app/src/main/res/drawable-hdpi/ic_swipe_hint.png rename to sampleapp/src/main/res/drawable-hdpi/ic_swipe_hint.png diff --git a/app/src/main/res/drawable-hdpi/ic_swipe_left.png b/sampleapp/src/main/res/drawable-hdpi/ic_swipe_left.png similarity index 100% rename from app/src/main/res/drawable-hdpi/ic_swipe_left.png rename to sampleapp/src/main/res/drawable-hdpi/ic_swipe_left.png diff --git a/app/src/main/res/drawable-hdpi/ic_swipe_right.png b/sampleapp/src/main/res/drawable-hdpi/ic_swipe_right.png similarity index 100% rename from app/src/main/res/drawable-hdpi/ic_swipe_right.png rename to sampleapp/src/main/res/drawable-hdpi/ic_swipe_right.png diff --git a/app/src/main/res/drawable-nodpi/circle_activity1.xml b/sampleapp/src/main/res/drawable-nodpi/circle_activity1.xml similarity index 100% rename from app/src/main/res/drawable-nodpi/circle_activity1.xml rename to sampleapp/src/main/res/drawable-nodpi/circle_activity1.xml diff --git a/app/src/main/res/drawable-nodpi/circle_activity2.xml b/sampleapp/src/main/res/drawable-nodpi/circle_activity2.xml similarity index 100% rename from app/src/main/res/drawable-nodpi/circle_activity2.xml rename to sampleapp/src/main/res/drawable-nodpi/circle_activity2.xml diff --git a/app/src/main/res/drawable-nodpi/circle_refresh.xml b/sampleapp/src/main/res/drawable-nodpi/circle_refresh.xml similarity index 100% rename from app/src/main/res/drawable-nodpi/circle_refresh.xml rename to sampleapp/src/main/res/drawable-nodpi/circle_refresh.xml diff --git a/app/src/main/res/layout-land/fragment_sample_fit.xml b/sampleapp/src/main/res/layout-land/fragment_sample_fit.xml similarity index 100% rename from app/src/main/res/layout-land/fragment_sample_fit.xml rename to sampleapp/src/main/res/layout-land/fragment_sample_fit.xml diff --git a/app/src/main/res/layout-land/fragment_sample_interpolators.xml b/sampleapp/src/main/res/layout-land/fragment_sample_interpolators.xml similarity index 100% rename from app/src/main/res/layout-land/fragment_sample_interpolators.xml rename to sampleapp/src/main/res/layout-land/fragment_sample_interpolators.xml diff --git a/app/src/main/res/layout/activity_deco_view_sample.xml b/sampleapp/src/main/res/layout/activity_deco_view_sample.xml similarity index 100% rename from app/src/main/res/layout/activity_deco_view_sample.xml rename to sampleapp/src/main/res/layout/activity_deco_view_sample.xml diff --git a/app/src/main/res/layout/fragment_deco.xml b/sampleapp/src/main/res/layout/fragment_deco.xml similarity index 100% rename from app/src/main/res/layout/fragment_deco.xml rename to sampleapp/src/main/res/layout/fragment_deco.xml diff --git a/app/src/main/res/layout/fragment_deco_view_sample.xml b/sampleapp/src/main/res/layout/fragment_deco_view_sample.xml similarity index 100% rename from app/src/main/res/layout/fragment_deco_view_sample.xml rename to sampleapp/src/main/res/layout/fragment_deco_view_sample.xml diff --git a/app/src/main/res/layout/fragment_sample1.xml b/sampleapp/src/main/res/layout/fragment_sample1.xml similarity index 100% rename from app/src/main/res/layout/fragment_sample1.xml rename to sampleapp/src/main/res/layout/fragment_sample1.xml diff --git a/app/src/main/res/layout/fragment_sample_fit.xml b/sampleapp/src/main/res/layout/fragment_sample_fit.xml similarity index 100% rename from app/src/main/res/layout/fragment_sample_fit.xml rename to sampleapp/src/main/res/layout/fragment_sample_fit.xml diff --git a/app/src/main/res/layout/fragment_sample_fit2.xml b/sampleapp/src/main/res/layout/fragment_sample_fit2.xml similarity index 100% rename from app/src/main/res/layout/fragment_sample_fit2.xml rename to sampleapp/src/main/res/layout/fragment_sample_fit2.xml diff --git a/app/src/main/res/layout/fragment_sample_generic.xml b/sampleapp/src/main/res/layout/fragment_sample_generic.xml similarity index 100% rename from app/src/main/res/layout/fragment_sample_generic.xml rename to sampleapp/src/main/res/layout/fragment_sample_generic.xml diff --git a/app/src/main/res/layout/fragment_sample_interpolators.xml b/sampleapp/src/main/res/layout/fragment_sample_interpolators.xml similarity index 100% rename from app/src/main/res/layout/fragment_sample_interpolators.xml rename to sampleapp/src/main/res/layout/fragment_sample_interpolators.xml diff --git a/app/src/main/res/layout/fragment_sample_pause.xml b/sampleapp/src/main/res/layout/fragment_sample_pause.xml similarity index 100% rename from app/src/main/res/layout/fragment_sample_pause.xml rename to sampleapp/src/main/res/layout/fragment_sample_pause.xml diff --git a/app/src/main/res/layout/fragment_sample_people.xml b/sampleapp/src/main/res/layout/fragment_sample_people.xml similarity index 100% rename from app/src/main/res/layout/fragment_sample_people.xml rename to sampleapp/src/main/res/layout/fragment_sample_people.xml diff --git a/app/src/main/res/layout/layout_replay.xml b/sampleapp/src/main/res/layout/layout_replay.xml similarity index 100% rename from app/src/main/res/layout/layout_replay.xml rename to sampleapp/src/main/res/layout/layout_replay.xml diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/sampleapp/src/main/res/mipmap-hdpi/ic_launcher.png similarity index 100% rename from app/src/main/res/mipmap-hdpi/ic_launcher.png rename to sampleapp/src/main/res/mipmap-hdpi/ic_launcher.png diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.png b/sampleapp/src/main/res/mipmap-mdpi/ic_launcher.png similarity index 100% rename from app/src/main/res/mipmap-mdpi/ic_launcher.png rename to sampleapp/src/main/res/mipmap-mdpi/ic_launcher.png diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/sampleapp/src/main/res/mipmap-xhdpi/ic_launcher.png similarity index 100% rename from app/src/main/res/mipmap-xhdpi/ic_launcher.png rename to sampleapp/src/main/res/mipmap-xhdpi/ic_launcher.png diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/sampleapp/src/main/res/mipmap-xxhdpi/ic_launcher.png similarity index 100% rename from app/src/main/res/mipmap-xxhdpi/ic_launcher.png rename to sampleapp/src/main/res/mipmap-xxhdpi/ic_launcher.png diff --git a/app/src/main/res/values/dimens.xml b/sampleapp/src/main/res/values/dimens.xml similarity index 100% rename from app/src/main/res/values/dimens.xml rename to sampleapp/src/main/res/values/dimens.xml diff --git a/app/src/main/res/values/strings.xml b/sampleapp/src/main/res/values/strings.xml similarity index 100% rename from app/src/main/res/values/strings.xml rename to sampleapp/src/main/res/values/strings.xml diff --git a/app/src/main/res/values/styles.xml b/sampleapp/src/main/res/values/styles.xml similarity index 100% rename from app/src/main/res/values/styles.xml rename to sampleapp/src/main/res/values/styles.xml From 94f75b770e8678b69a11623305633c22c3f74044 Mon Sep 17 00:00:00 2001 From: BRM Date: Sun, 3 Jul 2016 13:53:45 +1000 Subject: [PATCH 12/17] Alter gradle for renamed sample project ('app' to 'sampleapp') --- settings.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/settings.gradle b/settings.gradle index 301f417..600e7fa 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1 +1 @@ -include ':decoviewlib', ':app' +include ':decoviewlib', ':sampleapp' From 87c559738cfbd48f03b866685c3b76026ab5cff3 Mon Sep 17 00:00:00 2001 From: BRM Date: Sun, 3 Jul 2016 13:54:37 +1000 Subject: [PATCH 13/17] Use latest stable gradle plugin --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index f6e9073..e220f0b 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:2.1.0' + classpath 'com.android.tools.build:gradle:2.1.2' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files From d9df63d522bac2ebabaccc6999ef191eee2bbf2d Mon Sep 17 00:00:00 2001 From: BRM Date: Sun, 3 Jul 2016 13:59:19 +1000 Subject: [PATCH 14/17] Remove tools:context value from xml layout --- sampleapp/src/main/res/layout/fragment_deco_view_sample.xml | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/sampleapp/src/main/res/layout/fragment_deco_view_sample.xml b/sampleapp/src/main/res/layout/fragment_deco_view_sample.xml index 1c3def0..7caa817 100644 --- a/sampleapp/src/main/res/layout/fragment_deco_view_sample.xml +++ b/sampleapp/src/main/res/layout/fragment_deco_view_sample.xml @@ -1,12 +1,8 @@ - - + android:paddingBottom="@dimen/activity_vertical_margin"> From 8760ad19658f8bbfb23b035313bccf397c5a7a24 Mon Sep 17 00:00:00 2001 From: BRM Date: Sun, 3 Jul 2016 13:59:58 +1000 Subject: [PATCH 15/17] Bump version to 1.2, versionCode 10 --- decoviewlib/build.gradle | 4 ++-- decoviewlib/decoviewlib.iml | 20 ++++++++++++-------- sampleapp/build.gradle | 4 ++-- 3 files changed, 16 insertions(+), 12 deletions(-) diff --git a/decoviewlib/build.gradle b/decoviewlib/build.gradle index 1a0383e..1751f8e 100644 --- a/decoviewlib/build.gradle +++ b/decoviewlib/build.gradle @@ -7,8 +7,8 @@ android { defaultConfig { minSdkVersion 8 targetSdkVersion 23 - versionCode 8 - versionName "1.0.1" + versionCode 10 + versionName "1.2" } buildTypes { release { diff --git a/decoviewlib/decoviewlib.iml b/decoviewlib/decoviewlib.iml index 5a37007..db85c2b 100644 --- a/decoviewlib/decoviewlib.iml +++ b/decoviewlib/decoviewlib.iml @@ -65,14 +65,6 @@ - - - - - - - - @@ -81,12 +73,24 @@ + + + + + + + + + + + + diff --git a/sampleapp/build.gradle b/sampleapp/build.gradle index 172a01f..aae3ae9 100644 --- a/sampleapp/build.gradle +++ b/sampleapp/build.gradle @@ -7,8 +7,8 @@ android { applicationId 'com.hookedonplay.decoviewsample' minSdkVersion 8 targetSdkVersion 23 - versionCode 8 - versionName "1.0.1" + versionCode 10 + versionName "1.2" } buildTypes { release { From 06042a6fd8f25b12a3881a467e54fcfd9d6db786 Mon Sep 17 00:00:00 2001 From: Brent Date: Sun, 3 Jul 2016 14:19:37 +1000 Subject: [PATCH 16/17] Update gradle dependencies to v1.2 compile 'com.github.bmarrdev:android-DecoView-charting:v1.2' --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 77efc5d..ee6ad03 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ Step 1. Add the repositories into your build.gradle Step 2. Add the dependency in the form dependencies { - compile 'com.github.bmarrdev:android-DecoView-charting:v1.1' + compile 'com.github.bmarrdev:android-DecoView-charting:v1.2' } From 3f1bfab9c0e2a1f9a48996b176347f79704297ca Mon Sep 17 00:00:00 2001 From: Brent Date: Sat, 9 Jul 2016 13:13:50 +1000 Subject: [PATCH 17/17] Update README.md Update link to sample project --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ee6ad03..740731d 100644 --- a/README.md +++ b/README.md @@ -38,7 +38,7 @@ Usage DecoView is subclassed from the Android View class. Just like other View subclasses, such as TextView and ImageView, it can be added and configured from your layout XML then controlled in your Activity code. -This repository includes a number of samples for constructing and animating a DecoView. You will find the code for the samples in the [app project](https://github.com/bmarrdev/android-DecoView-charting/tree/master/app/src/main/java/com/hookedonplay/decoviewsample). +This repository includes a number of samples for constructing and animating a DecoView. You will find the code for the samples in the [sampleapp project](https://github.com/bmarrdev/android-DecoView-charting/tree/master/sampleapp/src/main/java/com/hookedonplay/decoviewsample). The main concepts you need to understand are: - DecoView is a View, it subclasses android.view.View