From 6541e55a4e44f2700ced57b1a589623fd18cb97f Mon Sep 17 00:00:00 2001 From: jogehring Date: Sat, 24 May 2014 14:02:37 +0200 Subject: [PATCH 001/231] gradle module for Android Studio --- .gitignore | 47 +---------- GraphView.iml | 78 +++++++++++++++++++ build.gradle | 35 ++++----- proguard-rules.txt | 17 ++++ project.properties | 15 ---- .../main/AndroidManifest.xml | 3 + .../com/jjoe64/graphview/BarGraphView.java | 0 .../graphview/CustomLabelFormatter.java | 0 .../java}/com/jjoe64/graphview/GraphView.java | 0 .../graphview/GraphViewDataInterface.java | 0 .../com/jjoe64/graphview/GraphViewSeries.java | 0 .../com/jjoe64/graphview/GraphViewStyle.java | 0 .../com/jjoe64/graphview/LineGraphView.java | 0 .../jjoe64/graphview/ValueDependentColor.java | 0 .../compatible/RealScaleGestureDetector.java | 0 .../compatible/ScaleGestureDetector.java | 0 16 files changed, 115 insertions(+), 80 deletions(-) create mode 100644 GraphView.iml create mode 100644 proguard-rules.txt delete mode 100644 project.properties rename AndroidManifest.xml => src/main/AndroidManifest.xml (87%) rename src/{ => main/java}/com/jjoe64/graphview/BarGraphView.java (100%) rename src/{ => main/java}/com/jjoe64/graphview/CustomLabelFormatter.java (100%) rename src/{ => main/java}/com/jjoe64/graphview/GraphView.java (100%) rename src/{ => main/java}/com/jjoe64/graphview/GraphViewDataInterface.java (100%) rename src/{ => main/java}/com/jjoe64/graphview/GraphViewSeries.java (100%) rename src/{ => main/java}/com/jjoe64/graphview/GraphViewStyle.java (100%) rename src/{ => main/java}/com/jjoe64/graphview/LineGraphView.java (100%) rename src/{ => main/java}/com/jjoe64/graphview/ValueDependentColor.java (100%) rename src/{ => main/java}/com/jjoe64/graphview/compatible/RealScaleGestureDetector.java (100%) rename src/{ => main/java}/com/jjoe64/graphview/compatible/ScaleGestureDetector.java (100%) diff --git a/.gitignore b/.gitignore index 916a2c0cc..796b96d1c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,46 +1 @@ -# built application files -*.ap_ - -# files for the dex VM -*.dex - -# Java class files -*.class - -# generated files -bin/ -gen/ -lint.xml - -# Local configuration file (sdk path, etc) -local.properties - -# Eclipse project files -.classpath -.project -.settings -.checkstyle - -# Maven -target -release.properties -pom.xml.* - -# Ant -build.xml -ant.properties -local.properties -proguard.cfg -proguard-project.txt - -# Intellij project files -*.iml -*.ipr -*.iws -.idea/ -out/ -gen-external-apklibs/ - -# Gradle -.gradle -build \ No newline at end of file +/build diff --git a/GraphView.iml b/GraphView.iml new file mode 100644 index 000000000..e945a7072 --- /dev/null +++ b/GraphView.iml @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/build.gradle b/build.gradle index 8b86123cc..0d5638a25 100644 --- a/build.gradle +++ b/build.gradle @@ -1,24 +1,21 @@ -buildscript { - repositories { - mavenCentral() - } - - dependencies { - classpath 'com.android.tools.build:gradle:0.6.+' - } -} - apply plugin: 'android-library' android { - compileSdkVersion 17 - buildToolsVersion '17.0.0' + compileSdkVersion 19 + buildToolsVersion "19.0.1" - sourceSets { - main { - manifest.srcFile 'AndroidManifest.xml' - java.srcDirs = ['src'] - res.srcDirs = ['res'] - } + defaultConfig { + minSdkVersion 7 + targetSdkVersion 16 + versionCode 1 + versionName "1.0" } -} \ No newline at end of file + release { + runProguard false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' + } +} + +dependencies { + compile 'com.android.support:appcompat-v7:+' +} diff --git a/proguard-rules.txt b/proguard-rules.txt new file mode 100644 index 000000000..f62b0eb4f --- /dev/null +++ b/proguard-rules.txt @@ -0,0 +1,17 @@ +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in /home/jonas/android-studio/android-studio/sdk/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the ProGuard +# include property in project.properties. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# Add any project specific keep options here: + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} \ No newline at end of file diff --git a/project.properties b/project.properties deleted file mode 100644 index 484dab075..000000000 --- a/project.properties +++ /dev/null @@ -1,15 +0,0 @@ -# This file is automatically generated by Android Tools. -# Do not modify this file -- YOUR CHANGES WILL BE ERASED! -# -# This file must be checked in Version Control Systems. -# -# To customize properties used by the Ant build system edit -# "ant.properties", and override values to adapt the script to your -# project structure. -# -# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home): -#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt - -# Project target. -target=android-17 -android.library=true diff --git a/AndroidManifest.xml b/src/main/AndroidManifest.xml similarity index 87% rename from AndroidManifest.xml rename to src/main/AndroidManifest.xml index 7f08a835d..8226c091a 100644 --- a/AndroidManifest.xml +++ b/src/main/AndroidManifest.xml @@ -4,4 +4,7 @@ android:versionCode="1" android:versionName="1.0"> + + + diff --git a/src/com/jjoe64/graphview/BarGraphView.java b/src/main/java/com/jjoe64/graphview/BarGraphView.java similarity index 100% rename from src/com/jjoe64/graphview/BarGraphView.java rename to src/main/java/com/jjoe64/graphview/BarGraphView.java diff --git a/src/com/jjoe64/graphview/CustomLabelFormatter.java b/src/main/java/com/jjoe64/graphview/CustomLabelFormatter.java similarity index 100% rename from src/com/jjoe64/graphview/CustomLabelFormatter.java rename to src/main/java/com/jjoe64/graphview/CustomLabelFormatter.java diff --git a/src/com/jjoe64/graphview/GraphView.java b/src/main/java/com/jjoe64/graphview/GraphView.java similarity index 100% rename from src/com/jjoe64/graphview/GraphView.java rename to src/main/java/com/jjoe64/graphview/GraphView.java diff --git a/src/com/jjoe64/graphview/GraphViewDataInterface.java b/src/main/java/com/jjoe64/graphview/GraphViewDataInterface.java similarity index 100% rename from src/com/jjoe64/graphview/GraphViewDataInterface.java rename to src/main/java/com/jjoe64/graphview/GraphViewDataInterface.java diff --git a/src/com/jjoe64/graphview/GraphViewSeries.java b/src/main/java/com/jjoe64/graphview/GraphViewSeries.java similarity index 100% rename from src/com/jjoe64/graphview/GraphViewSeries.java rename to src/main/java/com/jjoe64/graphview/GraphViewSeries.java diff --git a/src/com/jjoe64/graphview/GraphViewStyle.java b/src/main/java/com/jjoe64/graphview/GraphViewStyle.java similarity index 100% rename from src/com/jjoe64/graphview/GraphViewStyle.java rename to src/main/java/com/jjoe64/graphview/GraphViewStyle.java diff --git a/src/com/jjoe64/graphview/LineGraphView.java b/src/main/java/com/jjoe64/graphview/LineGraphView.java similarity index 100% rename from src/com/jjoe64/graphview/LineGraphView.java rename to src/main/java/com/jjoe64/graphview/LineGraphView.java diff --git a/src/com/jjoe64/graphview/ValueDependentColor.java b/src/main/java/com/jjoe64/graphview/ValueDependentColor.java similarity index 100% rename from src/com/jjoe64/graphview/ValueDependentColor.java rename to src/main/java/com/jjoe64/graphview/ValueDependentColor.java diff --git a/src/com/jjoe64/graphview/compatible/RealScaleGestureDetector.java b/src/main/java/com/jjoe64/graphview/compatible/RealScaleGestureDetector.java similarity index 100% rename from src/com/jjoe64/graphview/compatible/RealScaleGestureDetector.java rename to src/main/java/com/jjoe64/graphview/compatible/RealScaleGestureDetector.java diff --git a/src/com/jjoe64/graphview/compatible/ScaleGestureDetector.java b/src/main/java/com/jjoe64/graphview/compatible/ScaleGestureDetector.java similarity index 100% rename from src/com/jjoe64/graphview/compatible/ScaleGestureDetector.java rename to src/main/java/com/jjoe64/graphview/compatible/ScaleGestureDetector.java From 73127bcfe92492d651a5c7fea28acc43e502035e Mon Sep 17 00:00:00 2001 From: jogehring Date: Tue, 24 Jun 2014 11:50:20 +0200 Subject: [PATCH 002/231] removed doc in master branch --- .gitignore | 1 + doc/allclasses-frame.html | 33 - doc/allclasses-noframe.html | 33 - doc/com/jjoe64/graphview/BarGraphView.html | 349 ------ .../graphview/CustomLabelFormatter.html | 233 ---- .../graphview/GraphView.GraphViewData.html | 343 ------ .../graphview/GraphView.LegendAlign.html | 341 ------ doc/com/jjoe64/graphview/GraphView.html | 1079 ----------------- .../graphview/GraphViewDataInterface.html | 234 ---- .../GraphViewSeries.GraphViewSeriesStyle.html | 351 ------ doc/com/jjoe64/graphview/GraphViewSeries.html | 408 ------- doc/com/jjoe64/graphview/GraphViewStyle.html | 522 -------- doc/com/jjoe64/graphview/LineGraphView.html | 421 ------- .../jjoe64/graphview/ValueDependentColor.html | 211 ---- .../class-use/GraphView.GraphViewData.html | 167 --- .../jjoe64/graphview/class-use/GraphView.html | 142 --- .../compatible/RealScaleGestureDetector.html | 250 ---- ...Detector.SimpleOnScaleGestureListener.html | 209 ---- .../compatible/ScaleGestureDetector.html | 314 ----- .../graphview/compatible/package-frame.html | 45 - .../graphview/compatible/package-summary.html | 165 --- .../graphview/compatible/package-tree.html | 160 --- doc/com/jjoe64/graphview/package-frame.html | 70 -- doc/com/jjoe64/graphview/package-summary.html | 219 ---- doc/com/jjoe64/graphview/package-tree.html | 173 --- doc/com/jjoe64/graphview/package-use.html | 155 --- doc/constant-values.html | 146 --- doc/deprecated-list.html | 144 --- doc/help-doc.html | 215 ---- doc/index-files/index-1.html | 140 --- doc/index-files/index-2.html | 144 --- doc/index-files/index-3.html | 149 --- doc/index-files/index-4.html | 143 --- doc/index-files/index-5.html | 152 --- doc/index.html | 36 - doc/overview-frame.html | 44 - doc/overview-tree.html | 152 --- doc/package-list | 2 - doc/resources/inherit.gif | Bin 57 -> 0 bytes doc/stylesheet.css | 29 - 40 files changed, 1 insertion(+), 8123 deletions(-) delete mode 100644 doc/allclasses-frame.html delete mode 100644 doc/allclasses-noframe.html delete mode 100644 doc/com/jjoe64/graphview/BarGraphView.html delete mode 100644 doc/com/jjoe64/graphview/CustomLabelFormatter.html delete mode 100644 doc/com/jjoe64/graphview/GraphView.GraphViewData.html delete mode 100644 doc/com/jjoe64/graphview/GraphView.LegendAlign.html delete mode 100644 doc/com/jjoe64/graphview/GraphView.html delete mode 100644 doc/com/jjoe64/graphview/GraphViewDataInterface.html delete mode 100644 doc/com/jjoe64/graphview/GraphViewSeries.GraphViewSeriesStyle.html delete mode 100644 doc/com/jjoe64/graphview/GraphViewSeries.html delete mode 100644 doc/com/jjoe64/graphview/GraphViewStyle.html delete mode 100644 doc/com/jjoe64/graphview/LineGraphView.html delete mode 100644 doc/com/jjoe64/graphview/ValueDependentColor.html delete mode 100644 doc/com/jjoe64/graphview/class-use/GraphView.GraphViewData.html delete mode 100644 doc/com/jjoe64/graphview/class-use/GraphView.html delete mode 100644 doc/com/jjoe64/graphview/compatible/RealScaleGestureDetector.html delete mode 100644 doc/com/jjoe64/graphview/compatible/ScaleGestureDetector.SimpleOnScaleGestureListener.html delete mode 100644 doc/com/jjoe64/graphview/compatible/ScaleGestureDetector.html delete mode 100644 doc/com/jjoe64/graphview/compatible/package-frame.html delete mode 100644 doc/com/jjoe64/graphview/compatible/package-summary.html delete mode 100644 doc/com/jjoe64/graphview/compatible/package-tree.html delete mode 100644 doc/com/jjoe64/graphview/package-frame.html delete mode 100644 doc/com/jjoe64/graphview/package-summary.html delete mode 100644 doc/com/jjoe64/graphview/package-tree.html delete mode 100644 doc/com/jjoe64/graphview/package-use.html delete mode 100644 doc/constant-values.html delete mode 100644 doc/deprecated-list.html delete mode 100644 doc/help-doc.html delete mode 100644 doc/index-files/index-1.html delete mode 100644 doc/index-files/index-2.html delete mode 100644 doc/index-files/index-3.html delete mode 100644 doc/index-files/index-4.html delete mode 100644 doc/index-files/index-5.html delete mode 100644 doc/index.html delete mode 100644 doc/overview-frame.html delete mode 100644 doc/overview-tree.html delete mode 100644 doc/package-list delete mode 100644 doc/resources/inherit.gif delete mode 100644 doc/stylesheet.css diff --git a/.gitignore b/.gitignore index 796b96d1c..68fc69184 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ +.DS_Store /build diff --git a/doc/allclasses-frame.html b/doc/allclasses-frame.html deleted file mode 100644 index 999a3111e..000000000 --- a/doc/allclasses-frame.html +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - -All Classes - - - - - - - - - - - -All Classes -
- - - - - -
GraphView -
-GraphView.GraphViewData -
-
- - - diff --git a/doc/allclasses-noframe.html b/doc/allclasses-noframe.html deleted file mode 100644 index 82a2eb36d..000000000 --- a/doc/allclasses-noframe.html +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - -All Classes - - - - - - - - - - - -All Classes -
- - - - - -
GraphView -
-GraphView.GraphViewData -
-
- - - diff --git a/doc/com/jjoe64/graphview/BarGraphView.html b/doc/com/jjoe64/graphview/BarGraphView.html deleted file mode 100644 index 53e538112..000000000 --- a/doc/com/jjoe64/graphview/BarGraphView.html +++ /dev/null @@ -1,349 +0,0 @@ - - - - - - -BarGraphView - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- -com.jjoe64.graphview -
-Class BarGraphView

-
-java.lang.Object
-  extended by LinearLayout
-      extended by com.jjoe64.graphview.GraphView
-          extended by com.jjoe64.graphview.BarGraphView
-
-
-
-
public class BarGraphView
extends GraphView
- - -

-Draws a Bar Chart -

- -

-

-
Author:
-
Muhammad Shahab Hameed
-
-
- -

- - - - - - - -
-Nested Class Summary
- - - - - - - -
Nested classes/interfaces inherited from class com.jjoe64.graphview.GraphView
GraphView.GraphViewData, GraphView.LegendAlign
-  - - - - - - - -
-Field Summary
- - - - - - - -
Fields inherited from class com.jjoe64.graphview.GraphView
paint
-  - - - - - - - - - - - - - -
-Constructor Summary
BarGraphView(Context context, - AttributeSet attrs) - -
-           
BarGraphView(Context context, - java.lang.String title) - -
-           
-  - - - - - - - - - - - -
-Method Summary
- voiddrawSeries(Canvas canvas, - GraphViewDataInterface[] values, - float graphwidth, - float graphheight, - float border, - double minX, - double minY, - double diffX, - double diffY, - float horstart, - GraphViewSeries.GraphViewSeriesStyle style) - -
-           
- - - - - - - -
Methods inherited from class com.jjoe64.graphview.GraphView
addSeries, drawLegend, formatLabel, getCustomLabelFormatter, getGraphViewStyle, getLegendAlign, getLegendWidth, getMaxX, getMaxY, getMinX, getMinY, isDisableTouch, isScrollable, isShowLegend, redrawAll, removeAllSeries, removeSeries, removeSeries, scrollToEnd, setCustomLabelFormatter, setDisableTouch, setGraphViewStyle, setHorizontalLabels, setLegendAlign, setLegendWidth, setManualYAxis, setManualYAxisBounds, setScalable, setScrollable, setShowLegend, setTitle, setVerticalLabels, setViewPort
- - - - - - - -
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
-  -

- - - - - - - - -
-Constructor Detail
- -

-BarGraphView

-
-public BarGraphView(Context context,
-                    AttributeSet attrs)
-
-
-
- -

-BarGraphView

-
-public BarGraphView(Context context,
-                    java.lang.String title)
-
-
- - - - - - - - -
-Method Detail
- -

-drawSeries

-
-public void drawSeries(Canvas canvas,
-                       GraphViewDataInterface[] values,
-                       float graphwidth,
-                       float graphheight,
-                       float border,
-                       double minX,
-                       double minY,
-                       double diffX,
-                       double diffY,
-                       float horstart,
-                       GraphViewSeries.GraphViewSeriesStyle style)
-
-
-
Specified by:
drawSeries in class GraphView
-
-
-
-
-
- -
- - - - - - - - - - - - - - - - - - - -
- -
- - - -
- - - diff --git a/doc/com/jjoe64/graphview/CustomLabelFormatter.html b/doc/com/jjoe64/graphview/CustomLabelFormatter.html deleted file mode 100644 index 1b441c07b..000000000 --- a/doc/com/jjoe64/graphview/CustomLabelFormatter.html +++ /dev/null @@ -1,233 +0,0 @@ - - - - - - -CustomLabelFormatter - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- -com.jjoe64.graphview -
-Interface CustomLabelFormatter

-
-
-
public interface CustomLabelFormatter
- - -

-if you want to show different labels, - you can use this label formatter. - As Input you get the raw value (x or y) and - you return a String that will be displayed. - graphView.setCustomLabelFormatter(new CustomLabelFormatter() { - public String formatLabel(double value, boolean isValueX) { - if (isValueX) { - if (value < 5) { - return "small"; - } else if (value < 15) { - return "middle"; - } else { - return "big"; - } - } - return null; // let graphview generate Y-axis label for us - } - }); - -

- -

-


- -

- - - - - - - - - - - - -
-Method Summary
- java.lang.StringformatLabel(double value, - boolean isValueX) - -
-          will be called when the labels were generated
-  -

- - - - - - - - -
-Method Detail
- -

-formatLabel

-
-java.lang.String formatLabel(double value,
-                             boolean isValueX)
-
-
will be called when the labels were generated -

-

-
Parameters:
value - the raw input value (x or y)
isValueX - true if value is a x-value, false if otherwise -
Returns:
the string that will be displayed. return null if you want graphview to generate the label for you.
-
-
- -
- - - - - - - - - - - - - - - - - - - -
- -
- - - -
- - - diff --git a/doc/com/jjoe64/graphview/GraphView.GraphViewData.html b/doc/com/jjoe64/graphview/GraphView.GraphViewData.html deleted file mode 100644 index b285a7eab..000000000 --- a/doc/com/jjoe64/graphview/GraphView.GraphViewData.html +++ /dev/null @@ -1,343 +0,0 @@ - - - - - - -GraphView.GraphViewData - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- -com.jjoe64.graphview -
-Class GraphView.GraphViewData

-
-java.lang.Object
-  extended by com.jjoe64.graphview.GraphView.GraphViewData
-
-
-
All Implemented Interfaces:
GraphViewDataInterface
-
-
-
Enclosing class:
GraphView
-
-
-
-
public static class GraphView.GraphViewData
extends java.lang.Object
implements GraphViewDataInterface
- - -

-one data set for a graph series -

- -

-


- -

- - - - - - - - - - - - - - - -
-Field Summary
- doublevalueX - -
-           
- doublevalueY - -
-           
-  - - - - - - - - - - -
-Constructor Summary
GraphView.GraphViewData(double valueX, - double valueY) - -
-           
-  - - - - - - - - - - - - - - - -
-Method Summary
- doublegetX() - -
-           
- doublegetY() - -
-           
- - - - - - - -
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
-  -

- - - - - - - - -
-Field Detail
- -

-valueX

-
-public final double valueX
-
-
-
-
-
- -

-valueY

-
-public final double valueY
-
-
-
-
- - - - - - - - -
-Constructor Detail
- -

-GraphView.GraphViewData

-
-public GraphView.GraphViewData(double valueX,
-                               double valueY)
-
-
- - - - - - - - -
-Method Detail
- -

-getX

-
-public double getX()
-
-
-
Specified by:
getX in interface GraphViewDataInterface
-
-
-
-
-
-
- -

-getY

-
-public double getY()
-
-
-
Specified by:
getY in interface GraphViewDataInterface
-
-
-
-
-
- -
- - - - - - - - - - - - - - - - - - - -
- -
- - - -
- - - diff --git a/doc/com/jjoe64/graphview/GraphView.LegendAlign.html b/doc/com/jjoe64/graphview/GraphView.LegendAlign.html deleted file mode 100644 index 52e284555..000000000 --- a/doc/com/jjoe64/graphview/GraphView.LegendAlign.html +++ /dev/null @@ -1,341 +0,0 @@ - - - - - - -GraphView.LegendAlign - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- -com.jjoe64.graphview -
-Enum GraphView.LegendAlign

-
-java.lang.Object
-  extended by java.lang.Enum<GraphView.LegendAlign>
-      extended by com.jjoe64.graphview.GraphView.LegendAlign
-
-
-
All Implemented Interfaces:
java.io.Serializable, java.lang.Comparable<GraphView.LegendAlign>
-
-
-
Enclosing class:
GraphView
-
-
-
-
public static enum GraphView.LegendAlign
extends java.lang.Enum<GraphView.LegendAlign>
- - -

-


- -

- - - - - - - - - - - - - - - - -
-Enum Constant Summary
BOTTOM - -
-           
MIDDLE - -
-           
TOP - -
-           
-  - - - - - - - - - - - - - - - -
-Method Summary
-static GraphView.LegendAlignvalueOf(java.lang.String name) - -
-          Returns the enum constant of this type with the specified name.
-static GraphView.LegendAlign[]values() - -
-          Returns an array containing the constants of this enum type, in -the order they are declared.
- - - - - - - -
Methods inherited from class java.lang.Enum
clone, compareTo, equals, finalize, getDeclaringClass, hashCode, name, ordinal, toString, valueOf
- - - - - - - -
Methods inherited from class java.lang.Object
getClass, notify, notifyAll, wait, wait, wait
-  -

- - - - - - - - -
-Enum Constant Detail
- -

-TOP

-
-public static final GraphView.LegendAlign TOP
-
-
-
-
-
- -

-MIDDLE

-
-public static final GraphView.LegendAlign MIDDLE
-
-
-
-
-
- -

-BOTTOM

-
-public static final GraphView.LegendAlign BOTTOM
-
-
-
-
- - - - - - - - -
-Method Detail
- -

-values

-
-public static GraphView.LegendAlign[] values()
-
-
Returns an array containing the constants of this enum type, in -the order they are declared. This method may be used to iterate -over the constants as follows: -
-for (GraphView.LegendAlign c : GraphView.LegendAlign.values())
-    System.out.println(c);
-
-

-

- -
Returns:
an array containing the constants of this enum type, in -the order they are declared
-
-
-
- -

-valueOf

-
-public static GraphView.LegendAlign valueOf(java.lang.String name)
-
-
Returns the enum constant of this type with the specified name. -The string must match exactly an identifier used to declare an -enum constant in this type. (Extraneous whitespace characters are -not permitted.) -

-

-
Parameters:
name - the name of the enum constant to be returned. -
Returns:
the enum constant with the specified name -
Throws: -
java.lang.IllegalArgumentException - if this enum type has no constant -with the specified name -
java.lang.NullPointerException - if the argument is null
-
-
- -
- - - - - - - - - - - - - - - - - - - -
- -
- - - -
- - - diff --git a/doc/com/jjoe64/graphview/GraphView.html b/doc/com/jjoe64/graphview/GraphView.html deleted file mode 100644 index 08cad70c6..000000000 --- a/doc/com/jjoe64/graphview/GraphView.html +++ /dev/null @@ -1,1079 +0,0 @@ - - - - - - -GraphView - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- -com.jjoe64.graphview -
-Class GraphView

-
-java.lang.Object
-  extended by LinearLayout
-      extended by com.jjoe64.graphview.GraphView
-
-
-
Direct Known Subclasses:
BarGraphView, LineGraphView
-
-
-
-
public abstract class GraphView
extends LinearLayout
- - -

-GraphView is a Android View for creating zoomable and scrollable graphs. - This is the abstract base class for all graphs. Extend this class and implement #drawSeries(Canvas, GraphViewDataInterface[], float, float, float, double, double, double, double, float) to display a custom graph. - Use LineGraphView for creating a line chart. -

- -

-

-
Author:
-
jjoe64 - jonas gehring - http://www.jjoe64.com - - Copyright (C) 2011 Jonas Gehring - Licensed under the GNU Lesser General Public License (LGPL) - http://www.gnu.org/licenses/lgpl.html
-
-
- -

- - - - - - - - - - - - - - - -
-Nested Class Summary
-static classGraphView.GraphViewData - -
-          one data set for a graph series
-static classGraphView.LegendAlign - -
-           
- - - - - - - - - - -
-Field Summary
-protected  Paintpaint - -
-           
-  - - - - - - - - - - - - - -
-Constructor Summary
GraphView(Context context, - AttributeSet attrs) - -
-           
GraphView(Context context, - java.lang.String title) - -
-           
-  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-Method Summary
- voidaddSeries(GraphViewSeries series) - -
-          add a series of data to the graph
-protected  voiddrawLegend(Canvas canvas, - float height, - float width) - -
-           
-protected abstract  voiddrawSeries(Canvas canvas, - GraphViewDataInterface[] values, - float graphwidth, - float graphheight, - float border, - double minX, - double minY, - double diffX, - double diffY, - float horstart, - GraphViewSeries.GraphViewSeriesStyle style) - -
-           
-protected  java.lang.StringformatLabel(double value, - boolean isValueX) - -
-          Deprecated. use setCustomLabelFormatter(CustomLabelFormatter)
- CustomLabelFormattergetCustomLabelFormatter() - -
-           
- GraphViewStylegetGraphViewStyle() - -
-           
- GraphView.LegendAligngetLegendAlign() - -
-          get the position of the legend
- floatgetLegendWidth() - -
-           
-protected  doublegetMaxX(boolean ignoreViewport) - -
-          returns the maximal X value of the current viewport (if viewport is set) - otherwise maximal X value of all data.
-protected  doublegetMaxY() - -
-          returns the maximal Y value of all data.
-protected  doublegetMinX(boolean ignoreViewport) - -
-          returns the minimal X value of the current viewport (if viewport is set) - otherwise minimal X value of all data.
-protected  doublegetMinY() - -
-          returns the minimal Y value of all data.
- booleanisDisableTouch() - -
-           
- booleanisScrollable() - -
-           
- booleanisShowLegend() - -
-           
- voidredrawAll() - -
-          forces graphview to invalide all views and caches.
- voidremoveAllSeries() - -
-          removes all series
- voidremoveSeries(GraphViewSeries series) - -
-          removes a series
- voidremoveSeries(int index) - -
-          removes series
- voidscrollToEnd() - -
-          scrolls to the last x-value
- voidsetCustomLabelFormatter(CustomLabelFormatter customLabelFormatter) - -
-          set a custom label formatter
- voidsetDisableTouch(boolean disableTouch) - -
-          The user can disable any touch gestures, this is useful if you are using a real time graph, but don't want the user to interact
- voidsetGraphViewStyle(GraphViewStyle style) - -
-          set custom graphview style
- voidsetHorizontalLabels(java.lang.String[] horlabels) - -
-          set's static horizontal labels (from left to right)
- voidsetLegendAlign(GraphView.LegendAlign legendAlign) - -
-          legend position
- voidsetLegendWidth(float legendWidth) - -
-          legend width
- voidsetManualYAxis(boolean manualYAxis) - -
-          you have to set the bounds setManualYAxisBounds(double, double).
- voidsetManualYAxisBounds(double max, - double min) - -
-          set manual Y axis limit
- voidsetScalable(boolean scalable) - -
-          this forces scrollable = true
- voidsetScrollable(boolean scrollable) - -
-          the user can scroll (horizontal) the graph.
- voidsetShowLegend(boolean showLegend) - -
-           
- voidsetTitle(java.lang.String title) - -
-          sets the title of graphview
- voidsetVerticalLabels(java.lang.String[] verlabels) - -
-          set's static vertical labels (from top to bottom)
- voidsetViewPort(double start, - double size) - -
-          set's the viewport for the graph.
- - - - - - - -
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
-  -

- - - - - - - - -
-Field Detail
- -

-paint

-
-protected final Paint paint
-
-
-
-
- - - - - - - - -
-Constructor Detail
- -

-GraphView

-
-public GraphView(Context context,
-                 AttributeSet attrs)
-
-
-
- -

-GraphView

-
-public GraphView(Context context,
-                 java.lang.String title)
-
-
-
Parameters:
context -
title - [optional]
-
- - - - - - - - -
-Method Detail
- -

-addSeries

-
-public void addSeries(GraphViewSeries series)
-
-
add a series of data to the graph -

-

-
Parameters:
series -
-
-
-
- -

-drawLegend

-
-protected void drawLegend(Canvas canvas,
-                          float height,
-                          float width)
-
-
-
-
-
-
- -

-drawSeries

-
-protected abstract void drawSeries(Canvas canvas,
-                                   GraphViewDataInterface[] values,
-                                   float graphwidth,
-                                   float graphheight,
-                                   float border,
-                                   double minX,
-                                   double minY,
-                                   double diffX,
-                                   double diffY,
-                                   float horstart,
-                                   GraphViewSeries.GraphViewSeriesStyle style)
-
-
-
-
-
-
- -

-formatLabel

-
-@Deprecated
-protected java.lang.String formatLabel(double value,
-                                                  boolean isValueX)
-
-
Deprecated. use setCustomLabelFormatter(CustomLabelFormatter) -

-

formats the label - use #setCustomLabelFormatter or static labels if you want custom labels -

-

-
Parameters:
value - x and y values
isValueX - if false, value y wants to be formatted -
Returns:
value to display
-
-
-
- -

-getCustomLabelFormatter

-
-public CustomLabelFormatter getCustomLabelFormatter()
-
-
- -
Returns:
the custom label formatter, if there is one. otherwise null
-
-
-
- -

-getGraphViewStyle

-
-public GraphViewStyle getGraphViewStyle()
-
-
- -
Returns:
the graphview style. it will never be null.
-
-
-
- -

-getLegendAlign

-
-public GraphView.LegendAlign getLegendAlign()
-
-
get the position of the legend -

-

- -
Returns:
-
-
-
- -

-getLegendWidth

-
-public float getLegendWidth()
-
-
- -
Returns:
legend width
-
-
-
- -

-getMaxX

-
-protected double getMaxX(boolean ignoreViewport)
-
-
returns the maximal X value of the current viewport (if viewport is set) - otherwise maximal X value of all data. -

-

-
Parameters:
ignoreViewport - warning: only override this, if you really know want you're doing!
-
-
-
- -

-getMaxY

-
-protected double getMaxY()
-
-
returns the maximal Y value of all data. - - warning: only override this, if you really know want you're doing! -

-

-
-
-
-
- -

-getMinX

-
-protected double getMinX(boolean ignoreViewport)
-
-
returns the minimal X value of the current viewport (if viewport is set) - otherwise minimal X value of all data. -

-

-
Parameters:
ignoreViewport - warning: only override this, if you really know want you're doing!
-
-
-
- -

-getMinY

-
-protected double getMinY()
-
-
returns the minimal Y value of all data. - - warning: only override this, if you really know want you're doing! -

-

-
-
-
-
- -

-isDisableTouch

-
-public boolean isDisableTouch()
-
-
-
-
-
-
- -

-isScrollable

-
-public boolean isScrollable()
-
-
-
-
-
-
- -

-isShowLegend

-
-public boolean isShowLegend()
-
-
-
-
-
-
- -

-redrawAll

-
-public void redrawAll()
-
-
forces graphview to invalide all views and caches. - Normally there is no need to call this manually. -

-

-
-
-
-
- -

-removeAllSeries

-
-public void removeAllSeries()
-
-
removes all series -

-

-
-
-
-
- -

-removeSeries

-
-public void removeSeries(GraphViewSeries series)
-
-
removes a series -

-

-
Parameters:
series - series to remove
-
-
-
- -

-removeSeries

-
-public void removeSeries(int index)
-
-
removes series -

-

-
Parameters:
index -
-
-
-
- -

-scrollToEnd

-
-public void scrollToEnd()
-
-
scrolls to the last x-value -

-

- -
Throws: -
java.lang.IllegalStateException - if scrollable == false
-
-
-
- -

-setCustomLabelFormatter

-
-public void setCustomLabelFormatter(CustomLabelFormatter customLabelFormatter)
-
-
set a custom label formatter -

-

-
Parameters:
customLabelFormatter -
-
-
-
- -

-setDisableTouch

-
-public void setDisableTouch(boolean disableTouch)
-
-
The user can disable any touch gestures, this is useful if you are using a real time graph, but don't want the user to interact -

-

-
Parameters:
disableTouch -
-
-
-
- -

-setGraphViewStyle

-
-public void setGraphViewStyle(GraphViewStyle style)
-
-
set custom graphview style -

-

-
Parameters:
style -
-
-
-
- -

-setHorizontalLabels

-
-public void setHorizontalLabels(java.lang.String[] horlabels)
-
-
set's static horizontal labels (from left to right) -

-

-
Parameters:
horlabels - if null, labels were generated automatically
-
-
-
- -

-setLegendAlign

-
-public void setLegendAlign(GraphView.LegendAlign legendAlign)
-
-
legend position -

-

-
Parameters:
legendAlign -
-
-
-
- -

-setLegendWidth

-
-public void setLegendWidth(float legendWidth)
-
-
legend width -

-

-
Parameters:
legendWidth -
-
-
-
- -

-setManualYAxis

-
-public void setManualYAxis(boolean manualYAxis)
-
-
you have to set the bounds setManualYAxisBounds(double, double). That automatically enables manualYAxis-flag. - if you want to disable the menual y axis, call this method with false. -

-

-
Parameters:
manualYAxis -
-
-
-
- -

-setManualYAxisBounds

-
-public void setManualYAxisBounds(double max,
-                                 double min)
-
-
set manual Y axis limit -

-

-
Parameters:
max -
min -
-
-
-
- -

-setScalable

-
-public void setScalable(boolean scalable)
-
-
this forces scrollable = true -

-

-
Parameters:
scalable -
-
-
-
- -

-setScrollable

-
-public void setScrollable(boolean scrollable)
-
-
the user can scroll (horizontal) the graph. This is only useful if you use a viewport setViewPort(double, double) which doesn't displays all data. -

-

-
Parameters:
scrollable -
-
-
-
- -

-setShowLegend

-
-public void setShowLegend(boolean showLegend)
-
-
-
-
-
-
- -

-setTitle

-
-public void setTitle(java.lang.String title)
-
-
sets the title of graphview -

-

-
Parameters:
title -
-
-
-
- -

-setVerticalLabels

-
-public void setVerticalLabels(java.lang.String[] verlabels)
-
-
set's static vertical labels (from top to bottom) -

-

-
Parameters:
verlabels - if null, labels were generated automatically
-
-
-
- -

-setViewPort

-
-public void setViewPort(double start,
-                        double size)
-
-
set's the viewport for the graph. -

-

-
Parameters:
start - x-value
size -
See Also:
to limit the y-viewport
-
-
- -
- - - - - - - - - - - - - - - - - - - -
- -
- - - -
- - - diff --git a/doc/com/jjoe64/graphview/GraphViewDataInterface.html b/doc/com/jjoe64/graphview/GraphViewDataInterface.html deleted file mode 100644 index d8d9bf8cc..000000000 --- a/doc/com/jjoe64/graphview/GraphViewDataInterface.html +++ /dev/null @@ -1,234 +0,0 @@ - - - - - - -GraphViewDataInterface - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- -com.jjoe64.graphview -
-Interface GraphViewDataInterface

-
-
All Known Implementing Classes:
GraphView.GraphViewData
-
-
-
-
public interface GraphViewDataInterface
- - -

-the base interface for the graphview data. - you can use your own data models, when they implement - this interface. -

- -

-


- -

- - - - - - - - - - - - - - - - -
-Method Summary
- doublegetX() - -
-           
- doublegetY() - -
-           
-  -

- - - - - - - - -
-Method Detail
- -

-getX

-
-double getX()
-
-
-
-
-
-
- -

-getY

-
-double getY()
-
-
-
-
-
- -
- - - - - - - - - - - - - - - - - - - -
- -
- - - -
- - - diff --git a/doc/com/jjoe64/graphview/GraphViewSeries.GraphViewSeriesStyle.html b/doc/com/jjoe64/graphview/GraphViewSeries.GraphViewSeriesStyle.html deleted file mode 100644 index 0f471a63d..000000000 --- a/doc/com/jjoe64/graphview/GraphViewSeries.GraphViewSeriesStyle.html +++ /dev/null @@ -1,351 +0,0 @@ - - - - - - -GraphViewSeries.GraphViewSeriesStyle - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- -com.jjoe64.graphview -
-Class GraphViewSeries.GraphViewSeriesStyle

-
-java.lang.Object
-  extended by com.jjoe64.graphview.GraphViewSeries.GraphViewSeriesStyle
-
-
-
Enclosing class:
GraphViewSeries
-
-
-
-
public static class GraphViewSeries.GraphViewSeriesStyle
extends java.lang.Object
- - -

-graph series style: color and thickness -

- -

-


- -

- - - - - - - - - - - - - - - -
-Field Summary
- intcolor - -
-           
- intthickness - -
-           
-  - - - - - - - - - - - - - -
-Constructor Summary
GraphViewSeries.GraphViewSeriesStyle() - -
-           
GraphViewSeries.GraphViewSeriesStyle(int color, - int thickness) - -
-           
-  - - - - - - - - - - - - - - - -
-Method Summary
- ValueDependentColorgetValueDependentColor() - -
-           
- voidsetValueDependentColor(ValueDependentColor valueDependentColor) - -
-          the color depends on the value of the data.
- - - - - - - -
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
-  -

- - - - - - - - -
-Field Detail
- -

-color

-
-public int color
-
-
-
-
-
- -

-thickness

-
-public int thickness
-
-
-
-
- - - - - - - - -
-Constructor Detail
- -

-GraphViewSeries.GraphViewSeriesStyle

-
-public GraphViewSeries.GraphViewSeriesStyle()
-
-
-
- -

-GraphViewSeries.GraphViewSeriesStyle

-
-public GraphViewSeries.GraphViewSeriesStyle(int color,
-                                            int thickness)
-
-
- - - - - - - - -
-Method Detail
- -

-getValueDependentColor

-
-public ValueDependentColor getValueDependentColor()
-
-
-
-
-
-
- -

-setValueDependentColor

-
-public void setValueDependentColor(ValueDependentColor valueDependentColor)
-
-
the color depends on the value of the data. - only possible in BarGraphView -

-

-
Parameters:
valueDependentColor -
-
-
- -
- - - - - - - - - - - - - - - - - - - -
- -
- - - -
- - - diff --git a/doc/com/jjoe64/graphview/GraphViewSeries.html b/doc/com/jjoe64/graphview/GraphViewSeries.html deleted file mode 100644 index ebcf39402..000000000 --- a/doc/com/jjoe64/graphview/GraphViewSeries.html +++ /dev/null @@ -1,408 +0,0 @@ - - - - - - -GraphViewSeries - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- -com.jjoe64.graphview -
-Class GraphViewSeries

-
-java.lang.Object
-  extended by com.jjoe64.graphview.GraphViewSeries
-
-
-
-
public class GraphViewSeries
extends java.lang.Object
- - -

-a graphview series. - holds the data, description and styles -

- -

-


- -

- - - - - - - - - - - -
-Nested Class Summary
-static classGraphViewSeries.GraphViewSeriesStyle - -
-          graph series style: color and thickness
-  - - - - - - - - - - - - - -
-Constructor Summary
GraphViewSeries(GraphViewDataInterface[] values) - -
-           
GraphViewSeries(java.lang.String description, - GraphViewSeries.GraphViewSeriesStyle style, - GraphViewDataInterface[] values) - -
-           
-  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-Method Summary
- voidaddGraphView(GraphView graphView) - -
-          this graphview will be redrawn if data changes
- voidappendData(GraphViewDataInterface value, - boolean scrollToEnd) - -
-          Deprecated. please use appendData(GraphViewDataInterface, boolean, int) to avoid memory overflow
- voidappendData(GraphViewDataInterface value, - boolean scrollToEnd, - int maxDataCount) - -
-          add one data to current data
- GraphViewSeries.GraphViewSeriesStylegetStyle() - -
-           
- voidremoveGraphView(GraphView graphView) - -
-          you should use GraphView.removeSeries(GraphViewSeries)
- voidresetData(GraphViewDataInterface[] values) - -
-          clears the current data and set the new.
- - - - - - - -
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
-  -

- - - - - - - - -
-Constructor Detail
- -

-GraphViewSeries

-
-public GraphViewSeries(GraphViewDataInterface[] values)
-
-
-
- -

-GraphViewSeries

-
-public GraphViewSeries(java.lang.String description,
-                       GraphViewSeries.GraphViewSeriesStyle style,
-                       GraphViewDataInterface[] values)
-
-
- - - - - - - - -
-Method Detail
- -

-addGraphView

-
-public void addGraphView(GraphView graphView)
-
-
this graphview will be redrawn if data changes -

-

-
Parameters:
graphView -
-
-
-
- -

-appendData

-
-@Deprecated
-public void appendData(GraphViewDataInterface value,
-                                  boolean scrollToEnd)
-
-
Deprecated. please use appendData(GraphViewDataInterface, boolean, int) to avoid memory overflow -

-

add one data to current data -

-

-
Parameters:
value - the new data to append
scrollToEnd - true => graphview will scroll to the end (maxX)
-
-
-
- -

-appendData

-
-public void appendData(GraphViewDataInterface value,
-                       boolean scrollToEnd,
-                       int maxDataCount)
-
-
add one data to current data -

-

-
Parameters:
value - the new data to append
scrollToEnd - true => graphview will scroll to the end (maxX)
maxDataCount - if max data count is reached, the oldest data value will be lost
-
-
-
- -

-getStyle

-
-public GraphViewSeries.GraphViewSeriesStyle getStyle()
-
-
- -
Returns:
series styles. never null
-
-
-
- -

-removeGraphView

-
-public void removeGraphView(GraphView graphView)
-
-
you should use GraphView.removeSeries(GraphViewSeries) -

-

-
Parameters:
graphView -
-
-
-
- -

-resetData

-
-public void resetData(GraphViewDataInterface[] values)
-
-
clears the current data and set the new. - redraws the graphview(s) -

-

-
Parameters:
values - new data
-
-
- -
- - - - - - - - - - - - - - - - - - - -
- -
- - - -
- - - diff --git a/doc/com/jjoe64/graphview/GraphViewStyle.html b/doc/com/jjoe64/graphview/GraphViewStyle.html deleted file mode 100644 index 8f3c7f2df..000000000 --- a/doc/com/jjoe64/graphview/GraphViewStyle.html +++ /dev/null @@ -1,522 +0,0 @@ - - - - - - -GraphViewStyle - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- -com.jjoe64.graphview -
-Class GraphViewStyle

-
-java.lang.Object
-  extended by com.jjoe64.graphview.GraphViewStyle
-
-
-
-
public class GraphViewStyle
extends java.lang.Object
- - -

-Styles for the GraphView - Important: Use GraphViewSeries.GraphViewSeriesStyle for series-specify styling -

- -

-


- -

- - - - - - - - - - - - - - -
-Constructor Summary
GraphViewStyle() - -
-           
GraphViewStyle(int vLabelsColor, - int hLabelsColor, - int gridColor) - -
-           
-  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-Method Summary
- intgetGridColor() - -
-           
- intgetHorizontalLabelsColor() - -
-           
- intgetNumHorizontalLabels() - -
-           
- intgetNumVerticalLabels() - -
-           
- floatgetTextSize() - -
-           
- intgetVerticalLabelsColor() - -
-           
- intgetVerticalLabelsWidth() - -
-           
- voidsetGridColor(int c) - -
-           
- voidsetHorizontalLabelsColor(int c) - -
-           
- voidsetNumHorizontalLabels(int numHorizontalLabels) - -
-           
- voidsetNumVerticalLabels(int numVerticalLabels) - -
-           
- voidsetTextSize(float textSize) - -
-           
- voidsetVerticalLabelsColor(int c) - -
-           
- voidsetVerticalLabelsWidth(int verticalLabelsWidth) - -
-           
- - - - - - - -
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
-  -

- - - - - - - - -
-Constructor Detail
- -

-GraphViewStyle

-
-public GraphViewStyle()
-
-
-
- -

-GraphViewStyle

-
-public GraphViewStyle(int vLabelsColor,
-                      int hLabelsColor,
-                      int gridColor)
-
-
- - - - - - - - -
-Method Detail
- -

-getGridColor

-
-public int getGridColor()
-
-
-
-
-
-
- -

-getHorizontalLabelsColor

-
-public int getHorizontalLabelsColor()
-
-
-
-
-
-
- -

-getNumHorizontalLabels

-
-public int getNumHorizontalLabels()
-
-
-
-
-
-
- -

-getNumVerticalLabels

-
-public int getNumVerticalLabels()
-
-
-
-
-
-
- -

-getTextSize

-
-public float getTextSize()
-
-
-
-
-
-
- -

-getVerticalLabelsColor

-
-public int getVerticalLabelsColor()
-
-
-
-
-
-
- -

-getVerticalLabelsWidth

-
-public int getVerticalLabelsWidth()
-
-
-
-
-
-
- -

-setGridColor

-
-public void setGridColor(int c)
-
-
-
-
-
-
- -

-setHorizontalLabelsColor

-
-public void setHorizontalLabelsColor(int c)
-
-
-
-
-
-
- -

-setNumHorizontalLabels

-
-public void setNumHorizontalLabels(int numHorizontalLabels)
-
-
-
Parameters:
numHorizontalLabels - 0 = auto
-
-
-
- -

-setNumVerticalLabels

-
-public void setNumVerticalLabels(int numVerticalLabels)
-
-
-
Parameters:
numVerticalLabels - 0 = auto
-
-
-
- -

-setTextSize

-
-public void setTextSize(float textSize)
-
-
-
-
-
-
- -

-setVerticalLabelsColor

-
-public void setVerticalLabelsColor(int c)
-
-
-
-
-
-
- -

-setVerticalLabelsWidth

-
-public void setVerticalLabelsWidth(int verticalLabelsWidth)
-
-
-
Parameters:
verticalLabelsWidth - 0 = auto
-
-
- -
- - - - - - - - - - - - - - - - - - - -
- -
- - - -
- - - diff --git a/doc/com/jjoe64/graphview/LineGraphView.html b/doc/com/jjoe64/graphview/LineGraphView.html deleted file mode 100644 index d18b516b8..000000000 --- a/doc/com/jjoe64/graphview/LineGraphView.html +++ /dev/null @@ -1,421 +0,0 @@ - - - - - - -LineGraphView - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- -com.jjoe64.graphview -
-Class LineGraphView

-
-java.lang.Object
-  extended by LinearLayout
-      extended by com.jjoe64.graphview.GraphView
-          extended by com.jjoe64.graphview.LineGraphView
-
-
-
-
public class LineGraphView
extends GraphView
- - -

-Line Graph View. This draws a line chart. -

- -

-


- -

- - - - - - - -
-Nested Class Summary
- - - - - - - -
Nested classes/interfaces inherited from class com.jjoe64.graphview.GraphView
GraphView.GraphViewData, GraphView.LegendAlign
-  - - - - - - - -
-Field Summary
- - - - - - - -
Fields inherited from class com.jjoe64.graphview.GraphView
paint
-  - - - - - - - - - - - - - -
-Constructor Summary
LineGraphView(Context context, - AttributeSet attrs) - -
-           
LineGraphView(Context context, - java.lang.String title) - -
-           
-  - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-Method Summary
- voiddrawSeries(Canvas canvas, - GraphViewDataInterface[] values, - float graphwidth, - float graphheight, - float border, - double minX, - double minY, - double diffX, - double diffY, - float horstart, - GraphViewSeries.GraphViewSeriesStyle style) - -
-           
- intgetBackgroundColor() - -
-           
- booleangetDrawBackground() - -
-           
- voidsetBackgroundColor(int color) - -
-           
- voidsetDrawBackground(boolean drawBackground) - -
-           
- - - - - - - -
Methods inherited from class com.jjoe64.graphview.GraphView
addSeries, drawLegend, formatLabel, getCustomLabelFormatter, getGraphViewStyle, getLegendAlign, getLegendWidth, getMaxX, getMaxY, getMinX, getMinY, isDisableTouch, isScrollable, isShowLegend, redrawAll, removeAllSeries, removeSeries, removeSeries, scrollToEnd, setCustomLabelFormatter, setDisableTouch, setGraphViewStyle, setHorizontalLabels, setLegendAlign, setLegendWidth, setManualYAxis, setManualYAxisBounds, setScalable, setScrollable, setShowLegend, setTitle, setVerticalLabels, setViewPort
- - - - - - - -
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
-  -

- - - - - - - - -
-Constructor Detail
- -

-LineGraphView

-
-public LineGraphView(Context context,
-                     AttributeSet attrs)
-
-
-
- -

-LineGraphView

-
-public LineGraphView(Context context,
-                     java.lang.String title)
-
-
- - - - - - - - -
-Method Detail
- -

-drawSeries

-
-public void drawSeries(Canvas canvas,
-                       GraphViewDataInterface[] values,
-                       float graphwidth,
-                       float graphheight,
-                       float border,
-                       double minX,
-                       double minY,
-                       double diffX,
-                       double diffY,
-                       float horstart,
-                       GraphViewSeries.GraphViewSeriesStyle style)
-
-
-
Specified by:
drawSeries in class GraphView
-
-
-
-
-
-
- -

-getBackgroundColor

-
-public int getBackgroundColor()
-
-
-
-
-
-
- -

-getDrawBackground

-
-public boolean getDrawBackground()
-
-
-
-
-
-
- -

-setBackgroundColor

-
-public void setBackgroundColor(int color)
-
-
-
-
-
-
- -

-setDrawBackground

-
-public void setDrawBackground(boolean drawBackground)
-
-
-
Parameters:
drawBackground - true for a light blue background under the graph line
-
-
- -
- - - - - - - - - - - - - - - - - - - -
- -
- - - -
- - - diff --git a/doc/com/jjoe64/graphview/ValueDependentColor.html b/doc/com/jjoe64/graphview/ValueDependentColor.html deleted file mode 100644 index 7c13ec07b..000000000 --- a/doc/com/jjoe64/graphview/ValueDependentColor.html +++ /dev/null @@ -1,211 +0,0 @@ - - - - - - -ValueDependentColor - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- -com.jjoe64.graphview -
-Interface ValueDependentColor

-
-
-
public interface ValueDependentColor
- - -

-you can change the color depending on the value. - takes only effect in BarGraphView -

- -

-


- -

- - - - - - - - - - - - -
-Method Summary
- intget(GraphViewDataInterface data) - -
-           
-  -

- - - - - - - - -
-Method Detail
- -

-get

-
-int get(GraphViewDataInterface data)
-
-
-
-
-
- -
- - - - - - - - - - - - - - - - - - - -
- -
- - - -
- - - diff --git a/doc/com/jjoe64/graphview/class-use/GraphView.GraphViewData.html b/doc/com/jjoe64/graphview/class-use/GraphView.GraphViewData.html deleted file mode 100644 index dddb4b9ac..000000000 --- a/doc/com/jjoe64/graphview/class-use/GraphView.GraphViewData.html +++ /dev/null @@ -1,167 +0,0 @@ - - - - - - -Uses of Class com.jjoe64.graphview.GraphView.GraphViewData - - - - - - - - - - - - -
- - - - - - - - - - - - - - - -
- -
- - - -
-
-

-Uses of Class
com.jjoe64.graphview.GraphView.GraphViewData

-
- - - - - -
-Uses of GraphView.GraphViewData in com.jjoe64.graphview
-  -

- - - - - - - - -
Constructors in com.jjoe64.graphview with parameters of type GraphView.GraphViewData
GraphView(Context context, - GraphView.GraphViewData[] values, - java.lang.String title, - java.lang.String[] horlabels, - java.lang.String[] verlabels) - -
-           
-  -

-


- - - - - - - - - - - - - - - -
- -
- - - -
- - - diff --git a/doc/com/jjoe64/graphview/class-use/GraphView.html b/doc/com/jjoe64/graphview/class-use/GraphView.html deleted file mode 100644 index 51b14782c..000000000 --- a/doc/com/jjoe64/graphview/class-use/GraphView.html +++ /dev/null @@ -1,142 +0,0 @@ - - - - - - -Uses of Class com.jjoe64.graphview.GraphView - - - - - - - - - - - - -
- - - - - - - - - - - - - - - -
- -
- - - -
-
-

-Uses of Class
com.jjoe64.graphview.GraphView

-
-No usage of com.jjoe64.graphview.GraphView -

-


- - - - - - - - - - - - - - - -
- -
- - - -
- - - diff --git a/doc/com/jjoe64/graphview/compatible/RealScaleGestureDetector.html b/doc/com/jjoe64/graphview/compatible/RealScaleGestureDetector.html deleted file mode 100644 index 821853340..000000000 --- a/doc/com/jjoe64/graphview/compatible/RealScaleGestureDetector.html +++ /dev/null @@ -1,250 +0,0 @@ - - - - - - -RealScaleGestureDetector - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- -com.jjoe64.graphview.compatible -
-Class RealScaleGestureDetector

-
-java.lang.Object
-  extended by com.jjoe64.graphview.compatible.ScaleGestureDetector
-      extended by com.jjoe64.graphview.compatible.RealScaleGestureDetector
-
-
-
-

- -

- - - - - - - -
-Nested Class Summary
- - - - - - - -
Nested classes/interfaces inherited from class com.jjoe64.graphview.compatible.ScaleGestureDetector
ScaleGestureDetector.SimpleOnScaleGestureListener
-  - - - - - - - - - -
-Constructor Summary
RealScaleGestureDetector(Context context, - ScaleGestureDetector fakeScaleGestureDetector, - ScaleGestureDetector.SimpleOnScaleGestureListener fakeListener) - -
-           - - - - - - - -
-Method Summary
- - - - - - - -
Methods inherited from class com.jjoe64.graphview.compatible.ScaleGestureDetector
getScaleFactor, isInProgress, onTouchEvent
- - - - - - - -
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
-  -

- - - - - - - - -
-Constructor Detail
- -

-RealScaleGestureDetector

-
-public RealScaleGestureDetector(Context context,
-                                ScaleGestureDetector fakeScaleGestureDetector,
-                                ScaleGestureDetector.SimpleOnScaleGestureListener fakeListener)
-
-
- -
- - - - - - - - - - - - - - - - - - - -
- -
- - - -
- - - diff --git a/doc/com/jjoe64/graphview/compatible/ScaleGestureDetector.SimpleOnScaleGestureListener.html b/doc/com/jjoe64/graphview/compatible/ScaleGestureDetector.SimpleOnScaleGestureListener.html deleted file mode 100644 index 56a153a95..000000000 --- a/doc/com/jjoe64/graphview/compatible/ScaleGestureDetector.SimpleOnScaleGestureListener.html +++ /dev/null @@ -1,209 +0,0 @@ - - - - - - -ScaleGestureDetector.SimpleOnScaleGestureListener - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- -com.jjoe64.graphview.compatible -
-Interface ScaleGestureDetector.SimpleOnScaleGestureListener

-
-
Enclosing class:
ScaleGestureDetector
-
-
-
-
public static interface ScaleGestureDetector.SimpleOnScaleGestureListener
- - -

-


- -

- - - - - - - - - - - - -
-Method Summary
- booleanonScale(ScaleGestureDetector detector) - -
-           
-  -

- - - - - - - - -
-Method Detail
- -

-onScale

-
-boolean onScale(ScaleGestureDetector detector)
-
-
-
-
-
- -
- - - - - - - - - - - - - - - - - - - -
- -
- - - -
- - - diff --git a/doc/com/jjoe64/graphview/compatible/ScaleGestureDetector.html b/doc/com/jjoe64/graphview/compatible/ScaleGestureDetector.html deleted file mode 100644 index d1fe400bd..000000000 --- a/doc/com/jjoe64/graphview/compatible/ScaleGestureDetector.html +++ /dev/null @@ -1,314 +0,0 @@ - - - - - - -ScaleGestureDetector - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- -com.jjoe64.graphview.compatible -
-Class ScaleGestureDetector

-
-java.lang.Object
-  extended by com.jjoe64.graphview.compatible.ScaleGestureDetector
-
-
-
Direct Known Subclasses:
RealScaleGestureDetector
-
-
-
-
public class ScaleGestureDetector
extends java.lang.Object
- - -

-


- -

- - - - - - - - - - - -
-Nested Class Summary
-static interfaceScaleGestureDetector.SimpleOnScaleGestureListener - -
-           
-  - - - - - - - - - - -
-Constructor Summary
ScaleGestureDetector(Context context, - ScaleGestureDetector.SimpleOnScaleGestureListener simpleOnScaleGestureListener) - -
-           
-  - - - - - - - - - - - - - - - - - - - -
-Method Summary
- doublegetScaleFactor() - -
-           
- booleanisInProgress() - -
-           
- voidonTouchEvent(MotionEvent event) - -
-           
- - - - - - - -
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
-  -

- - - - - - - - -
-Constructor Detail
- -

-ScaleGestureDetector

-
-public ScaleGestureDetector(Context context,
-                            ScaleGestureDetector.SimpleOnScaleGestureListener simpleOnScaleGestureListener)
-
-
-
Parameters:
context -
simpleOnScaleGestureListener -
-
- - - - - - - - -
-Method Detail
- -

-getScaleFactor

-
-public double getScaleFactor()
-
-
-
-
-
-
- -

-isInProgress

-
-public boolean isInProgress()
-
-
-
-
-
-
- -

-onTouchEvent

-
-public void onTouchEvent(MotionEvent event)
-
-
-
-
-
- -
- - - - - - - - - - - - - - - - - - - -
- -
- - - -
- - - diff --git a/doc/com/jjoe64/graphview/compatible/package-frame.html b/doc/com/jjoe64/graphview/compatible/package-frame.html deleted file mode 100644 index 68eaca084..000000000 --- a/doc/com/jjoe64/graphview/compatible/package-frame.html +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - -com.jjoe64.graphview.compatible - - - - - - - - - - - -com.jjoe64.graphview.compatible - - - - -
-Interfaces  - -
-ScaleGestureDetector.SimpleOnScaleGestureListener
- - - - - - -
-Classes  - -
-RealScaleGestureDetector -
-ScaleGestureDetector
- - - - diff --git a/doc/com/jjoe64/graphview/compatible/package-summary.html b/doc/com/jjoe64/graphview/compatible/package-summary.html deleted file mode 100644 index 0b5f6924f..000000000 --- a/doc/com/jjoe64/graphview/compatible/package-summary.html +++ /dev/null @@ -1,165 +0,0 @@ - - - - - - -com.jjoe64.graphview.compatible - - - - - - - - - - - - -
- - - - - - - - - - - - - - - -
- -
- - - -
-

-Package com.jjoe64.graphview.compatible -

- - - - - - - - - -
-Interface Summary
ScaleGestureDetector.SimpleOnScaleGestureListener 
-  - -

- - - - - - - -
-Class Summary
RealScaleGestureDetector
-
-
- - - - - - - - - - - - - - - -
- -
- - - -
- - - diff --git a/doc/com/jjoe64/graphview/compatible/package-tree.html b/doc/com/jjoe64/graphview/compatible/package-tree.html deleted file mode 100644 index 45d66fdc3..000000000 --- a/doc/com/jjoe64/graphview/compatible/package-tree.html +++ /dev/null @@ -1,160 +0,0 @@ - - - - - - -com.jjoe64.graphview.compatible Class Hierarchy - - - - - - - - - - - - -
- - - - - - - - - - - - - - - -
- -
- - - -
-
-

-Hierarchy For Package com.jjoe64.graphview.compatible -

-
-
-
Package Hierarchies:
All Packages
-
-

-Class Hierarchy -

- -

-Interface Hierarchy -

- -
- - - - - - - - - - - - - - - -
- -
- - - -
- - - diff --git a/doc/com/jjoe64/graphview/package-frame.html b/doc/com/jjoe64/graphview/package-frame.html deleted file mode 100644 index e74175d27..000000000 --- a/doc/com/jjoe64/graphview/package-frame.html +++ /dev/null @@ -1,70 +0,0 @@ - - - - - - -com.jjoe64.graphview - - - - - - - - - - - -com.jjoe64.graphview - - - - -
-Interfaces  - -
-CustomLabelFormatter -
-GraphViewDataInterface -
-ValueDependentColor
- - - - - - -
-Classes  - -
-BarGraphView -
-GraphView -
-GraphView.GraphViewData -
-GraphViewSeries -
-GraphViewSeries.GraphViewSeriesStyle -
-GraphViewStyle -
-LineGraphView
- - - - - - -
-Enums  - -
-GraphView.LegendAlign
- - - - diff --git a/doc/com/jjoe64/graphview/package-summary.html b/doc/com/jjoe64/graphview/package-summary.html deleted file mode 100644 index 450f240ad..000000000 --- a/doc/com/jjoe64/graphview/package-summary.html +++ /dev/null @@ -1,219 +0,0 @@ - - - - - - -com.jjoe64.graphview - - - - - - - - - - - - -
- - - - - - - - - - - - - - - -
- -
- - - -
-

-Package com.jjoe64.graphview -

- - - - - - - - - - - - - - - - - -
-Interface Summary
CustomLabelFormatterif you want to show different labels, - you can use this label formatter.
GraphViewDataInterfacethe base interface for the graphview data.
ValueDependentColoryou can change the color depending on the value.
-  - -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-Class Summary
BarGraphViewDraws a Bar Chart
GraphViewGraphView is a Android View for creating zoomable and scrollable graphs.
GraphView.GraphViewDataone data set for a graph series
GraphViewSeriesa graphview series.
GraphViewSeries.GraphViewSeriesStylegraph series style: color and thickness
GraphViewStyleStyles for the GraphView - Important: Use GraphViewSeries.GraphViewSeriesStyle for series-specify styling
LineGraphViewLine Graph View.
-  - -

- - - - - - - - - -
-Enum Summary
GraphView.LegendAlign 
-  - -

-

-
-
- - - - - - - - - - - - - - - -
- -
- - - -
- - - diff --git a/doc/com/jjoe64/graphview/package-tree.html b/doc/com/jjoe64/graphview/package-tree.html deleted file mode 100644 index 204461503..000000000 --- a/doc/com/jjoe64/graphview/package-tree.html +++ /dev/null @@ -1,173 +0,0 @@ - - - - - - -com.jjoe64.graphview Class Hierarchy - - - - - - - - - - - - -
- - - - - - - - - - - - - - - -
- -
- - - -
-
-

-Hierarchy For Package com.jjoe64.graphview -

-
-
-
Package Hierarchies:
All Packages
-
-

-Class Hierarchy -

- -

-Interface Hierarchy -

- -

-Enum Hierarchy -

-
    -
  • java.lang.Object
      -
    • java.lang.Enum<E> (implements java.lang.Comparable<T>, java.io.Serializable) - -
    -
-
- - - - - - - - - - - - - - - -
- -
- - - -
- - - diff --git a/doc/com/jjoe64/graphview/package-use.html b/doc/com/jjoe64/graphview/package-use.html deleted file mode 100644 index 1b07119e4..000000000 --- a/doc/com/jjoe64/graphview/package-use.html +++ /dev/null @@ -1,155 +0,0 @@ - - - - - - -Uses of Package com.jjoe64.graphview - - - - - - - - - - - - -
- - - - - - - - - - - - - - - -
- -
- - - -
-
-

-Uses of Package
com.jjoe64.graphview

-
- - - - - - - - -
-Classes in com.jjoe64.graphview used by com.jjoe64.graphview
GraphView.GraphViewData - -
-          one data set for the graph
-  -

-


- - - - - - - - - - - - - - - -
- -
- - - -
- - - diff --git a/doc/constant-values.html b/doc/constant-values.html deleted file mode 100644 index 5f5525f39..000000000 --- a/doc/constant-values.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - - - -Constant Field Values - - - - - - - - - - - - -
- - - - - - - - - - - - - - - -
- -
- - - -
-
-

-Constant Field Values

-
-
-Contents
    -
- -
- - - - - - - - - - - - - - - -
- -
- - - -
- - - diff --git a/doc/deprecated-list.html b/doc/deprecated-list.html deleted file mode 100644 index 690f8ba6d..000000000 --- a/doc/deprecated-list.html +++ /dev/null @@ -1,144 +0,0 @@ - - - - - - -Deprecated List - - - - - - - - - - - - -
- - - - - - - - - - - - - - - -
- -
- - - -
-
-

-Deprecated API

-
-
-Contents
    -
- -
- - - - - - - - - - - - - - - -
- -
- - - -
- - - diff --git a/doc/help-doc.html b/doc/help-doc.html deleted file mode 100644 index e5440693f..000000000 --- a/doc/help-doc.html +++ /dev/null @@ -1,215 +0,0 @@ - - - - - - -API Help - - - - - - - - - - - - -
- - - - - - - - - - - - - - - -
- -
- - - -
-
-

-How This API Document Is Organized

-
-This API (Application Programming Interface) document has pages corresponding to the items in the navigation bar, described as follows.

-Package

-
- -

-Each package has a page that contains a list of its classes and interfaces, with a summary for each. This page can contain four categories:

    -
  • Interfaces (italic)
  • Classes
  • Enums
  • Exceptions
  • Errors
  • Annotation Types
-
-

-Class/Interface

-
- -

-Each class, interface, nested class and nested interface has its own separate page. Each of these pages has three sections consisting of a class/interface description, summary tables, and detailed member descriptions:

    -
  • Class inheritance diagram
  • Direct Subclasses
  • All Known Subinterfaces
  • All Known Implementing Classes
  • Class/interface declaration
  • Class/interface description -

    -

  • Nested Class Summary
  • Field Summary
  • Constructor Summary
  • Method Summary -

    -

  • Field Detail
  • Constructor Detail
  • Method Detail
-Each summary entry contains the first sentence from the detailed description for that item. The summary entries are alphabetical, while the detailed descriptions are in the order they appear in the source code. This preserves the logical groupings established by the programmer.
- -

-Annotation Type

-
- -

-Each annotation type has its own separate page with the following sections:

    -
  • Annotation Type declaration
  • Annotation Type description
  • Required Element Summary
  • Optional Element Summary
  • Element Detail
-
- -

-Enum

-
- -

-Each enum has its own separate page with the following sections:

    -
  • Enum declaration
  • Enum description
  • Enum Constant Summary
  • Enum Constant Detail
-
-

-Use

-
-Each documented package, class and interface has its own Use page. This page describes what packages, classes, methods, constructors and fields use any part of the given class or package. Given a class or interface A, its Use page includes subclasses of A, fields declared as A, methods that return A, and methods and constructors with parameters of type A. You can access this page by first going to the package, class or interface, then clicking on the "Use" link in the navigation bar.
-

-Tree (Class Hierarchy)

-
-There is a Class Hierarchy page for all packages, plus a hierarchy for each package. Each hierarchy page contains a list of classes and a list of interfaces. The classes are organized by inheritance structure starting with java.lang.Object. The interfaces do not inherit from java.lang.Object.
    -
  • When viewing the Overview page, clicking on "Tree" displays the hierarchy for all packages.
  • When viewing a particular package, class or interface page, clicking "Tree" displays the hierarchy for only that package.
-
-

-Deprecated API

-
-The Deprecated API page lists all of the API that have been deprecated. A deprecated API is not recommended for use, generally due to improvements, and a replacement API is usually given. Deprecated APIs may be removed in future implementations.
-

-Index

-
-The Index contains an alphabetic list of all classes, interfaces, constructors, methods, and fields.
-

-Prev/Next

-These links take you to the next or previous class, interface, package, or related page.

-Frames/No Frames

-These links show and hide the HTML frames. All pages are available with or without frames. -

-

-Serialized Form

-Each serializable or externalizable class has a description of its serialization fields and methods. This information is of interest to re-implementors, not to developers using the API. While there is no link in the navigation bar, you can get to this information by going to any serialized class and clicking "Serialized Form" in the "See also" section of the class description. -

-

-Constant Field Values

-The Constant Field Values page lists the static final fields and their values. -

- - -This help file applies to API documentation generated using the standard doclet. - -
-


- - - - - - - - - - - - - - - -
- -
- - - -
- - - diff --git a/doc/index-files/index-1.html b/doc/index-files/index-1.html deleted file mode 100644 index 9ed722154..000000000 --- a/doc/index-files/index-1.html +++ /dev/null @@ -1,140 +0,0 @@ - - - - - - -C-Index - - - - - - - - - - - - -
- - - - - - - - - - - - - - - -
- -
- - - -C F G I S
-

-C

-
-
com.jjoe64.graphview - package com.jjoe64.graphview
 
-
- - - - - - - - - - - - - - - -
- -
- - - -C F G I S
- - - diff --git a/doc/index-files/index-2.html b/doc/index-files/index-2.html deleted file mode 100644 index 12a5f37c7..000000000 --- a/doc/index-files/index-2.html +++ /dev/null @@ -1,144 +0,0 @@ - - - - - - -F-Index - - - - - - - - - - - - -
- - - - - - - - - - - - - - - -
- -
- - - -C F G I S
-

-F

-
-
formatLabel(double) - -Method in class com.jjoe64.graphview.GraphView -
formats the label - can be overwritten -
-
- - - - - - - - - - - - - - - -
- -
- - - -C F G I S
- - - diff --git a/doc/index-files/index-3.html b/doc/index-files/index-3.html deleted file mode 100644 index 6bae1d2d1..000000000 --- a/doc/index-files/index-3.html +++ /dev/null @@ -1,149 +0,0 @@ - - - - - - -G-Index - - - - - - - - - - - - -
- - - - - - - - - - - - - - - -
- -
- - - -C F G I S
-

-G

-
-
getDrawBackground() - -Method in class com.jjoe64.graphview.GraphView -
  -
GraphView - Class in com.jjoe64.graphview
GraphView creates a scaled line graph with x and y axis labels.
GraphView(Context, GraphView.GraphViewData[], String, String[], String[]) - -Constructor for class com.jjoe64.graphview.GraphView -
  -
GraphView.GraphViewData - Class in com.jjoe64.graphview
one data set for the graph
GraphView.GraphViewData(double, double) - -Constructor for class com.jjoe64.graphview.GraphView.GraphViewData -
  -
-
- - - - - - - - - - - - - - - -
- -
- - - -C F G I S
- - - diff --git a/doc/index-files/index-4.html b/doc/index-files/index-4.html deleted file mode 100644 index 18fc6ec4f..000000000 --- a/doc/index-files/index-4.html +++ /dev/null @@ -1,143 +0,0 @@ - - - - - - -I-Index - - - - - - - - - - - - -
- - - - - - - - - - - - - - - -
- -
- - - -C F G I S
-

-I

-
-
isScrollable() - -Method in class com.jjoe64.graphview.GraphView -
  -
-
- - - - - - - - - - - - - - - -
- -
- - - -C F G I S
- - - diff --git a/doc/index-files/index-5.html b/doc/index-files/index-5.html deleted file mode 100644 index 1a4c64dff..000000000 --- a/doc/index-files/index-5.html +++ /dev/null @@ -1,152 +0,0 @@ - - - - - - -S-Index - - - - - - - - - - - - -
- - - - - - - - - - - - - - - -
- -
- - - -C F G I S
-

-S

-
-
setDrawBackground(boolean) - -Method in class com.jjoe64.graphview.GraphView -
  -
setScalable(boolean) - -Method in class com.jjoe64.graphview.GraphView -
this forces scrollable = true -
setScrollable(boolean) - -Method in class com.jjoe64.graphview.GraphView -
the user can scroll (horizontal) the graph. -
setViewPort(double, double) - -Method in class com.jjoe64.graphview.GraphView -
set's the viewport for the graph. -
-
- - - - - - - - - - - - - - - -
- -
- - - -C F G I S
- - - diff --git a/doc/index.html b/doc/index.html deleted file mode 100644 index 1c53a8b1a..000000000 --- a/doc/index.html +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - -Generated Documentation (Untitled) - - - - - - - - -<H2> -Frame Alert</H2> - -<P> -This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client. -<BR> -Link to<A HREF="com/jjoe64/graphview/package-summary.html">Non-frame version.</A> - - - diff --git a/doc/overview-frame.html b/doc/overview-frame.html deleted file mode 100644 index 786d91796..000000000 --- a/doc/overview-frame.html +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - -Overview List - - - - - - - - - - - - - - - -
-
- - - - - -
All Classes -

- -Packages -
-com.jjoe64.graphview -
-com.jjoe64.graphview.compatible -
-

- -

-  - - diff --git a/doc/overview-tree.html b/doc/overview-tree.html deleted file mode 100644 index 5a08fd4f1..000000000 --- a/doc/overview-tree.html +++ /dev/null @@ -1,152 +0,0 @@ - - - - - - -Class Hierarchy - - - - - - - - - - - - -


- - - - - - - - - - - - - - - -
- -
- - - -
-
-

-Hierarchy For All Packages

-
-
-
Package Hierarchies:
com.jjoe64.graphview
-
-

-Class Hierarchy -

- -
- - - - - - - - - - - - - - - -
- -
- - - -
- - - diff --git a/doc/package-list b/doc/package-list deleted file mode 100644 index ce425ccc3..000000000 --- a/doc/package-list +++ /dev/null @@ -1,2 +0,0 @@ -com.jjoe64.graphview -com.jjoe64.graphview.compatible diff --git a/doc/resources/inherit.gif b/doc/resources/inherit.gif deleted file mode 100644 index c814867a13deb0ca7ea2156c6ca1d5a03372af7e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 57 zcmZ?wbhEHbIIT!9-C*e{wE9>Kx3D)-;0v)C; KYxQGgum%9JOA&7X diff --git a/doc/stylesheet.css b/doc/stylesheet.css deleted file mode 100644 index 6ea9e5161..000000000 --- a/doc/stylesheet.css +++ /dev/null @@ -1,29 +0,0 @@ -/* Javadoc style sheet */ - -/* Define colors, fonts and other style attributes here to override the defaults */ - -/* Page background color */ -body { background-color: #FFFFFF; color:#000000 } - -/* Headings */ -h1 { font-size: 145% } - -/* Table colors */ -.TableHeadingColor { background: #CCCCFF; color:#000000 } /* Dark mauve */ -.TableSubHeadingColor { background: #EEEEFF; color:#000000 } /* Light mauve */ -.TableRowColor { background: #FFFFFF; color:#000000 } /* White */ - -/* Font used in left-hand frame lists */ -.FrameTitleFont { font-size: 100%; font-family: Helvetica, Arial, sans-serif; color:#000000 } -.FrameHeadingFont { font-size: 90%; font-family: Helvetica, Arial, sans-serif; color:#000000 } -.FrameItemFont { font-size: 90%; font-family: Helvetica, Arial, sans-serif; color:#000000 } - -/* Navigation bar fonts and colors */ -.NavBarCell1 { background-color:#EEEEFF; color:#000000} /* Light mauve */ -.NavBarCell1Rev { background-color:#00008B; color:#FFFFFF} /* Dark Blue */ -.NavBarFont1 { font-family: Arial, Helvetica, sans-serif; color:#000000;color:#000000;} -.NavBarFont1Rev { font-family: Arial, Helvetica, sans-serif; color:#FFFFFF;color:#FFFFFF;} - -.NavBarCell2 { font-family: Arial, Helvetica, sans-serif; background-color:#FFFFFF; color:#000000} -.NavBarCell3 { font-family: Arial, Helvetica, sans-serif; background-color:#FFFFFF; color:#000000} - From 419a1a1024488f068886d4bde644e059d1585482 Mon Sep 17 00:00:00 2001 From: jogehring Date: Tue, 24 Jun 2014 11:57:42 +0200 Subject: [PATCH 003/231] doc --- GraphView.iml | 74 +++++++++---------- build.gradle | 10 ++- .../java/com/jjoe64/graphview/GraphView.java | 4 +- .../com/jjoe64/graphview/GraphViewSeries.java | 18 ++++- .../com/jjoe64/graphview/GraphViewStyle.java | 7 +- 5 files changed, 62 insertions(+), 51 deletions(-) diff --git a/GraphView.iml b/GraphView.iml index e945a7072..205e7b3d8 100644 --- a/GraphView.iml +++ b/GraphView.iml @@ -1,78 +1,70 @@ + + + + - - - - - + - - - - - - - - - - + + + + + + + + + + + + - - + + - - - - - - - - - - - - - - - - - - - + + + + + + + + + - - + + diff --git a/build.gradle b/build.gradle index 0d5638a25..ff448862e 100644 --- a/build.gradle +++ b/build.gradle @@ -2,7 +2,7 @@ apply plugin: 'android-library' android { compileSdkVersion 19 - buildToolsVersion "19.0.1" + buildToolsVersion "19.1" defaultConfig { minSdkVersion 7 @@ -10,9 +10,11 @@ android { versionCode 1 versionName "1.0" } - release { - runProguard false - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' + buildTypes { + release { + runProguard false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' + } } } diff --git a/src/main/java/com/jjoe64/graphview/GraphView.java b/src/main/java/com/jjoe64/graphview/GraphView.java index 6a1060f95..01584450f 100755 --- a/src/main/java/com/jjoe64/graphview/GraphView.java +++ b/src/main/java/com/jjoe64/graphview/GraphView.java @@ -42,8 +42,8 @@ /** * GraphView is a Android View for creating zoomable and scrollable graphs. - * This is the abstract base class for all graphs. Extend this class and implement {@link #drawSeries(Canvas, GraphViewDataInterface[], float, float, float, double, double, double, double, float)} to display a custom graph. - * Use {@link LineGraphView} for creating a line chart. + * This is the abstract base class for all graphs. Extend this class and implement {@link #drawSeries(android.graphics.Canvas, GraphViewDataInterface[], float, float, float, double, double, double, double, float, com.jjoe64.graphview.GraphViewSeries.GraphViewSeriesStyle)} to display a custom graph. + * Use {@link com.jjoe64.graphview.LineGraphView} for creating a line chart. * * @author jjoe64 - jonas gehring - http://www.jjoe64.com * diff --git a/src/main/java/com/jjoe64/graphview/GraphViewSeries.java b/src/main/java/com/jjoe64/graphview/GraphViewSeries.java index a586fd044..62b60ca06 100644 --- a/src/main/java/com/jjoe64/graphview/GraphViewSeries.java +++ b/src/main/java/com/jjoe64/graphview/GraphViewSeries.java @@ -63,12 +63,22 @@ public void setValueDependentColor(ValueDependentColor valueDependentColor) { GraphViewDataInterface[] values; private final List graphViews = new ArrayList(); + /** + * create a series with predefined values + * @param values the values must be in the correct order! x-value has to be ASC. First the lowest x value and at least the highest x value. + */ public GraphViewSeries(GraphViewDataInterface[] values) { description = null; style = new GraphViewSeriesStyle(); this.values = values; } + /** + * create a series with predefined options + * @param description the name of the series + * @param style custom style. can be null for default styles + * @param values the values must be in the correct order! x-value has to be ASC. First the lowest x value and at least the highest x value. + */ public GraphViewSeries(String description, GraphViewSeriesStyle style, GraphViewDataInterface[] values) { super(); this.description = description; @@ -89,6 +99,7 @@ public void addGraphView(GraphView graphView) { /** * add one data to current data + * the values must be in the correct order! x-value has to be ASC. First the lowest x value and at least the highest x value. * @param value the new data to append * @param scrollToEnd true => graphview will scroll to the end (maxX) * @deprecated please use {@link #appendData(GraphViewDataInterface, boolean, int)} to avoid memory overflow @@ -110,7 +121,9 @@ public void appendData(GraphViewDataInterface value, boolean scrollToEnd) { /** * add one data to current data - * @param value the new data to append + * the values must be in the correct order! x-value has to be ASC. First the lowest x value and at least the highest x value. + * + * @param value the new data to append. Important: the new value must be higher then the last value (x). * @param scrollToEnd true => graphview will scroll to the end (maxX) * @param maxDataCount if max data count is reached, the oldest data value will be lost */ @@ -159,8 +172,9 @@ public void removeGraphView(GraphView graphView) { /** * clears the current data and set the new. + * * redraws the graphview(s) - * @param values new data + * @param values the values must be in the correct order! x-value has to be ASC. First the lowest x value and at least the highest x value. */ public void resetData(GraphViewDataInterface[] values) { this.values = values; diff --git a/src/main/java/com/jjoe64/graphview/GraphViewStyle.java b/src/main/java/com/jjoe64/graphview/GraphViewStyle.java index 11d1da55d..b74194b11 100644 --- a/src/main/java/com/jjoe64/graphview/GraphViewStyle.java +++ b/src/main/java/com/jjoe64/graphview/GraphViewStyle.java @@ -27,7 +27,7 @@ /** * Styles for the GraphView - * Important: Use GraphViewSeries.GraphViewSeriesStyle for series-specify styling + * Important: Use {@link com.jjoe64.graphview.GraphViewSeries.GraphViewSeriesStyle} for series-specify styling * */ public class GraphViewStyle { @@ -195,7 +195,10 @@ public void useTextColorFromTheme(Context context) { setHorizontalLabelsColor(color); } } - + + /** + * Definition which lines will be drawn in the background + */ public enum GridStyle { BOTH, VERTICAL, HORIZONTAL } From 5cb0c97ebab222c7cba75c1a92b6f60c61788618 Mon Sep 17 00:00:00 2001 From: jogehring Date: Wed, 25 Jun 2014 21:18:58 +0200 Subject: [PATCH 004/231] refs #148 check values order --- .../com/jjoe64/graphview/GraphViewSeries.java | 25 +++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/jjoe64/graphview/GraphViewSeries.java b/src/main/java/com/jjoe64/graphview/GraphViewSeries.java index 62b60ca06..14326315b 100644 --- a/src/main/java/com/jjoe64/graphview/GraphViewSeries.java +++ b/src/main/java/com/jjoe64/graphview/GraphViewSeries.java @@ -71,6 +71,7 @@ public GraphViewSeries(GraphViewDataInterface[] values) { description = null; style = new GraphViewSeriesStyle(); this.values = values; + checkValueOrder(); } /** @@ -87,7 +88,8 @@ public GraphViewSeries(String description, GraphViewSeriesStyle style, GraphView } this.style = style; this.values = values; - } + checkValueOrder(); + } /** * this graphview will be redrawn if data changes @@ -106,6 +108,9 @@ public void addGraphView(GraphView graphView) { */ @Deprecated public void appendData(GraphViewDataInterface value, boolean scrollToEnd) { + if (value.getX() < values[values.length-1].getX()) { + throw new IllegalArgumentException("new x-value must be greater then the last value. x-values has to be ordered in ASC."); + } GraphViewDataInterface[] newValues = new GraphViewDataInterface[values.length + 1]; int offset = values.length; System.arraycopy(values, 0, newValues, 0, offset); @@ -128,6 +133,9 @@ public void appendData(GraphViewDataInterface value, boolean scrollToEnd) { * @param maxDataCount if max data count is reached, the oldest data value will be lost */ public void appendData(GraphViewDataInterface value, boolean scrollToEnd, int maxDataCount) { + if (value.getX() < values[values.length-1].getX()) { + throw new IllegalArgumentException("new x-value must be greater then the last value. x-values has to be ordered in ASC."); + } synchronized (values) { int curDataCount = values.length; GraphViewDataInterface[] newValues; @@ -178,8 +186,21 @@ public void removeGraphView(GraphView graphView) { */ public void resetData(GraphViewDataInterface[] values) { this.values = values; - for (GraphView g : graphViews) { + checkValueOrder(); + for (GraphView g : graphViews) { g.redrawAll(); } } + + private void checkValueOrder() { + if (values.length>0) { + double lx = values[0].getX(); + for (int i=1;i values[i].getX()) { + throw new IllegalArgumentException("Tht order of the values is not correct. X-Values have to be ordered ASC. First the lowest x value and at least the highest x value."); + } + lx = values[i].getX(); + } + } + } } From 278672e3302504adb6e10f207427cddbcee0e520 Mon Sep 17 00:00:00 2001 From: jogehring Date: Wed, 25 Jun 2014 21:20:43 +0200 Subject: [PATCH 005/231] typo --- src/main/java/com/jjoe64/graphview/GraphViewSeries.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/jjoe64/graphview/GraphViewSeries.java b/src/main/java/com/jjoe64/graphview/GraphViewSeries.java index 14326315b..ce67887f0 100644 --- a/src/main/java/com/jjoe64/graphview/GraphViewSeries.java +++ b/src/main/java/com/jjoe64/graphview/GraphViewSeries.java @@ -197,7 +197,7 @@ private void checkValueOrder() { double lx = values[0].getX(); for (int i=1;i values[i].getX()) { - throw new IllegalArgumentException("Tht order of the values is not correct. X-Values have to be ordered ASC. First the lowest x value and at least the highest x value."); + throw new IllegalArgumentException("The order of the values is not correct. X-Values have to be ordered ASC. First the lowest x value and at least the highest x value."); } lx = values[i].getX(); } From d9b7ff4271d6f67b12a6f656515b0949348a1c24 Mon Sep 17 00:00:00 2001 From: jogehring Date: Thu, 26 Jun 2014 16:30:20 +0200 Subject: [PATCH 006/231] new version --- public/GraphView-3.1.2.jar | Bin 0 -> 20237 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 public/GraphView-3.1.2.jar diff --git a/public/GraphView-3.1.2.jar b/public/GraphView-3.1.2.jar new file mode 100644 index 0000000000000000000000000000000000000000..0905e36d9fe6679bcd9088a003ff91b688f0b2c8 GIT binary patch literal 20237 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 Date: Fri, 27 Jun 2014 13:14:58 +0200 Subject: [PATCH 007/231] correct .jar file --- build.gradle | 15 +++++++++++++++ public/GraphView-3.1.2.jar | Bin 20237 -> 32863 bytes 2 files changed, 15 insertions(+) diff --git a/build.gradle b/build.gradle index ff448862e..a13bb3552 100644 --- a/build.gradle +++ b/build.gradle @@ -21,3 +21,18 @@ android { dependencies { compile 'com.android.support:appcompat-v7:+' } + +// This is the actual solution, as in http://stackoverflow.com/a/19037807/1002054 +task clearJar(type: Delete) { + delete 'build/libs/myCompiledLibrary.jar' +} + +task makeJar(type: Copy) { + from('build/bundles/release/') + into('build/libs/') + include('classes.jar') + rename ('classes.jar', 'myCompiledLibrary.jar') +} + +makeJar.dependsOn(clearJar, build) + diff --git a/public/GraphView-3.1.2.jar b/public/GraphView-3.1.2.jar index 0905e36d9fe6679bcd9088a003ff91b688f0b2c8..978e47f9a7faeecc0bbbfcff9b763056f397b737 100644 GIT binary patch literal 32863 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�Rl#Q%+Sa)`T~XdGfA{TjqYY#Q!Yv& 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 literal 20237 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 Date: Mon, 21 Jul 2014 22:24:46 +0300 Subject: [PATCH 008/231] ensure that series created only if data array not empty #179 --- src/main/java/com/jjoe64/graphview/GraphViewSeries.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/jjoe64/graphview/GraphViewSeries.java b/src/main/java/com/jjoe64/graphview/GraphViewSeries.java index ce67887f0..9228a6399 100644 --- a/src/main/java/com/jjoe64/graphview/GraphViewSeries.java +++ b/src/main/java/com/jjoe64/graphview/GraphViewSeries.java @@ -133,7 +133,7 @@ public void appendData(GraphViewDataInterface value, boolean scrollToEnd) { * @param maxDataCount if max data count is reached, the oldest data value will be lost */ public void appendData(GraphViewDataInterface value, boolean scrollToEnd, int maxDataCount) { - if (value.getX() < values[values.length-1].getX()) { + if (value.getX() < values[values.length-1].getX() && value.length > 0) { throw new IllegalArgumentException("new x-value must be greater then the last value. x-values has to be ordered in ASC."); } synchronized (values) { From f2eac26f418cbed80630833217bf5e13e5c857a7 Mon Sep 17 00:00:00 2001 From: Muhebwa Aggrey Date: Tue, 22 Jul 2014 11:21:50 +0300 Subject: [PATCH 009/231] Update GraphViewSeries.java implement checking on the proper array before creating series --- src/main/java/com/jjoe64/graphview/GraphViewSeries.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/jjoe64/graphview/GraphViewSeries.java b/src/main/java/com/jjoe64/graphview/GraphViewSeries.java index 9228a6399..0203fdb64 100644 --- a/src/main/java/com/jjoe64/graphview/GraphViewSeries.java +++ b/src/main/java/com/jjoe64/graphview/GraphViewSeries.java @@ -133,7 +133,7 @@ public void appendData(GraphViewDataInterface value, boolean scrollToEnd) { * @param maxDataCount if max data count is reached, the oldest data value will be lost */ public void appendData(GraphViewDataInterface value, boolean scrollToEnd, int maxDataCount) { - if (value.getX() < values[values.length-1].getX() && value.length > 0) { + if (values.length > 0 && value.getX() < values[values.length-1].getX()) { throw new IllegalArgumentException("new x-value must be greater then the last value. x-values has to be ordered in ASC."); } synchronized (values) { From 70bdf7993a215a5054e681ee1220895dc25431f1 Mon Sep 17 00:00:00 2001 From: jogehring Date: Wed, 6 Aug 2014 20:48:34 +0200 Subject: [PATCH 010/231] use build tool version 20 --- GraphView.iml | 8 ++++---- build.gradle | 9 +++++---- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/GraphView.iml b/GraphView.iml index 205e7b3d8..1ff55edde 100644 --- a/GraphView.iml +++ b/GraphView.iml @@ -59,12 +59,12 @@ - - + - - + + + diff --git a/build.gradle b/build.gradle index a13bb3552..f367ca997 100644 --- a/build.gradle +++ b/build.gradle @@ -1,12 +1,12 @@ apply plugin: 'android-library' android { - compileSdkVersion 19 - buildToolsVersion "19.1" + compileSdkVersion 20 + buildToolsVersion "20" defaultConfig { minSdkVersion 7 - targetSdkVersion 16 + targetSdkVersion 20 versionCode 1 versionName "1.0" } @@ -19,7 +19,8 @@ android { } dependencies { - compile 'com.android.support:appcompat-v7:+' + compile 'com.android.support:appcompat-v7:20.+' + compile 'com.android.support:support-v4:20.+' } // This is the actual solution, as in http://stackoverflow.com/a/19037807/1002054 From 890764701e270474d9716e39005b216f5b42fb3a Mon Sep 17 00:00:00 2001 From: jogehring Date: Wed, 6 Aug 2014 22:20:28 +0200 Subject: [PATCH 011/231] refs #190 no arrayindexoutofbounds --- src/main/java/com/jjoe64/graphview/GraphViewSeries.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/jjoe64/graphview/GraphViewSeries.java b/src/main/java/com/jjoe64/graphview/GraphViewSeries.java index 0203fdb64..53ed95c17 100644 --- a/src/main/java/com/jjoe64/graphview/GraphViewSeries.java +++ b/src/main/java/com/jjoe64/graphview/GraphViewSeries.java @@ -108,7 +108,7 @@ public void addGraphView(GraphView graphView) { */ @Deprecated public void appendData(GraphViewDataInterface value, boolean scrollToEnd) { - if (value.getX() < values[values.length-1].getX()) { + if (values.length > 0 && value.getX() < values[values.length-1].getX()) { throw new IllegalArgumentException("new x-value must be greater then the last value. x-values has to be ordered in ASC."); } GraphViewDataInterface[] newValues = new GraphViewDataInterface[values.length + 1]; From 41120232e14829d3dde4aef8cccb4ab469402b1e Mon Sep 17 00:00:00 2001 From: jogehring Date: Wed, 6 Aug 2014 22:58:06 +0200 Subject: [PATCH 012/231] refs #173 show vertical and/or horizontal grid lines or no grid lines --- GraphView.iml | 1 + src/main/java/com/jjoe64/graphview/GraphView.java | 6 +++--- src/main/java/com/jjoe64/graphview/GraphViewStyle.java | 5 ++++- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/GraphView.iml b/GraphView.iml index 1ff55edde..2fb60bb5e 100644 --- a/GraphView.iml +++ b/GraphView.iml @@ -59,6 +59,7 @@ + diff --git a/src/main/java/com/jjoe64/graphview/GraphView.java b/src/main/java/com/jjoe64/graphview/GraphView.java index 01584450f..8cacab9fa 100755 --- a/src/main/java/com/jjoe64/graphview/GraphView.java +++ b/src/main/java/com/jjoe64/graphview/GraphView.java @@ -111,8 +111,8 @@ protected void onDraw(Canvas canvas) { verlabels = generateVerlabels(graphheight); } - // vertical lines - if(graphViewStyle.getGridStyle() != GridStyle.HORIZONTAL) { + // horizontal lines + if (graphViewStyle.getGridStyle().drawHorizontal()) { paint.setTextAlign(Align.LEFT); int vers = verlabels.length - 1; for (int i = 0; i < verlabels.length; i++) { @@ -422,7 +422,7 @@ protected void drawHorizontalLabels(Canvas canvas, float border, for (int i = 0; i < horlabels.length; i++) { paint.setColor(graphViewStyle.getGridColor()); float x = ((graphwidth / hors) * i) + horstart; - if(graphViewStyle.getGridStyle() != GridStyle.VERTICAL) { + if(graphViewStyle.getGridStyle().drawVertical()) { // vertical lines canvas.drawLine(x, height - border, x, border, paint); } if(showHorizontalLabels) { diff --git a/src/main/java/com/jjoe64/graphview/GraphViewStyle.java b/src/main/java/com/jjoe64/graphview/GraphViewStyle.java index b74194b11..cd5bd9afd 100644 --- a/src/main/java/com/jjoe64/graphview/GraphViewStyle.java +++ b/src/main/java/com/jjoe64/graphview/GraphViewStyle.java @@ -200,6 +200,9 @@ public void useTextColorFromTheme(Context context) { * Definition which lines will be drawn in the background */ public enum GridStyle { - BOTH, VERTICAL, HORIZONTAL + BOTH, VERTICAL, HORIZONTAL, NONE; + + public boolean drawVertical() { return this == BOTH || this == VERTICAL && this != NONE; } + public boolean drawHorizontal() { return this == BOTH || this == HORIZONTAL && this != NONE; } } } From 981f0d5f6d09c1f94762cfe588565ea778a35301 Mon Sep 17 00:00:00 2001 From: jogehring Date: Wed, 6 Aug 2014 23:20:15 +0200 Subject: [PATCH 013/231] refs #83 warning if static labels and setNum...Labels are used together --- src/main/java/com/jjoe64/graphview/GraphView.java | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/jjoe64/graphview/GraphView.java b/src/main/java/com/jjoe64/graphview/GraphView.java index 8cacab9fa..e5e69a3a0 100755 --- a/src/main/java/com/jjoe64/graphview/GraphView.java +++ b/src/main/java/com/jjoe64/graphview/GraphView.java @@ -106,9 +106,13 @@ protected void onDraw(Canvas canvas) { if (horlabels == null) { horlabels = generateHorlabels(graphwidth); + } else if (getGraphViewStyle().getNumHorizontalLabels() > 0) { + Log.w("GraphView", "when you use static labels (via setHorizontalLabels) the labels will just be shown exactly in that way, that you have set it. setNumHorizontalLabels does not have any effect."); } if (verlabels == null) { verlabels = generateVerlabels(graphheight); + } else if (getGraphViewStyle().getNumVerticalLabels() > 0) { + Log.w("GraphView", "when you use static labels (via setVerticalLabels) the labels will just be shown exactly in that way, that you have set it. setNumVerticalLabels does not have any effect."); } // horizontal lines @@ -288,7 +292,9 @@ protected void onDraw(Canvas canvas) { if (verlabels == null) { verlabels = generateVerlabels(graphheight); - } + } else if (getGraphViewStyle().getNumVerticalLabels() > 0) { + Log.w("GraphView", "when you use static labels (via setVerticalLabels) the labels will just be shown exactly in that way, that you have set it. setNumVerticalLabels does not have any effect."); + } // vertical labels paint.setTextAlign(getGraphViewStyle().getVerticalLabelsAlign()); @@ -517,7 +523,7 @@ protected String formatLabel(double value, boolean isValueX) { private String[] generateHorlabels(float graphwidth) { int numLabels = getGraphViewStyle().getNumHorizontalLabels()-1; - if (numLabels < 0) { + if (numLabels < 0) { // automatic if (graphwidth <= 0) graphwidth = 1f; numLabels = (int) (graphwidth/(horLabelTextWidth*2)); } @@ -533,7 +539,7 @@ private String[] generateHorlabels(float graphwidth) { synchronized private String[] generateVerlabels(float graphheight) { int numLabels = getGraphViewStyle().getNumVerticalLabels()-1; - if (numLabels < 0) { + if (numLabels < 0) { // automatic if (graphheight <= 0) graphheight = 1f; numLabels = (int) (graphheight/(labelTextHeight*3)); if (numLabels == 0) { From 7e7a48b61ea22fe3541b9302995fa9dea59c63b7 Mon Sep 17 00:00:00 2001 From: jogehring Date: Wed, 6 Aug 2014 23:37:51 +0200 Subject: [PATCH 014/231] refs #130 no more Log.d --- src/main/java/com/jjoe64/graphview/GraphView.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/jjoe64/graphview/GraphView.java b/src/main/java/com/jjoe64/graphview/GraphView.java index e5e69a3a0..f0b85d4f3 100755 --- a/src/main/java/com/jjoe64/graphview/GraphView.java +++ b/src/main/java/com/jjoe64/graphview/GraphView.java @@ -450,7 +450,7 @@ protected void drawLegend(Canvas canvas, float height, float width) { int legendWidth = getGraphViewStyle().getLegendWidth(); int shapeSize = (int) (textSize*0.8d); - Log.d("GraphView", "draw legend size: "+paint.getTextSize()); + //Log.d("GraphView", "draw legend size: "+paint.getTextSize()); // rect paint.setARGB(180, 100, 100, 100); From 550ebfcf82ea177d4eacd1db1e956768e1df4fd1 Mon Sep 17 00:00:00 2001 From: jogehring Date: Fri, 8 Aug 2014 00:44:37 +0300 Subject: [PATCH 015/231] refs #191 multiline labels (line break support) --- .../java/com/jjoe64/graphview/GraphView.java | 25 ++++++++++++++++--- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/jjoe64/graphview/GraphView.java b/src/main/java/com/jjoe64/graphview/GraphView.java index f0b85d4f3..718bf4d2a 100755 --- a/src/main/java/com/jjoe64/graphview/GraphView.java +++ b/src/main/java/com/jjoe64/graphview/GraphView.java @@ -19,6 +19,7 @@ package com.jjoe64.graphview; +import java.nio.charset.Charset; import java.text.NumberFormat; import java.util.ArrayList; import java.util.List; @@ -96,7 +97,12 @@ protected void onDraw(Canvas canvas) { double testX = ((getMaxX(true)-getMinX(true))*0.783)+getMinX(true); String testLabel = formatLabel(testX, true); paint.getTextBounds(testLabel, 0, testLabel.length(), textBounds); - labelTextHeight = (textBounds.height()); + // multiline + int lines = 1; + for (byte c : testLabel.getBytes(Charset.defaultCharset())) { + if (c == '\n') lines++; + } + labelTextHeight = textBounds.height()*lines; horLabelTextWidth = (textBounds.width()); } border += labelTextHeight; @@ -309,8 +315,14 @@ protected void onDraw(Canvas canvas) { for (int i = 0; i < verlabels.length; i++) { float y = ((graphheight / vers) * i) + border; paint.setColor(graphViewStyle.getVerticalLabelsColor()); - canvas.drawText(verlabels[i], labelsOffset, y, paint); - } + + String[] lines = verlabels[i].split("\n"); + for (int li=0; li Date: Wed, 13 Aug 2014 12:46:30 +0700 Subject: [PATCH 016/231] refs #153 maven push properties --- GraphView.iml | 4 ++- build.gradle | 1 + gradle.properties | 3 ++ maven_push.gradle | 92 +++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 99 insertions(+), 1 deletion(-) create mode 100644 gradle.properties create mode 100644 maven_push.gradle diff --git a/GraphView.iml b/GraphView.iml index 2fb60bb5e..d9c648497 100644 --- a/GraphView.iml +++ b/GraphView.iml @@ -1,5 +1,5 @@ - + @@ -58,7 +58,9 @@ + + diff --git a/build.gradle b/build.gradle index f367ca997..56d4889c6 100644 --- a/build.gradle +++ b/build.gradle @@ -37,3 +37,4 @@ task makeJar(type: Copy) { makeJar.dependsOn(clearJar, build) +apply from: './maven_push.gradle' diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 000000000..d172455ec --- /dev/null +++ b/gradle.properties @@ -0,0 +1,3 @@ +POM_NAME=GraphView +POM_ARTIFACT_ID=graphview +POM_PACKAGING=aar diff --git a/maven_push.gradle b/maven_push.gradle new file mode 100644 index 000000000..b741e61b1 --- /dev/null +++ b/maven_push.gradle @@ -0,0 +1,92 @@ +apply plugin: 'maven' +apply plugin: 'signing' + +def sonatypeRepositoryUrl +if (isReleaseBuild()) { + println 'RELEASE BUILD' + sonatypeRepositoryUrl = hasProperty('RELEASE_REPOSITORY_URL') ? RELEASE_REPOSITORY_URL + : "https://oss.sonatype.org/service/local/staging/deploy/maven2/" +} else { + println 'DEBUG BUILD' + sonatypeRepositoryUrl = hasProperty('SNAPSHOT_REPOSITORY_URL') ? SNAPSHOT_REPOSITORY_URL + : "https://oss.sonatype.org/content/repositories/snapshots/" +} + +def getRepositoryUsername() { + return hasProperty('nexusUsername') ? nexusUsername : "" +} + +def getRepositoryPassword() { + return hasProperty('nexusPassword') ? nexusPassword : "" +} + +afterEvaluate { project -> + uploadArchives { + repositories { + mavenDeployer { + beforeDeployment { MavenDeployment deployment -> signing.signPom(deployment) } + + pom.artifactId = POM_ARTIFACT_ID + + repository(url: sonatypeRepositoryUrl) { + authentication(userName: getRepositoryUsername(), password: getRepositoryPassword()) + } + + pom.project { + name POM_NAME + packaging POM_PACKAGING + description POM_DESCRIPTION + url POM_URL + + scm { + url POM_SCM_URL + connection POM_SCM_CONNECTION + developerConnection POM_SCM_DEV_CONNECTION + } + + licenses { + license { + name POM_LICENCE_NAME + url POM_LICENCE_URL + distribution POM_LICENCE_DIST + } + } + + developers { + developer { + id POM_DEVELOPER_ID + name POM_DEVELOPER_NAME + } + } + } + } + } + } + + signing { + required { isReleaseBuild() && gradle.taskGraph.hasTask("uploadArchives") } + sign configurations.archives + } + + task androidJavadocs(type: Javadoc) { + source = android.sourceSets.main.java.sourceFiles + } + + task androidJavadocsJar(type: Jar) { + classifier = 'javadoc' + //basename = artifact_id + from androidJavadocs.destinationDir + } + + task androidSourcesJar(type: Jar) { + classifier = 'sources' + //basename = artifact_id + from android.sourceSets.main.java.sourceFiles + } + + artifacts { + //archives packageReleaseJar + archives androidSourcesJar + archives androidJavadocsJar + } +} \ No newline at end of file From a92bcf5524c4455e0f12cf526209d16ee59fba7d Mon Sep 17 00:00:00 2001 From: jogehring Date: Wed, 20 Aug 2014 15:53:03 +0700 Subject: [PATCH 017/231] new basis --- .../com/jjoe64/graphview/BarGraphView.java | 129 -- .../graphview/CustomLabelFormatter.java | 54 - .../graphview/DefaultLabelFormatter.java | 36 + .../java/com/jjoe64/graphview/GraphView.java | 1078 +---------------- .../graphview/GraphViewDataInterface.java | 30 - .../com/jjoe64/graphview/GraphViewSeries.java | 206 ---- .../com/jjoe64/graphview/GraphViewStyle.java | 208 ---- .../jjoe64/graphview/GridLabelRenderer.java | 204 ++++ .../com/jjoe64/graphview/LabelFormatter.java | 8 + .../com/jjoe64/graphview/LegendRenderer.java | 12 + .../com/jjoe64/graphview/LineGraphSeries.java | 7 + .../com/jjoe64/graphview/LineGraphView.java | 177 --- .../com/jjoe64/graphview/TitleRenderer.java | 12 + .../jjoe64/graphview/ValueDependentColor.java | 28 - .../java/com/jjoe64/graphview/Viewport.java | 40 + .../compatible/RealScaleGestureDetector.java | 36 - .../compatible/ScaleGestureDetector.java | 97 -- 17 files changed, 371 insertions(+), 1991 deletions(-) delete mode 100644 src/main/java/com/jjoe64/graphview/BarGraphView.java delete mode 100644 src/main/java/com/jjoe64/graphview/CustomLabelFormatter.java create mode 100644 src/main/java/com/jjoe64/graphview/DefaultLabelFormatter.java mode change 100755 => 100644 src/main/java/com/jjoe64/graphview/GraphView.java delete mode 100644 src/main/java/com/jjoe64/graphview/GraphViewDataInterface.java delete mode 100644 src/main/java/com/jjoe64/graphview/GraphViewSeries.java delete mode 100644 src/main/java/com/jjoe64/graphview/GraphViewStyle.java create mode 100644 src/main/java/com/jjoe64/graphview/GridLabelRenderer.java create mode 100644 src/main/java/com/jjoe64/graphview/LabelFormatter.java create mode 100644 src/main/java/com/jjoe64/graphview/LegendRenderer.java create mode 100644 src/main/java/com/jjoe64/graphview/LineGraphSeries.java delete mode 100644 src/main/java/com/jjoe64/graphview/LineGraphView.java create mode 100644 src/main/java/com/jjoe64/graphview/TitleRenderer.java delete mode 100644 src/main/java/com/jjoe64/graphview/ValueDependentColor.java create mode 100644 src/main/java/com/jjoe64/graphview/Viewport.java delete mode 100644 src/main/java/com/jjoe64/graphview/compatible/RealScaleGestureDetector.java delete mode 100644 src/main/java/com/jjoe64/graphview/compatible/ScaleGestureDetector.java diff --git a/src/main/java/com/jjoe64/graphview/BarGraphView.java b/src/main/java/com/jjoe64/graphview/BarGraphView.java deleted file mode 100644 index e1656710d..000000000 --- a/src/main/java/com/jjoe64/graphview/BarGraphView.java +++ /dev/null @@ -1,129 +0,0 @@ -/** - * This file is part of GraphView. - * - * GraphView is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * GraphView is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with GraphView. If not, see . - * - * Copyright Jonas Gehring - */ - -package com.jjoe64.graphview; - -import android.content.Context; -import android.graphics.Canvas; -import android.graphics.Color; -import android.graphics.Paint.Align; -import android.util.AttributeSet; - -import com.jjoe64.graphview.GraphViewSeries.GraphViewSeriesStyle; - -/** - * Draws a Bar Chart - * @author Muhammad Shahab Hameed - */ -public class BarGraphView extends GraphView { - private boolean drawValuesOnTop; - private int valuesOnTopColor = Color.WHITE; - - public BarGraphView(Context context, AttributeSet attrs) { - super(context, attrs); - } - - public BarGraphView(Context context, String title) { - super(context, title); - } - - @Override - protected void drawHorizontalLabels(Canvas canvas, float border, - float horstart, float height, String[] horlabels, float graphwidth) { - // horizontal labels + lines - paint.setTextAlign(Align.CENTER); - - int hors = horlabels.length; - float barwidth = graphwidth/horlabels.length; - float textOffset = barwidth/2; - for (int i = 0; i < horlabels.length; i++) { - // lines - float x = ((graphwidth / hors) * i) + horstart; - paint.setColor(graphViewStyle.getGridColor()); - canvas.drawLine(x, height - border, x, border, paint); - - if(getShowHorizontalLabels()) { - // text - x = barwidth*i + textOffset + horstart; - paint.setColor(graphViewStyle.getHorizontalLabelsColor()); - canvas.drawText(horlabels[i], x, height - 4, paint); - } - } - } - - @SuppressWarnings("deprecation") - @Override - public void drawSeries(Canvas canvas, GraphViewDataInterface[] values, float graphwidth, float graphheight, - float border, double minX, double minY, double diffX, double diffY, - float horstart, GraphViewSeriesStyle style) { - float colwidth = graphwidth / (values.length); - - paint.setStrokeWidth(style.thickness); - - float offset = 0; - - // draw data - for (int i = 0; i < values.length; i++) { - float valY = (float) (values[i].getY() - minY); - float ratY = (float) (valY / diffY); - float y = graphheight * ratY; - - // hook for value dependent color - if (style.getValueDependentColor() != null) { - paint.setColor(style.getValueDependentColor().get(values[i])); - } else { - paint.setColor(style.color); - } - - float left = (i * colwidth) + horstart -offset; - float top = (border - y) + graphheight; - float right = ((i * colwidth) + horstart) + (colwidth - 1) -offset; - canvas.drawRect(left, top, right, graphheight + border - 1, paint); - - // -----Set values on top of graph--------- - if (drawValuesOnTop) { - top -= 4; - if (top<=border) top+=border+4; - paint.setTextAlign(Align.CENTER); - paint.setColor(valuesOnTopColor ); - canvas.drawText(formatLabel(values[i].getY(), false), (left+right)/2, top, paint); - } - } - } - - public boolean getDrawValuesOnTop() { - return drawValuesOnTop; - } - - public int getValuesOnTopColor() { - return valuesOnTopColor; - } - - /** - * You can set the flag to let the GraphView draw the values on top of the bars - * @param drawValuesOnTop - */ - public void setDrawValuesOnTop(boolean drawValuesOnTop) { - this.drawValuesOnTop = drawValuesOnTop; - } - - public void setValuesOnTopColor(int valuesOnTopColor) { - this.valuesOnTopColor = valuesOnTopColor; - } -} diff --git a/src/main/java/com/jjoe64/graphview/CustomLabelFormatter.java b/src/main/java/com/jjoe64/graphview/CustomLabelFormatter.java deleted file mode 100644 index dcb266a6a..000000000 --- a/src/main/java/com/jjoe64/graphview/CustomLabelFormatter.java +++ /dev/null @@ -1,54 +0,0 @@ -/** - * This file is part of GraphView. - * - * GraphView is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * GraphView is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with GraphView. If not, see . - * - * Copyright Jonas Gehring - */ - -package com.jjoe64.graphview; - -/** - * if you want to show different labels, - * you can use this label formatter. - * As Input you get the raw value (x or y) and - * you return a String that will be displayed. - * {@code - * graphView.setCustomLabelFormatter(new CustomLabelFormatter() { - public String formatLabel(double value, boolean isValueX) { - if (isValueX) { - if (value < 5) { - return "small"; - } else if (value < 15) { - return "middle"; - } else { - return "big"; - } - } - return null; // let graphview generate Y-axis label for us - } - }); - * } - */ -public interface CustomLabelFormatter { - - /** - * will be called when the labels were generated - * @param value the raw input value (x or y) - * @param isValueX true if value is a x-value, false if otherwise - * @return the string that will be displayed. return null if you want graphview to generate the label for you. - */ - String formatLabel(double value, boolean isValueX); - -} diff --git a/src/main/java/com/jjoe64/graphview/DefaultLabelFormatter.java b/src/main/java/com/jjoe64/graphview/DefaultLabelFormatter.java new file mode 100644 index 000000000..6554919e4 --- /dev/null +++ b/src/main/java/com/jjoe64/graphview/DefaultLabelFormatter.java @@ -0,0 +1,36 @@ +package com.jjoe64.graphview; + +import java.text.NumberFormat; + +/** + * Created by jonas on 15.08.14. + */ +public class DefaultLabelFormatter implements LabelFormatter { + protected NumberFormat[] numberformatter = new NumberFormat[2]; + protected Viewport mViewport; + + public DefaultLabelFormatter(Viewport viewport) { + mViewport = viewport; + } + + public String formatLabel(double value, boolean isValueX) { + int i = isValueX ? 1 : 0; + if (numberformatter[i] == null) { + numberformatter[i] = NumberFormat.getNumberInstance(); + double highestvalue = isValueX ? mViewport.getMaxX() : mViewport.getMaxY(); + double lowestvalue = isValueX ? mViewport.getMinX() : mViewport.getMinY(); + if (highestvalue - lowestvalue < 0.1) { + numberformatter[i].setMaximumFractionDigits(6); + } else if (highestvalue - lowestvalue < 1) { + numberformatter[i].setMaximumFractionDigits(4); + } else if (highestvalue - lowestvalue < 20) { + numberformatter[i].setMaximumFractionDigits(3); + } else if (highestvalue - lowestvalue < 100) { + numberformatter[i].setMaximumFractionDigits(1); + } else { + numberformatter[i].setMaximumFractionDigits(0); + } + } + return numberformatter[i].format(value); + } +} diff --git a/src/main/java/com/jjoe64/graphview/GraphView.java b/src/main/java/com/jjoe64/graphview/GraphView.java old mode 100755 new mode 100644 index 718bf4d2a..c61732c16 --- a/src/main/java/com/jjoe64/graphview/GraphView.java +++ b/src/main/java/com/jjoe64/graphview/GraphView.java @@ -1,1051 +1,77 @@ -/** - * This file is part of GraphView. - * - * GraphView is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * GraphView is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with GraphView. If not, see . - * - * Copyright Jonas Gehring - */ - package com.jjoe64.graphview; -import java.nio.charset.Charset; -import java.text.NumberFormat; -import java.util.ArrayList; -import java.util.List; - import android.content.Context; import android.graphics.Canvas; -import android.graphics.Color; -import android.graphics.Paint; -import android.graphics.Paint.Align; -import android.graphics.Rect; -import android.graphics.RectF; import android.util.AttributeSet; -import android.util.Log; -import android.view.MotionEvent; import android.view.View; -import android.widget.LinearLayout; -import com.jjoe64.graphview.GraphViewSeries.GraphViewSeriesStyle; -import com.jjoe64.graphview.GraphViewStyle.GridStyle; -import com.jjoe64.graphview.compatible.ScaleGestureDetector; +import java.util.ArrayList; +import java.util.List; /** - * GraphView is a Android View for creating zoomable and scrollable graphs. - * This is the abstract base class for all graphs. Extend this class and implement {@link #drawSeries(android.graphics.Canvas, GraphViewDataInterface[], float, float, float, double, double, double, double, float, com.jjoe64.graphview.GraphViewSeries.GraphViewSeriesStyle)} to display a custom graph. - * Use {@link com.jjoe64.graphview.LineGraphView} for creating a line chart. - * - * @author jjoe64 - jonas gehring - http://www.jjoe64.com - * - * Copyright (C) 2011 Jonas Gehring - * Licensed under the GNU Lesser General Public License (LGPL) - * http://www.gnu.org/licenses/lgpl.html + * Created by jonas on 13.08.14. */ -abstract public class GraphView extends LinearLayout { - static final private class GraphViewConfig { - static final float BORDER = 20; - } - - private class GraphViewContentView extends View { - private float lastTouchEventX; - private float graphwidth; - private boolean scrollingStarted; - - /** - * @param context - */ - public GraphViewContentView(Context context) { - super(context); - setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); - } - - /** - * @param canvas - */ - @Override - protected void onDraw(Canvas canvas) { - - paint.setAntiAlias(true); - - // normal - paint.setStrokeWidth(0); - - float border = GraphViewConfig.BORDER; - float horstart = 0; - float height = getHeight(); - float width = getWidth() - 1; - double maxY = getMaxY(); - double minY = getMinY(); - double maxX = getMaxX(false); - double minX = getMinX(false); - double diffX = maxX - minX; - - // measure bottom text - if (labelTextHeight == null || horLabelTextWidth == null) { - paint.setTextSize(getGraphViewStyle().getTextSize()); - double testX = ((getMaxX(true)-getMinX(true))*0.783)+getMinX(true); - String testLabel = formatLabel(testX, true); - paint.getTextBounds(testLabel, 0, testLabel.length(), textBounds); - // multiline - int lines = 1; - for (byte c : testLabel.getBytes(Charset.defaultCharset())) { - if (c == '\n') lines++; - } - labelTextHeight = textBounds.height()*lines; - horLabelTextWidth = (textBounds.width()); - } - border += labelTextHeight; - - float graphheight = height - (2 * border); - graphwidth = width; - - if (horlabels == null) { - horlabels = generateHorlabels(graphwidth); - } else if (getGraphViewStyle().getNumHorizontalLabels() > 0) { - Log.w("GraphView", "when you use static labels (via setHorizontalLabels) the labels will just be shown exactly in that way, that you have set it. setNumHorizontalLabels does not have any effect."); - } - if (verlabels == null) { - verlabels = generateVerlabels(graphheight); - } else if (getGraphViewStyle().getNumVerticalLabels() > 0) { - Log.w("GraphView", "when you use static labels (via setVerticalLabels) the labels will just be shown exactly in that way, that you have set it. setNumVerticalLabels does not have any effect."); - } - - // horizontal lines - if (graphViewStyle.getGridStyle().drawHorizontal()) { - paint.setTextAlign(Align.LEFT); - int vers = verlabels.length - 1; - for (int i = 0; i < verlabels.length; i++) { - paint.setColor(graphViewStyle.getGridColor()); - float y = ((graphheight / vers) * i) + border; - canvas.drawLine(horstart, y, width, y, paint); - } - } - - drawHorizontalLabels(canvas, border, horstart, height, horlabels, graphwidth); - - paint.setColor(graphViewStyle.getHorizontalLabelsColor()); - paint.setTextAlign(Align.CENTER); - canvas.drawText(title, (graphwidth / 2) + horstart, border - 4, paint); - - if (maxY == minY) { - // if min/max is the same, fake it so that we can render a line - if(maxY == 0) { - // if both are zero, change the values to prevent division by zero - maxY = 1.0d; - minY = 0.0d; - } else { - maxY = maxY*1.05d; - minY = minY*0.95d; - } - } - - double diffY = maxY - minY; - paint.setStrokeCap(Paint.Cap.ROUND); - - for (int i=0; i maxX) { - viewportStart = maxX - viewportSize; - } - - // labels have to be regenerated - if (!staticHorizontalLabels) horlabels = null; - if (!staticVerticalLabels) verlabels = null; - viewVerLabels.invalidate(); - } - invalidate(); - } - - /** - * @param event - */ - @Override - public boolean onTouchEvent(MotionEvent event) { - if (!isScrollable() || isDisableTouch()) { - return super.onTouchEvent(event); - } - - boolean handled = false; - // first scale - if (scalable && scaleDetector != null) { - scaleDetector.onTouchEvent(event); - handled = scaleDetector.isInProgress(); - } - if (!handled) { - //Log.d("GraphView", "on touch event scale not handled+"+lastTouchEventX); - // if not scaled, scroll - if ((event.getAction() & MotionEvent.ACTION_DOWN) == MotionEvent.ACTION_DOWN && - (event.getAction() & MotionEvent.ACTION_MOVE) == 0) { - scrollingStarted = true; - handled = true; - } - if ((event.getAction() & MotionEvent.ACTION_UP) == MotionEvent.ACTION_UP) { - scrollingStarted = false; - lastTouchEventX = 0; - handled = true; - } - if ((event.getAction() & MotionEvent.ACTION_MOVE) == MotionEvent.ACTION_MOVE) { - if (scrollingStarted) { - if (lastTouchEventX != 0) { - onMoveGesture(event.getX() - lastTouchEventX); - } - lastTouchEventX = event.getX(); - handled = true; - } - } - if (handled) - invalidate(); - } else { - // currently scaling - scrollingStarted = false; - lastTouchEventX = 0; - } - return handled; - } - } - - /** - * one data set for a graph series - */ - static public class GraphViewData implements GraphViewDataInterface { - public final double valueX; - public final double valueY; - public GraphViewData(double valueX, double valueY) { - super(); - this.valueX = valueX; - this.valueY = valueY; - } - @Override - public double getX() { - return valueX; - } - @Override - public double getY() { - return valueY; - } - } - - public enum LegendAlign { - TOP, MIDDLE, BOTTOM - } - - private class VerLabelsView extends View { - /** - * @param context - */ - public VerLabelsView(Context context) { - super(context); - setLayoutParams(new LayoutParams( - getGraphViewStyle().getVerticalLabelsWidth()==0?100:getGraphViewStyle().getVerticalLabelsWidth() - , LayoutParams.FILL_PARENT)); - } - - /** - * @param canvas - */ - @Override - protected void onDraw(Canvas canvas) { - // normal - paint.setStrokeWidth(0); - - // measure bottom text - if (labelTextHeight == null || verLabelTextWidth == null) { - paint.setTextSize(getGraphViewStyle().getTextSize()); - double testY = ((getMaxY()-getMinY())*0.783)+getMinY(); - String testLabel = formatLabel(testY, false); - paint.getTextBounds(testLabel, 0, testLabel.length(), textBounds); - labelTextHeight = (textBounds.height()); - verLabelTextWidth = (textBounds.width()); - } - if (getGraphViewStyle().getVerticalLabelsWidth()==0 && getLayoutParams().width != verLabelTextWidth+GraphViewConfig.BORDER) { - setLayoutParams(new LayoutParams( - (int) (verLabelTextWidth+GraphViewConfig.BORDER), LayoutParams.FILL_PARENT)); - } else if (getGraphViewStyle().getVerticalLabelsWidth()!=0 && getGraphViewStyle().getVerticalLabelsWidth() != getLayoutParams().width) { - setLayoutParams(new LayoutParams( - getGraphViewStyle().getVerticalLabelsWidth(), LayoutParams.FILL_PARENT)); - } - - float border = GraphViewConfig.BORDER; - border += labelTextHeight; - float height = getHeight(); - float graphheight = height - (2 * border); - - if (verlabels == null) { - verlabels = generateVerlabels(graphheight); - } else if (getGraphViewStyle().getNumVerticalLabels() > 0) { - Log.w("GraphView", "when you use static labels (via setVerticalLabels) the labels will just be shown exactly in that way, that you have set it. setNumVerticalLabels does not have any effect."); - } - - // vertical labels - paint.setTextAlign(getGraphViewStyle().getVerticalLabelsAlign()); - int labelsWidth = getWidth(); - int labelsOffset = 0; - if (getGraphViewStyle().getVerticalLabelsAlign() == Align.RIGHT) { - labelsOffset = labelsWidth; - } else if (getGraphViewStyle().getVerticalLabelsAlign() == Align.CENTER) { - labelsOffset = labelsWidth / 2; - } - int vers = verlabels.length - 1; - for (int i = 0; i < verlabels.length; i++) { - float y = ((graphheight / vers) * i) + border; - paint.setColor(graphViewStyle.getVerticalLabelsColor()); - - String[] lines = verlabels[i].split("\n"); - for (int li=0; li graphSeries; - private boolean showLegend = false; - private LegendAlign legendAlign = LegendAlign.MIDDLE; - private boolean manualYAxis; - private boolean manualMaxY; - private boolean manualMinY; - private double manualMaxYValue; - private double manualMinYValue; - protected GraphViewStyle graphViewStyle; - private final GraphViewContentView graphViewContentView; - private CustomLabelFormatter customLabelFormatter; - private Integer labelTextHeight; - private Integer horLabelTextWidth; - private Integer verLabelTextWidth; - private final Rect textBounds = new Rect(); - private boolean staticHorizontalLabels; - private boolean staticVerticalLabels; - private boolean showHorizontalLabels = true; - private boolean showVerticalLabels = true; - - public GraphView(Context context, AttributeSet attrs) { - this(context, attrs.getAttributeValue(null, "title")); - - int width = attrs.getAttributeIntValue("android", "layout_width", LayoutParams.MATCH_PARENT); - int height = attrs.getAttributeIntValue("android", "layout_height", LayoutParams.MATCH_PARENT); - setLayoutParams(new LayoutParams(width, height)); - } - - /** - * @param context - * @param title [optional] - */ - public GraphView(Context context, String title) { - super(context); - setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); - - if (title == null) - this.title = ""; - else - this.title = title; - - graphViewStyle = new GraphViewStyle(); - graphViewStyle.useTextColorFromTheme(context); - - paint = new Paint(); - graphSeries = new ArrayList(); - - viewVerLabels = new VerLabelsView(context); - addView(viewVerLabels); - graphViewContentView = new GraphViewContentView(context); - addView(graphViewContentView, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT, 1)); - } - - private GraphViewDataInterface[] _values(int idxSeries) { - GraphViewDataInterface[] values = graphSeries.get(idxSeries).values; - synchronized (values) { - if (viewportStart == 0 && viewportSize == 0) { - // all data - return values; - } else { - // viewport - List listData = new ArrayList(); - for (int i=0; i= viewportStart) { - if (values[i].getX() > viewportStart+viewportSize) { - listData.add(values[i]); // one more for nice scrolling - break; - } else { - listData.add(values[i]); - } - } else { - if (listData.isEmpty()) { - listData.add(values[i]); - } - listData.set(0, values[i]); // one before, for nice scrolling - } - } - return listData.toArray(new GraphViewDataInterface[listData.size()]); - } - } - } - - /** - * add a series of data to the graph - * @param series - */ - public void addSeries(GraphViewSeries series) { - series.addGraphView(this); - graphSeries.add(series); - redrawAll(); - } - - protected void drawHorizontalLabels(Canvas canvas, float border, - float horstart, float height, String[] horlabels, float graphwidth) { - // horizontal labels + lines - int hors = horlabels.length - 1; - for (int i = 0; i < horlabels.length; i++) { - paint.setColor(graphViewStyle.getGridColor()); - float x = ((graphwidth / hors) * i) + horstart; - if(graphViewStyle.getGridStyle().drawVertical()) { // vertical lines - canvas.drawLine(x, height - border, x, border, paint); - } - if(showHorizontalLabels) { - paint.setTextAlign(Align.CENTER); - if (i==horlabels.length-1) - paint.setTextAlign(Align.RIGHT); - if (i==0) - paint.setTextAlign(Align.LEFT); - paint.setColor(graphViewStyle.getHorizontalLabelsColor()); - String[] lines = horlabels[i].split("\n"); - for (int li=0; li 0) { - GraphViewDataInterface[] values = graphSeries.get(0).values; - if (values.length == 0) { - highest = 0; - } else { - highest = values[values.length-1].getX(); - } - for (int i=1; i 0) { - highest = Math.max(highest, values[values.length-1].getX()); - } - } - } - return highest; - } - } - - /** - * returns the maximal Y value of all data. - * - * warning: only override this, if you really know want you're doing! - */ - protected double getMaxY() { - double largest; - if (manualYAxis || manualMaxY) { - largest = manualMaxYValue; - } else { - largest = Integer.MIN_VALUE; - for (int i=0; i largest) - largest = values[ii].getY(); - } - } - return largest; - } - - /** - * returns the minimal X value of the current viewport (if viewport is set) - * otherwise minimal X value of all data. - * @param ignoreViewport - * - * warning: only override this, if you really know want you're doing! - */ - protected double getMinX(boolean ignoreViewport) { - // if viewport is set, use this - if (!ignoreViewport && viewportSize != 0) { - return viewportStart; - } else { - // otherwise use the min x value - // values must be sorted by x, so the first value has the smallest X value - double lowest = 0; - if (graphSeries.size() > 0) { - GraphViewDataInterface[] values = graphSeries.get(0).values; - if (values.length == 0) { - lowest = 0; - } else { - lowest = values[0].getX(); - } - for (int i=1; i 0) { - lowest = Math.min(lowest, values[0].getX()); - } - } - } - return lowest; - } - } - - /** - * returns the minimal Y value of all data. - * - * warning: only override this, if you really know want you're doing! - */ - protected double getMinY() { - double smallest; - if (manualYAxis || manualMinY) { - smallest = manualMinYValue; - } else { - smallest = Integer.MAX_VALUE; - for (int i=0; i= graphSeries.size()) { - throw new IndexOutOfBoundsException("No series at index " + index); - } - - removeSeries(graphSeries.get(index)); - } - - /** - * scrolls to the last x-value - * @throws IllegalStateException if scrollable == false - */ - public void scrollToEnd() { - if (!scrollable) throw new IllegalStateException("This GraphView is not scrollable."); - double max = getMaxX(true); - viewportStart = max-viewportSize; - - // don't clear labels width/height cache - // so that the display is not flickering - if (!staticVerticalLabels) verlabels = null; - if (!staticHorizontalLabels) horlabels = null; - - invalidate(); - viewVerLabels.invalidate(); - graphViewContentView.invalidate(); - } - - /** - * set a custom label formatter - * @param customLabelFormatter - */ - public void setCustomLabelFormatter(CustomLabelFormatter customLabelFormatter) { - this.customLabelFormatter = customLabelFormatter; - } - - /** - * The user can disable any touch gestures, this is useful if you are using a real time graph, but don't want the user to interact - * @param disableTouch - */ - public void setDisableTouch(boolean disableTouch) { - this.disableTouch = disableTouch; - } - - /** - * set custom graphview style - * @param style - */ - public void setGraphViewStyle(GraphViewStyle style) { - graphViewStyle = style; - labelTextHeight = null; - } - - /** - * set's static horizontal labels (from left to right) - * @param horlabels if null, labels were generated automatically - */ - public void setHorizontalLabels(String[] horlabels) { - staticHorizontalLabels = horlabels != null; - this.horlabels = horlabels; - } - - /** - * legend position - * @param legendAlign - */ - public void setLegendAlign(LegendAlign legendAlign) { - this.legendAlign = legendAlign; - } - - /** - * legend width - * @param legendWidth - * @deprecated use {@link GraphViewStyle#setLegendWidth(int)} - */ - @Deprecated - public void setLegendWidth(float legendWidth) { - getGraphViewStyle().setLegendWidth((int)legendWidth); - } - - /** - * you have to set the bounds {@link #setManualYAxisBounds(double, double)}. That automatically enables manualYAxis-flag. - * if you want to disable the menual y axis, call this method with false. - * @param manualYAxis - */ - public void setManualYAxis(boolean manualYAxis) { - this.manualYAxis = manualYAxis; - } - - /** - * if you want to disable the menual y axis maximum bound, call this method with false. - */ - public void setManualMaxY(boolean manualMaxY) { - this.manualMaxY = manualMaxY; - } - - /** - * if you want to disable the menual y axis minimum bound, call this method with false. - */ - public void setManualMinY(boolean manualMinY) { - this.manualMinY = manualMinY; - } - - /** - * set manual Y axis limit - * @param max - * @param min - */ - public void setManualYAxisBounds(double max, double min) { - manualMaxYValue = max; - manualMinYValue = min; - manualYAxis = true; - } - - /* - * set manual Y axis max limit - * @param max - */ - public void setManualYMaxBound(double max) { - manualMaxYValue = max; - manualMaxY = true; - } - - /* - * set manual Y axis min limit - * @param min - */ - public void setManualYMinBound(double min) { - manualMinYValue = min; - manualMinY = true; - } - - /** - * this forces scrollable = true - * @param scalable - */ - synchronized public void setScalable(boolean scalable) { - this.scalable = scalable; - if (scalable == true && scaleDetector == null) { - scrollable = true; // automatically forces this - scaleDetector = new ScaleGestureDetector(getContext(), new ScaleGestureDetector.SimpleOnScaleGestureListener() { - @Override - public boolean onScale(ScaleGestureDetector detector) { - double center = viewportStart + viewportSize / 2; - viewportSize /= detector.getScaleFactor(); - viewportStart = center - viewportSize / 2; - - // viewportStart must not be < minX - double minX = getMinX(true); - if (viewportStart < minX) { - viewportStart = minX; - } - - // viewportStart + viewportSize must not be > maxX - double maxX = getMaxX(true); - if (viewportSize == 0) { - viewportSize = maxX; - } - double overlap = viewportStart + viewportSize - maxX; - if (overlap > 0) { - // scroll left - if (viewportStart-overlap > minX) { - viewportStart -= overlap; - } else { - // maximal scale - viewportStart = minX; - viewportSize = maxX - viewportStart; - } - } - redrawAll(); - return true; - } - }); - } - } +public class GraphView extends View { + private List mSeries; + private GridLabelRenderer mGridLabelRenderer; + private Viewport mViewport; + private LegendRenderer mLegendRenderer; + private TitleRenderer mTitleRenderer; + + public GraphView(Context context) { + super(context); + init(); + } - /** - * the user can scroll (horizontal) the graph. This is only useful if you use a viewport {@link #setViewPort(double, double)} which doesn't displays all data. - * @param scrollable - */ - public void setScrollable(boolean scrollable) { - this.scrollable = scrollable; - } + public GraphView(Context context, AttributeSet attrs) { + super(context, attrs); + init(); + } - public void setShowLegend(boolean showLegend) { - this.showLegend = showLegend; - } + public GraphView(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + init(); + } - /** - * sets the title of graphview - * @param title - */ - public void setTitle(String title) { - this.title = title; - } + protected void init() { + mViewport = new Viewport(this); + mGridLabelRenderer = new GridLabelRenderer(this); + mLegendRenderer = new LegendRenderer(this); + mTitleRenderer = new TitleRenderer(this); - /** - * set's static vertical labels (from top to bottom) - * @param verlabels if null, labels were generated automatically - */ - public void setVerticalLabels(String[] verlabels) { - staticVerticalLabels = verlabels != null; - this.verlabels = verlabels; - } + mSeries = new ArrayList(); + } - /** - * set's the viewport for the graph. - * @see #setManualYAxisBounds(double, double) to limit the y-viewport - * @param start x-value - * @param size - */ - public void setViewPort(double start, double size) { - if (size<0) { - throw new IllegalArgumentException("Viewport size must be greater than 0!"); - } - viewportStart = start; - viewportSize = size; - } + public void addSeries(LineGraphSeries s) { + mSeries.add(s); + } - /** - * Sets whether horizontal labels are drawn or not. - * - * @param showHorizontalLabels - */ - public void setShowHorizontalLabels(boolean showHorizontalLabels) { - this.showHorizontalLabels = showHorizontalLabels; - redrawAll(); + public List getSeries() { + // TODO immutable array + return null; } - /** - * Gets are horizontal labels drawn. - * - * @return {@code True} if horizontal labels are drawn - */ - public boolean getShowHorizontalLabels() { - return showHorizontalLabels; + protected void onDataChanged() { + // adjust grid system + mGridLabelRenderer.adjust(); } - /** - * Sets whether vertical labels are drawn or not. - * - * @param showVerticalLabels - */ - public void setShowVerticalLabels(boolean showVerticalLabels) { - this.showVerticalLabels = showVerticalLabels; - if(this.showVerticalLabels) { - addView(viewVerLabels, 0); - } else { - removeView(viewVerLabels); - } + @Override + protected void onDraw(Canvas canvas) { + mGridLabelRenderer.draw(canvas); } - /** - * Gets are vertical labels are drawn. - * - * @return {@code True} if vertical labels are drawn - */ - public boolean getShowVerticalLabels() { - return showVerticalLabels; + public Viewport getViewport() { + return mViewport; } + @Override + protected void onSizeChanged(int w, int h, int oldw, int oldh) { + super.onSizeChanged(w, h, oldw, oldh); + // test data + mViewport.setMaxY(650); + mViewport.setMinY(-50); + onDataChanged(); + + } } diff --git a/src/main/java/com/jjoe64/graphview/GraphViewDataInterface.java b/src/main/java/com/jjoe64/graphview/GraphViewDataInterface.java deleted file mode 100644 index e24638c44..000000000 --- a/src/main/java/com/jjoe64/graphview/GraphViewDataInterface.java +++ /dev/null @@ -1,30 +0,0 @@ -/** - * This file is part of GraphView. - * - * GraphView is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * GraphView is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with GraphView. If not, see . - * - * Copyright Jonas Gehring - */ - -package com.jjoe64.graphview; - -/** - * the base interface for the graphview data. - * you can use your own data models, when they implement - * this interface. - */ -public interface GraphViewDataInterface { - public double getX(); - public double getY(); -} diff --git a/src/main/java/com/jjoe64/graphview/GraphViewSeries.java b/src/main/java/com/jjoe64/graphview/GraphViewSeries.java deleted file mode 100644 index 53ed95c17..000000000 --- a/src/main/java/com/jjoe64/graphview/GraphViewSeries.java +++ /dev/null @@ -1,206 +0,0 @@ -/** - * This file is part of GraphView. - * - * GraphView is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * GraphView is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with GraphView. If not, see . - * - * Copyright Jonas Gehring - */ - -package com.jjoe64.graphview; - -import java.util.ArrayList; -import java.util.List; - -/** - * a graphview series. - * holds the data, description and styles - */ -public class GraphViewSeries { - /** - * graph series style: color and thickness - */ - static public class GraphViewSeriesStyle { - public int color = 0xff0077cc; - public int thickness = 3; - private ValueDependentColor valueDependentColor; - - public GraphViewSeriesStyle() { - super(); - } - public GraphViewSeriesStyle(int color, int thickness) { - super(); - this.color = color; - this.thickness = thickness; - } - - public ValueDependentColor getValueDependentColor() { - return valueDependentColor; - } - - /** - * the color depends on the value of the data. - * only possible in BarGraphView - * @param valueDependentColor - */ - public void setValueDependentColor(ValueDependentColor valueDependentColor) { - this.valueDependentColor = valueDependentColor; - } - } - - final String description; - final GraphViewSeriesStyle style; - GraphViewDataInterface[] values; - private final List graphViews = new ArrayList(); - - /** - * create a series with predefined values - * @param values the values must be in the correct order! x-value has to be ASC. First the lowest x value and at least the highest x value. - */ - public GraphViewSeries(GraphViewDataInterface[] values) { - description = null; - style = new GraphViewSeriesStyle(); - this.values = values; - checkValueOrder(); - } - - /** - * create a series with predefined options - * @param description the name of the series - * @param style custom style. can be null for default styles - * @param values the values must be in the correct order! x-value has to be ASC. First the lowest x value and at least the highest x value. - */ - public GraphViewSeries(String description, GraphViewSeriesStyle style, GraphViewDataInterface[] values) { - super(); - this.description = description; - if (style == null) { - style = new GraphViewSeriesStyle(); - } - this.style = style; - this.values = values; - checkValueOrder(); - } - - /** - * this graphview will be redrawn if data changes - * @param graphView - */ - public void addGraphView(GraphView graphView) { - this.graphViews.add(graphView); - } - - /** - * add one data to current data - * the values must be in the correct order! x-value has to be ASC. First the lowest x value and at least the highest x value. - * @param value the new data to append - * @param scrollToEnd true => graphview will scroll to the end (maxX) - * @deprecated please use {@link #appendData(GraphViewDataInterface, boolean, int)} to avoid memory overflow - */ - @Deprecated - public void appendData(GraphViewDataInterface value, boolean scrollToEnd) { - if (values.length > 0 && value.getX() < values[values.length-1].getX()) { - throw new IllegalArgumentException("new x-value must be greater then the last value. x-values has to be ordered in ASC."); - } - GraphViewDataInterface[] newValues = new GraphViewDataInterface[values.length + 1]; - int offset = values.length; - System.arraycopy(values, 0, newValues, 0, offset); - - newValues[values.length] = value; - values = newValues; - for (GraphView g : graphViews) { - if (scrollToEnd) { - g.scrollToEnd(); - } - } - } - - /** - * add one data to current data - * the values must be in the correct order! x-value has to be ASC. First the lowest x value and at least the highest x value. - * - * @param value the new data to append. Important: the new value must be higher then the last value (x). - * @param scrollToEnd true => graphview will scroll to the end (maxX) - * @param maxDataCount if max data count is reached, the oldest data value will be lost - */ - public void appendData(GraphViewDataInterface value, boolean scrollToEnd, int maxDataCount) { - if (values.length > 0 && value.getX() < values[values.length-1].getX()) { - throw new IllegalArgumentException("new x-value must be greater then the last value. x-values has to be ordered in ASC."); - } - synchronized (values) { - int curDataCount = values.length; - GraphViewDataInterface[] newValues; - if (curDataCount < maxDataCount) { - // enough space - newValues = new GraphViewDataInterface[curDataCount + 1]; - System.arraycopy(values, 0, newValues, 0, curDataCount); - // append new data - newValues[curDataCount] = value; - } else { - // we have to trim one data - newValues = new GraphViewDataInterface[maxDataCount]; - System.arraycopy(values, 1, newValues, 0, curDataCount-1); - // append new data - newValues[maxDataCount-1] = value; - } - values = newValues; - } - - // update linked graph views - for (GraphView g : graphViews) { - if (scrollToEnd) { - g.scrollToEnd(); - } - } - } - - /** - * @return series styles. never null - */ - public GraphViewSeriesStyle getStyle() { - return style; - } - - /** - * you should use {@link GraphView#removeSeries(GraphViewSeries)} - * @param graphView - */ - public void removeGraphView(GraphView graphView) { - graphViews.remove(graphView); - } - - /** - * clears the current data and set the new. - * - * redraws the graphview(s) - * @param values the values must be in the correct order! x-value has to be ASC. First the lowest x value and at least the highest x value. - */ - public void resetData(GraphViewDataInterface[] values) { - this.values = values; - checkValueOrder(); - for (GraphView g : graphViews) { - g.redrawAll(); - } - } - - private void checkValueOrder() { - if (values.length>0) { - double lx = values[0].getX(); - for (int i=1;i values[i].getX()) { - throw new IllegalArgumentException("The order of the values is not correct. X-Values have to be ordered ASC. First the lowest x value and at least the highest x value."); - } - lx = values[i].getX(); - } - } - } -} diff --git a/src/main/java/com/jjoe64/graphview/GraphViewStyle.java b/src/main/java/com/jjoe64/graphview/GraphViewStyle.java deleted file mode 100644 index cd5bd9afd..000000000 --- a/src/main/java/com/jjoe64/graphview/GraphViewStyle.java +++ /dev/null @@ -1,208 +0,0 @@ -/** - * This file is part of GraphView. - * - * GraphView is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * GraphView is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with GraphView. If not, see . - * - * Copyright Jonas Gehring - */ - -package com.jjoe64.graphview; - -import android.content.Context; -import android.content.res.TypedArray; -import android.graphics.Color; -import android.graphics.Paint.Align; -import android.view.ContextThemeWrapper; - -/** - * Styles for the GraphView - * Important: Use {@link com.jjoe64.graphview.GraphViewSeries.GraphViewSeriesStyle} for series-specify styling - * - */ -public class GraphViewStyle { - private int verticalLabelsColor; - private int horizontalLabelsColor; - private int gridColor; - private GridStyle gridStyle = GridStyle.BOTH; - private float textSize; - private int verticalLabelsWidth; - private int numVerticalLabels; - private int numHorizontalLabels; - private int legendWidth; - private int legendBorder; - private int legendSpacing; - private int legendMarginBottom; - private Align verticalLabelsAlign; - - public GraphViewStyle() { - setDefaults(); - } - - public GraphViewStyle(int vLabelsColor, int hLabelsColor, int gridColor) { - setDefaults(); - this.verticalLabelsColor = vLabelsColor; - this.horizontalLabelsColor = hLabelsColor; - this.gridColor = gridColor; - } - - public int getGridColor() { - return gridColor; - } - - public GridStyle getGridStyle() { - return gridStyle; - } - - public int getHorizontalLabelsColor() { - return horizontalLabelsColor; - } - - public int getLegendBorder() { - return legendBorder; - } - - public int getLegendSpacing() { - return legendSpacing; - } - - public int getLegendWidth() { - return legendWidth; - } - - public int getLegendMarginBottom() { - return legendMarginBottom; - } - - public int getNumHorizontalLabels() { - return numHorizontalLabels; - } - - public int getNumVerticalLabels() { - return numVerticalLabels; - } - - public float getTextSize() { - return textSize; - } - - public Align getVerticalLabelsAlign() { - return verticalLabelsAlign; - } - - public int getVerticalLabelsColor() { - return verticalLabelsColor; - } - - public int getVerticalLabelsWidth() { - return verticalLabelsWidth; - } - - private void setDefaults() { - verticalLabelsColor = Color.WHITE; - horizontalLabelsColor = Color.WHITE; - gridColor = Color.DKGRAY; - textSize = 30f; - legendWidth = 120; - legendBorder = 10; - legendSpacing = 10; - legendMarginBottom = 0; - verticalLabelsAlign = Align.LEFT; - } - - public void setGridStyle(GridStyle style) { - gridStyle = style; - } - - public void setGridColor(int c) { - gridColor = c; - } - - public void setHorizontalLabelsColor(int c) { - horizontalLabelsColor = c; - } - - public void setLegendBorder(int legendBorder) { - this.legendBorder = legendBorder; - } - - public void setLegendSpacing(int legendSpacing) { - this.legendSpacing = legendSpacing; - } - - public void setLegendWidth(int legendWidth) { - this.legendWidth = legendWidth; - } - - public void setLegendMarginBottom(int legendMarginBottom) { - this.legendMarginBottom = legendMarginBottom; - } - - /** - * @param numHorizontalLabels 0 = auto - */ - public void setNumHorizontalLabels(int numHorizontalLabels) { - this.numHorizontalLabels = numHorizontalLabels; - } - - /** - * @param numVerticalLabels 0 = auto - */ - public void setNumVerticalLabels(int numVerticalLabels) { - this.numVerticalLabels = numVerticalLabels; - } - - public void setTextSize(float textSize) { - this.textSize = textSize; - } - - public void setVerticalLabelsAlign(Align verticalLabelsAlign) { - this.verticalLabelsAlign = verticalLabelsAlign; - } - - public void setVerticalLabelsColor(int c) { - verticalLabelsColor = c; - } - - /** - * @param verticalLabelsWidth 0 = auto - */ - public void setVerticalLabelsWidth(int verticalLabelsWidth) { - this.verticalLabelsWidth = verticalLabelsWidth; - } - - /** - * tries to get the theme's font color and use it for labels - * @param context must be instance of ContextThemeWrapper - */ - public void useTextColorFromTheme(Context context) { - if (context instanceof ContextThemeWrapper) { - TypedArray array = ((ContextThemeWrapper) context).getTheme().obtainStyledAttributes(new int[] {android.R.attr.textColorPrimary}); - int color = array.getColor(0, getVerticalLabelsColor()); - array.recycle(); - - setVerticalLabelsColor(color); - setHorizontalLabelsColor(color); - } - } - - /** - * Definition which lines will be drawn in the background - */ - public enum GridStyle { - BOTH, VERTICAL, HORIZONTAL, NONE; - - public boolean drawVertical() { return this == BOTH || this == VERTICAL && this != NONE; } - public boolean drawHorizontal() { return this == BOTH || this == HORIZONTAL && this != NONE; } - } -} diff --git a/src/main/java/com/jjoe64/graphview/GridLabelRenderer.java b/src/main/java/com/jjoe64/graphview/GridLabelRenderer.java new file mode 100644 index 000000000..badae0585 --- /dev/null +++ b/src/main/java/com/jjoe64/graphview/GridLabelRenderer.java @@ -0,0 +1,204 @@ +package com.jjoe64.graphview; + +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.graphics.Rect; +import android.util.Log; + +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * Created by jonas on 13.08.14. + */ +public class GridLabelRenderer { + private final class Styles { + float textSize; + Paint.Align verticalLabelsAlign; + int verticalLabelsColor; + } + + protected Styles mStyles; + private final GraphView mGraphView; + private Map mStepsVertical; + private Map mVerticalLabels; + private Paint mPaintLine; + private Paint mPaintLabel; + private boolean mIsAdjusted; + private Integer mLabelVerticalWidth; + private Integer mLabelVerticalHeight; + private LabelFormatter mLabelFormatter; + + public GridLabelRenderer(GraphView graphView) { + mGraphView = graphView; + mLabelFormatter = new DefaultLabelFormatter(graphView.getViewport()); + mStyles = new Styles(); + resetStyles(); + } + + public void resetStyles() { + mStyles.textSize = 20; + mStyles.verticalLabelsAlign = Paint.Align.RIGHT; + mStyles.verticalLabelsColor = Color.RED; + + reloadStyles(); + } + + public void reloadStyles() { + mPaintLine = new Paint(); + mPaintLine.setColor(Color.RED); + mPaintLine.setStrokeWidth(2); + + mPaintLabel = new Paint(); + mPaintLabel.setTextAlign(getVerticalLabelsAlign()); + mPaintLabel.setTextSize(getTextSize()); + } + + public float getTextSize() { return mStyles.textSize; } + public int getVerticalLabelsColor() { return mStyles.verticalLabelsColor; } + public Paint.Align getVerticalLabelsAlign() { return mStyles.verticalLabelsAlign; } + + public void invalide() { + mIsAdjusted = false; + mLabelVerticalWidth = null; + mLabelVerticalHeight = null; + } + + /** + * adjusts the grid and labels to match to the data + */ + protected void adjust() { + // get min/max of current viewport + double minX = mGraphView.getViewport().getMinX(); + double maxX = mGraphView.getViewport().getMaxX(); + double minY = mGraphView.getViewport().getMinY(); + double maxY = mGraphView.getViewport().getMaxY(); + + // find the number of labels + int numVerticalLabels = 5; + + // find good steps + // TODO Math.abs for negative numbers? + boolean adjusting = true; + double newMinY = minY; + double exactSteps = 0d; + while (adjusting) { + double rangeY = maxY - newMinY; + exactSteps = rangeY / (numVerticalLabels - 1); + exactSteps = humanRound(exactSteps); + + // adjust viewport + // wie oft passt STEP in minY rein? + int count = 0; + if (newMinY >= 0d) { + // positive number + while (newMinY - exactSteps >= 0) { + newMinY -= exactSteps; + count++; + } + newMinY = exactSteps * count; + } else { + // negative number + count++; + while (newMinY + exactSteps < 0) { + newMinY += exactSteps; + count++; + } + newMinY = exactSteps * count * -1; + } + + // wenn minY sich geändert hat, steps nochmal berechnen + // wenn nicht, fertig + if (newMinY == minY) { + adjusting = false; + } else { + minY = newMinY; + } + } + + double newMaxY = newMinY + (numVerticalLabels-1)*exactSteps; + mGraphView.getViewport().setMinY(newMinY); + mGraphView.getViewport().setMaxY(newMaxY); + + mStepsVertical = new LinkedHashMap(numVerticalLabels); + int height = mGraphView.getHeight(); + double v = newMaxY; + int p = 0; + int pixelStep = height/(numVerticalLabels-1); + for (int i = 0; i < numVerticalLabels; i++) { + mStepsVertical.put(p, v); + p += pixelStep; + v -= exactSteps; + } + + mIsAdjusted = true; + } + + protected void calcLabelVerticalSize(Canvas canvas) { + // test label + double testY = ((mGraphView.getViewport().getMaxY()-mGraphView.getViewport().getMinY())*0.783)+mGraphView.getViewport().getMinY(); + String testLabel = mLabelFormatter.formatLabel(testY, false); + Rect textBounds = new Rect(); + mPaintLabel.getTextBounds(testLabel, 0, testLabel.length(), textBounds); + mLabelVerticalWidth = textBounds.width(); + mLabelVerticalHeight = textBounds.height(); + } + + public void draw(Canvas canvas) { + if (!mIsAdjusted) { + adjust(); + } + if (mLabelVerticalWidth == null) { + calcLabelVerticalSize(canvas); + } + + // draw vertical steps (horizontal lines and vertical labels) + float marginLeft = 20; + mPaintLabel.setColor(getVerticalLabelsColor()); + for (Map.Entry e : mStepsVertical.entrySet()) { + // draw line + canvas.drawLine(marginLeft, e.getKey(), canvas.getWidth(), e.getKey(), mPaintLine); + + // draw label + int labelsWidth = mLabelVerticalWidth; + int labelsOffset = 0; + if (getVerticalLabelsAlign() == Paint.Align.RIGHT) { + labelsOffset = labelsWidth; + } else if (getVerticalLabelsAlign() == Paint.Align.CENTER) { + labelsOffset = labelsWidth / 2; + } + + float y = e.getKey(); + + String[] lines = mLabelFormatter.formatLabel(e.getValue(), false).split("\n"); + for (int li=0; li= 10d) { + in /= 10d; + ten++; + } + while (in < 1d) { + in *= 10d; + ten--; + } + if (in == 1d) { + } else if (in <= 2d) { + in = 2d; + } else if (in <= 5d) { + in = 5d; + } else if (in < 10d) { + in = 10d; + } + return in*Math.pow(10d, ten); + } +} diff --git a/src/main/java/com/jjoe64/graphview/LabelFormatter.java b/src/main/java/com/jjoe64/graphview/LabelFormatter.java new file mode 100644 index 000000000..8ef8f3bcd --- /dev/null +++ b/src/main/java/com/jjoe64/graphview/LabelFormatter.java @@ -0,0 +1,8 @@ +package com.jjoe64.graphview; + +/** + * Created by jonas on 15.08.14. + */ +public interface LabelFormatter { + public String formatLabel(double value, boolean isValueX); +} diff --git a/src/main/java/com/jjoe64/graphview/LegendRenderer.java b/src/main/java/com/jjoe64/graphview/LegendRenderer.java new file mode 100644 index 000000000..a02b5d023 --- /dev/null +++ b/src/main/java/com/jjoe64/graphview/LegendRenderer.java @@ -0,0 +1,12 @@ +package com.jjoe64.graphview; + +/** + * Created by jonas on 14.08.14. + */ +public class LegendRenderer { + private final GraphView mGraphView; + + public LegendRenderer(GraphView graphView) { + mGraphView = graphView; + } +} diff --git a/src/main/java/com/jjoe64/graphview/LineGraphSeries.java b/src/main/java/com/jjoe64/graphview/LineGraphSeries.java new file mode 100644 index 000000000..90ffec28b --- /dev/null +++ b/src/main/java/com/jjoe64/graphview/LineGraphSeries.java @@ -0,0 +1,7 @@ +package com.jjoe64.graphview; + +/** + * Created by jonas on 13.08.14. + */ +public class LineGraphSeries { +} diff --git a/src/main/java/com/jjoe64/graphview/LineGraphView.java b/src/main/java/com/jjoe64/graphview/LineGraphView.java deleted file mode 100644 index 1fce017f6..000000000 --- a/src/main/java/com/jjoe64/graphview/LineGraphView.java +++ /dev/null @@ -1,177 +0,0 @@ -/** - * This file is part of GraphView. - * - * GraphView is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * GraphView is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with GraphView. If not, see . - * - * Copyright Jonas Gehring - */ - -package com.jjoe64.graphview; - -import android.content.Context; -import android.graphics.Canvas; -import android.graphics.Color; -import android.graphics.Paint; -import android.graphics.Path; -import android.util.AttributeSet; - -import com.jjoe64.graphview.GraphViewSeries.GraphViewSeriesStyle; - -/** - * Line Graph View. This draws a line chart. - */ -public class LineGraphView extends GraphView { - private final Paint paintBackground; - private boolean drawBackground; - private boolean drawDataPoints; - private float dataPointsRadius = 10f; - - public LineGraphView(Context context, AttributeSet attrs) { - super(context, attrs); - - paintBackground = new Paint(); - paintBackground.setColor(Color.rgb(20, 40, 60)); - paintBackground.setStrokeWidth(4); - paintBackground.setAlpha(128); - } - - public LineGraphView(Context context, String title) { - super(context, title); - - paintBackground = new Paint(); - paintBackground.setColor(Color.rgb(20, 40, 60)); - paintBackground.setStrokeWidth(4); - paintBackground.setAlpha(128); - } - - @Override - public void drawSeries(Canvas canvas, GraphViewDataInterface[] values, float graphwidth, float graphheight, float border, double minX, double minY, double diffX, double diffY, float horstart, GraphViewSeriesStyle style) { - // draw background - double lastEndY = 0; - double lastEndX = 0; - - // draw data - paint.setStrokeWidth(style.thickness); - paint.setColor(style.color); - - - Path bgPath = null; - if (drawBackground) { - bgPath = new Path(); - } - - lastEndY = 0; - lastEndX = 0; - float firstX = 0; - for (int i = 0; i < values.length; i++) { - double valY = values[i].getY() - minY; - double ratY = valY / diffY; - double y = graphheight * ratY; - - double valX = values[i].getX() - minX; - double ratX = valX / diffX; - double x = graphwidth * ratX; - - if (i > 0) { - float startX = (float) lastEndX + (horstart + 1); - float startY = (float) (border - lastEndY) + graphheight; - float endX = (float) x + (horstart + 1); - float endY = (float) (border - y) + graphheight; - - // draw data point - if (drawDataPoints) { - //fix: last value was not drawn. Draw here now the end values - canvas.drawCircle(endX, endY, dataPointsRadius, paint); - } - - canvas.drawLine(startX, startY, endX, endY, paint); - if (bgPath != null) { - if (i==1) { - firstX = startX; - bgPath.moveTo(startX, startY); - } - bgPath.lineTo(endX, endY); - } - } else if (drawDataPoints) { - //fix: last value not drawn as datapoint. Draw first point here, and then on every step the end values (above) - float first_X = (float) x + (horstart + 1); - float first_Y = (float) (border - y) + graphheight; - canvas.drawCircle(first_X, first_Y, dataPointsRadius, paint); - } - lastEndY = y; - lastEndX = x; - } - - if (bgPath != null) { - // end / close path - bgPath.lineTo((float) lastEndX, graphheight + border); - bgPath.lineTo(firstX, graphheight + border); - bgPath.close(); - canvas.drawPath(bgPath, paintBackground); - } - } - - public int getBackgroundColor() { - return paintBackground.getColor(); - } - - public float getDataPointsRadius() { - return dataPointsRadius; - } - - public boolean getDrawBackground() { - return drawBackground; - } - - public boolean getDrawDataPoints() { - return drawDataPoints; - } - - /** - * sets the background color for the series. - * This is not the background color of the whole graph. - * @see #setDrawBackground(boolean) - */ - @Override - public void setBackgroundColor(int color) { - paintBackground.setColor(color); - } - - /** - * sets the radius of the circles at the data points. - * @see #setDrawDataPoints(boolean) - * @param dataPointsRadius - */ - public void setDataPointsRadius(float dataPointsRadius) { - this.dataPointsRadius = dataPointsRadius; - } - - /** - * @param drawBackground true for a light blue background under the graph line - * @see #setBackgroundColor(int) - */ - public void setDrawBackground(boolean drawBackground) { - this.drawBackground = drawBackground; - } - - /** - * You can set the flag to let the GraphView draw circles at the data points - * @see #setDataPointsRadius(float) - * @param drawDataPoints - */ - public void setDrawDataPoints(boolean drawDataPoints) { - this.drawDataPoints = drawDataPoints; - } - -} diff --git a/src/main/java/com/jjoe64/graphview/TitleRenderer.java b/src/main/java/com/jjoe64/graphview/TitleRenderer.java new file mode 100644 index 000000000..aaae3b820 --- /dev/null +++ b/src/main/java/com/jjoe64/graphview/TitleRenderer.java @@ -0,0 +1,12 @@ +package com.jjoe64.graphview; + +/** + * Created by jonas on 14.08.14. + */ +public class TitleRenderer { + private final GraphView mGraphView; + + public TitleRenderer(GraphView graphView) { + mGraphView = graphView; + } +} diff --git a/src/main/java/com/jjoe64/graphview/ValueDependentColor.java b/src/main/java/com/jjoe64/graphview/ValueDependentColor.java deleted file mode 100644 index 7b406ceed..000000000 --- a/src/main/java/com/jjoe64/graphview/ValueDependentColor.java +++ /dev/null @@ -1,28 +0,0 @@ -/** - * This file is part of GraphView. - * - * GraphView is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * GraphView is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with GraphView. If not, see . - * - * Copyright Jonas Gehring - */ - -package com.jjoe64.graphview; - -/** - * you can change the color depending on the value. - * takes only effect in BarGraphView - */ -public interface ValueDependentColor { - public int get(GraphViewDataInterface data); -} diff --git a/src/main/java/com/jjoe64/graphview/Viewport.java b/src/main/java/com/jjoe64/graphview/Viewport.java new file mode 100644 index 000000000..999cb7f74 --- /dev/null +++ b/src/main/java/com/jjoe64/graphview/Viewport.java @@ -0,0 +1,40 @@ +package com.jjoe64.graphview; + +/** + * Created by jonas on 13.08.14. + */ +public class Viewport { + private final GraphView mGraphView; + private double mMinX; + private double mMaxX; + private double mMinY; + private double mMaxY; + + public Viewport(GraphView graphView) { + mGraphView = graphView; + } + + public double getMinX() { + return mMinX; + } + + public double getMaxX() { + return mMaxX; + } + + public double getMinY() { + return mMinY; + } + + public double getMaxY() { + return mMaxY; + } + + public void setMaxY(double y) { + mMaxY = y; + } + + public void setMinY(double y) { + mMinY = y; + } +} diff --git a/src/main/java/com/jjoe64/graphview/compatible/RealScaleGestureDetector.java b/src/main/java/com/jjoe64/graphview/compatible/RealScaleGestureDetector.java deleted file mode 100644 index a9143b034..000000000 --- a/src/main/java/com/jjoe64/graphview/compatible/RealScaleGestureDetector.java +++ /dev/null @@ -1,36 +0,0 @@ -/** - * This file is part of GraphView. - * - * GraphView is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * GraphView is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with GraphView. If not, see . - * - * Copyright Jonas Gehring - */ - -package com.jjoe64.graphview.compatible; - -import android.annotation.SuppressLint; -import android.content.Context; -import android.view.ScaleGestureDetector; - -@SuppressLint("NewApi") -public class RealScaleGestureDetector extends ScaleGestureDetector { - public RealScaleGestureDetector(Context context, final com.jjoe64.graphview.compatible.ScaleGestureDetector fakeScaleGestureDetector, final com.jjoe64.graphview.compatible.ScaleGestureDetector.SimpleOnScaleGestureListener fakeListener) { - super(context, new android.view.ScaleGestureDetector.SimpleOnScaleGestureListener() { - @Override - public boolean onScale(ScaleGestureDetector detector) { - return fakeListener.onScale(fakeScaleGestureDetector); - } - }); - } -} diff --git a/src/main/java/com/jjoe64/graphview/compatible/ScaleGestureDetector.java b/src/main/java/com/jjoe64/graphview/compatible/ScaleGestureDetector.java deleted file mode 100644 index 3a29d4bd7..000000000 --- a/src/main/java/com/jjoe64/graphview/compatible/ScaleGestureDetector.java +++ /dev/null @@ -1,97 +0,0 @@ -/** - * This file is part of GraphView. - * - * GraphView is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * GraphView is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with GraphView. If not, see . - * - * Copyright Jonas Gehring - */ - -package com.jjoe64.graphview.compatible; - -import java.lang.reflect.Constructor; -import java.lang.reflect.Method; - -import android.content.Context; -import android.util.Log; -import android.view.MotionEvent; - -public class ScaleGestureDetector { - public interface SimpleOnScaleGestureListener { - boolean onScale(ScaleGestureDetector detector); - } - - private Object realScaleGestureDetector; - private Method method_getScaleFactor; - private Method method_isInProgress; - private Method method_onTouchEvent; - - /** - * @param context - * @param simpleOnScaleGestureListener - */ - public ScaleGestureDetector(Context context, SimpleOnScaleGestureListener simpleOnScaleGestureListener) { - try { - // check if class is available - Class.forName("android.view.ScaleGestureDetector"); - - // load class and methods - Class classRealScaleGestureDetector = Class.forName("com.jjoe64.graphview.compatible.RealScaleGestureDetector"); - method_getScaleFactor = classRealScaleGestureDetector.getMethod("getScaleFactor"); - method_isInProgress = classRealScaleGestureDetector.getMethod("isInProgress"); - method_onTouchEvent = classRealScaleGestureDetector.getMethod("onTouchEvent", MotionEvent.class); - - // create real ScaleGestureDetector - Constructor constructor = classRealScaleGestureDetector.getConstructor(Context.class, getClass(), SimpleOnScaleGestureListener.class); - realScaleGestureDetector = constructor.newInstance(context, this, simpleOnScaleGestureListener); - } catch (Exception e) { - // not available - Log.w("com.jjoe64.graphview", "*** WARNING *** No scaling available for graphs. Exception:"); - e.printStackTrace(); - } - } - - public double getScaleFactor() { - if (method_getScaleFactor != null) { - try { - return (Float) method_getScaleFactor.invoke(realScaleGestureDetector); - } catch (Exception e) { - e.printStackTrace(); - return 1.0; - } - } - return 1.0; - } - - public boolean isInProgress() { - if (method_getScaleFactor != null) { - try { - return (Boolean) method_isInProgress.invoke(realScaleGestureDetector); - } catch (Exception e) { - e.printStackTrace(); - return false; - } - } - return false; - } - - public void onTouchEvent(MotionEvent event) { - if (method_onTouchEvent != null) { - try { - method_onTouchEvent.invoke(realScaleGestureDetector, event); - } catch (Exception e) { - e.printStackTrace(); - } - } - } -} From c2c11330e598b7e33a090beabf0fd48d222e0d8e Mon Sep 17 00:00:00 2001 From: jogehring Date: Fri, 22 Aug 2014 17:48:23 +0700 Subject: [PATCH 018/231] grid label system works --- GraphView.iml | 2 - .../java/com/jjoe64/graphview/GraphView.java | 6 +- .../jjoe64/graphview/GridLabelRenderer.java | 195 ++++++++++++++++-- .../java/com/jjoe64/graphview/Viewport.java | 8 + 4 files changed, 190 insertions(+), 21 deletions(-) diff --git a/GraphView.iml b/GraphView.iml index d9c648497..56889cf24 100644 --- a/GraphView.iml +++ b/GraphView.iml @@ -58,9 +58,7 @@ - - diff --git a/src/main/java/com/jjoe64/graphview/GraphView.java b/src/main/java/com/jjoe64/graphview/GraphView.java index c61732c16..69da679f1 100644 --- a/src/main/java/com/jjoe64/graphview/GraphView.java +++ b/src/main/java/com/jjoe64/graphview/GraphView.java @@ -69,8 +69,10 @@ public Viewport getViewport() { protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); // test data - mViewport.setMaxY(650); - mViewport.setMinY(-50); + mViewport.setMaxY(400); + mViewport.setMinY(0); + mViewport.setMaxX(400); + mViewport.setMinX(0); onDataChanged(); } diff --git a/src/main/java/com/jjoe64/graphview/GridLabelRenderer.java b/src/main/java/com/jjoe64/graphview/GridLabelRenderer.java index badae0585..6dfff1dac 100644 --- a/src/main/java/com/jjoe64/graphview/GridLabelRenderer.java +++ b/src/main/java/com/jjoe64/graphview/GridLabelRenderer.java @@ -17,17 +17,24 @@ private final class Styles { float textSize; Paint.Align verticalLabelsAlign; int verticalLabelsColor; + int horizontalLabelsColor; + int gridColor; + boolean highlightZeroLines; + int padding; } protected Styles mStyles; private final GraphView mGraphView; private Map mStepsVertical; + private Map mStepsHorizontal; private Map mVerticalLabels; private Paint mPaintLine; private Paint mPaintLabel; private boolean mIsAdjusted; private Integer mLabelVerticalWidth; private Integer mLabelVerticalHeight; + private Integer mLabelHorizontalWidth; + private Integer mLabelHorizontalHeight; private LabelFormatter mLabelFormatter; public GridLabelRenderer(GraphView graphView) { @@ -41,14 +48,20 @@ public void resetStyles() { mStyles.textSize = 20; mStyles.verticalLabelsAlign = Paint.Align.RIGHT; mStyles.verticalLabelsColor = Color.RED; + mStyles.horizontalLabelsColor = Color.RED; + + mStyles.gridColor = Color.RED; + mStyles.highlightZeroLines = true; + + mStyles.padding = 20; reloadStyles(); } public void reloadStyles() { mPaintLine = new Paint(); - mPaintLine.setColor(Color.RED); - mPaintLine.setStrokeWidth(2); + mPaintLine.setColor(mStyles.gridColor); + mPaintLine.setStrokeWidth(0); mPaintLabel = new Paint(); mPaintLabel.setTextAlign(getVerticalLabelsAlign()); @@ -58,6 +71,7 @@ public void reloadStyles() { public float getTextSize() { return mStyles.textSize; } public int getVerticalLabelsColor() { return mStyles.verticalLabelsColor; } public Paint.Align getVerticalLabelsAlign() { return mStyles.verticalLabelsAlign; } + public int getHorizontalLabelsColor() { return mStyles.horizontalLabelsColor; } public void invalide() { mIsAdjusted = false; @@ -65,13 +79,11 @@ public void invalide() { mLabelVerticalHeight = null; } - /** - * adjusts the grid and labels to match to the data - */ - protected void adjust() { - // get min/max of current viewport - double minX = mGraphView.getViewport().getMinX(); - double maxX = mGraphView.getViewport().getMaxX(); + protected boolean adjustVertical() { + if (mLabelHorizontalHeight == null) { + return false; + } + double minY = mGraphView.getViewport().getMinY(); double maxY = mGraphView.getViewport().getMaxY(); @@ -79,7 +91,6 @@ protected void adjust() { int numVerticalLabels = 5; // find good steps - // TODO Math.abs for negative numbers? boolean adjusting = true; double newMinY = minY; double exactSteps = 0d; @@ -122,9 +133,9 @@ protected void adjust() { mGraphView.getViewport().setMaxY(newMaxY); mStepsVertical = new LinkedHashMap(numVerticalLabels); - int height = mGraphView.getHeight(); + int height = mGraphView.getHeight() - mStyles.padding*2 - mLabelHorizontalHeight; double v = newMaxY; - int p = 0; + int p = mStyles.padding; int pixelStep = height/(numVerticalLabels-1); for (int i = 0; i < numVerticalLabels; i++) { mStepsVertical.put(p, v); @@ -132,7 +143,82 @@ protected void adjust() { v -= exactSteps; } - mIsAdjusted = true; + return true; + } + + protected boolean adjustHorizontal() { + if (mLabelVerticalWidth == null) { + return false; + } + + double minX = mGraphView.getViewport().getMinX(); + double maxX = mGraphView.getViewport().getMaxX(); + + // find the number of labels + int numHorizontalLabels = 5; + + // find good steps + boolean adjusting = true; + double newMinX = minX; + double exactSteps = 0d; + while (adjusting) { + double rangeX = maxX - newMinX; + exactSteps = rangeX / (numHorizontalLabels - 1); + exactSteps = humanRound(exactSteps); + + // adjust viewport + // wie oft passt STEP in minX rein? + int count = 0; + if (newMinX >= 0d) { + // positive number + while (newMinX - exactSteps >= 0) { + newMinX -= exactSteps; + count++; + } + newMinX = exactSteps * count; + } else { + // negative number + count++; + while (newMinX + exactSteps < 0) { + newMinX += exactSteps; + count++; + } + newMinX = exactSteps * count * -1; + } + + // wenn minX sich geändert hat, steps nochmal berechnen + // wenn nicht, fertig + if (newMinX == minX) { + adjusting = false; + } else { + minX = newMinX; + } + } + + double newMaxX = newMinX + (numHorizontalLabels-1)*exactSteps; + mGraphView.getViewport().setMinX(newMinX); + mGraphView.getViewport().setMaxX(newMaxX); + + mStepsHorizontal = new LinkedHashMap(numHorizontalLabels); + int width = mGraphView.getWidth() - mStyles.padding*2 - mLabelVerticalWidth; + double v = newMinX; + int p = mStyles.padding + mLabelVerticalWidth; + int pixelStep = width/(numHorizontalLabels-1); + for (int i = 0; i < numHorizontalLabels; i++) { + mStepsHorizontal.put(p, v); + p += pixelStep; + v += exactSteps; + } + + return true; + } + + /** + * adjusts the grid and labels to match to the data + */ + protected void adjust() { + mIsAdjusted = adjustVertical(); + mIsAdjusted &= adjustHorizontal(); } protected void calcLabelVerticalSize(Canvas canvas) { @@ -143,22 +229,95 @@ protected void calcLabelVerticalSize(Canvas canvas) { mPaintLabel.getTextBounds(testLabel, 0, testLabel.length(), textBounds); mLabelVerticalWidth = textBounds.width(); mLabelVerticalHeight = textBounds.height(); + + // multiline + int lines = 1; + for (byte c : testLabel.getBytes()) { + if (c == '\n') lines++; + } + mLabelVerticalHeight *= lines; + } + + protected void calcLabelHorizontalSize(Canvas canvas) { + // test label + double testX = ((mGraphView.getViewport().getMaxX()-mGraphView.getViewport().getMinX())*0.783)+mGraphView.getViewport().getMinX(); + String testLabel = mLabelFormatter.formatLabel(testX, true); + Rect textBounds = new Rect(); + mPaintLabel.getTextBounds(testLabel, 0, testLabel.length(), textBounds); + mLabelHorizontalWidth = textBounds.width(); + mLabelHorizontalHeight = textBounds.height(); + + // multiline + int lines = 1; + for (byte c : testLabel.getBytes()) { + if (c == '\n') lines++; + } + mLabelHorizontalHeight *= lines; } public void draw(Canvas canvas) { - if (!mIsAdjusted) { - adjust(); + if (mLabelHorizontalWidth == null) { + calcLabelHorizontalSize(canvas); } if (mLabelVerticalWidth == null) { calcLabelVerticalSize(canvas); } + if (!mIsAdjusted) { + adjust(); + } + + if (mIsAdjusted) { + drawVerticalSteps(canvas); + drawHorizontalSteps(canvas); + } + } + + protected void drawHorizontalSteps(Canvas canvas) { + // draw horizontal steps (vertical lines and horizontal labels) + mPaintLabel.setColor(getHorizontalLabelsColor()); + int i=0; + for (Map.Entry e : mStepsHorizontal.entrySet()) { + // draw line + if (mStyles.highlightZeroLines) { + if (e.getValue() == 0d) { + mPaintLine.setStrokeWidth(5); + } else { + mPaintLine.setStrokeWidth(0); + } + } + canvas.drawLine(e.getKey(), mStyles.padding, e.getKey(), canvas.getHeight()- mStyles.padding, mPaintLine); + + // draw label + mPaintLabel.setTextAlign(Paint.Align.CENTER); + if (i==mStepsHorizontal.size()-1) + mPaintLabel.setTextAlign(Paint.Align.RIGHT); + if (i==0) + mPaintLabel.setTextAlign(Paint.Align.LEFT); + String[] lines = mLabelFormatter.formatLabel(e.getValue(), true).split("\n"); + for (int li=0; li e : mStepsVertical.entrySet()) { // draw line - canvas.drawLine(marginLeft, e.getKey(), canvas.getWidth(), e.getKey(), mPaintLine); + if (mStyles.highlightZeroLines) { + if (e.getValue() == 0d) { + mPaintLine.setStrokeWidth(5); + } else { + mPaintLine.setStrokeWidth(0); + } + } + canvas.drawLine(startLeft, e.getKey(), canvas.getWidth()- mStyles.padding, e.getKey(), mPaintLine); // draw label int labelsWidth = mLabelVerticalWidth; @@ -168,10 +327,12 @@ public void draw(Canvas canvas) { } else if (getVerticalLabelsAlign() == Paint.Align.CENTER) { labelsOffset = labelsWidth / 2; } + labelsOffset += mStyles.padding; float y = e.getKey(); String[] lines = mLabelFormatter.formatLabel(e.getValue(), false).split("\n"); + y += (lines.length*getTextSize()*1.1f) / 2; // center text vertically for (int li=0; li Date: Sat, 30 Aug 2014 00:51:58 +0200 Subject: [PATCH 019/231] Line Series --- GraphView.iml | 29 ++++- build.gradle | 4 +- .../java/com/jjoe64/graphview/GraphView.java | 22 +++- .../jjoe64/graphview/GridLabelRenderer.java | 28 ++-- .../com/jjoe64/graphview/LineGraphSeries.java | 7 - .../jjoe64/graphview/series/BaseSeries.java | 62 +++++++++ .../jjoe64/graphview/series/DataPoint.java | 26 ++++ .../graphview/series/DataPointInterface.java | 9 ++ .../graphview/series/LineGraphSeries.java | 122 ++++++++++++++++++ .../com/jjoe64/graphview/series/Series.java | 19 +++ 10 files changed, 297 insertions(+), 31 deletions(-) delete mode 100644 src/main/java/com/jjoe64/graphview/LineGraphSeries.java create mode 100644 src/main/java/com/jjoe64/graphview/series/BaseSeries.java create mode 100644 src/main/java/com/jjoe64/graphview/series/DataPoint.java create mode 100644 src/main/java/com/jjoe64/graphview/series/DataPointInterface.java create mode 100644 src/main/java/com/jjoe64/graphview/series/LineGraphSeries.java create mode 100644 src/main/java/com/jjoe64/graphview/series/Series.java diff --git a/GraphView.iml b/GraphView.iml index 56889cf24..902dc3573 100644 --- a/GraphView.iml +++ b/GraphView.iml @@ -38,34 +38,49 @@ + - + - + - - + + + + + + + + + + + + + + + + + + + - - - diff --git a/build.gradle b/build.gradle index 56d4889c6..2cd108ba2 100644 --- a/build.gradle +++ b/build.gradle @@ -1,4 +1,4 @@ -apply plugin: 'android-library' +apply plugin: 'com.android.library' android { compileSdkVersion 20 @@ -19,8 +19,6 @@ android { } dependencies { - compile 'com.android.support:appcompat-v7:20.+' - compile 'com.android.support:support-v4:20.+' } // This is the actual solution, as in http://stackoverflow.com/a/19037807/1002054 diff --git a/src/main/java/com/jjoe64/graphview/GraphView.java b/src/main/java/com/jjoe64/graphview/GraphView.java index 69da679f1..7fe8c258c 100644 --- a/src/main/java/com/jjoe64/graphview/GraphView.java +++ b/src/main/java/com/jjoe64/graphview/GraphView.java @@ -5,6 +5,9 @@ import android.util.AttributeSet; import android.view.View; +import com.jjoe64.graphview.series.LineGraphSeries; +import com.jjoe64.graphview.series.Series; + import java.util.ArrayList; import java.util.List; @@ -12,7 +15,7 @@ * Created by jonas on 13.08.14. */ public class GraphView extends View { - private List mSeries; + private List mSeries; private GridLabelRenderer mGridLabelRenderer; private Viewport mViewport; private LegendRenderer mLegendRenderer; @@ -39,14 +42,18 @@ protected void init() { mLegendRenderer = new LegendRenderer(this); mTitleRenderer = new TitleRenderer(this); - mSeries = new ArrayList(); + mSeries = new ArrayList(); + } + + public GridLabelRenderer getGridLabelRenderer() { + return mGridLabelRenderer; } - public void addSeries(LineGraphSeries s) { + public void addSeries(Series s) { mSeries.add(s); } - public List getSeries() { + public List getSeries() { // TODO immutable array return null; } @@ -59,6 +66,9 @@ protected void onDataChanged() { @Override protected void onDraw(Canvas canvas) { mGridLabelRenderer.draw(canvas); + for (Series s : mSeries) { + s.draw(this, canvas); + } } public Viewport getViewport() { @@ -69,9 +79,9 @@ public Viewport getViewport() { protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); // test data - mViewport.setMaxY(400); + mViewport.setMaxY(6); mViewport.setMinY(0); - mViewport.setMaxX(400); + mViewport.setMaxX(4); mViewport.setMinX(0); onDataChanged(); diff --git a/src/main/java/com/jjoe64/graphview/GridLabelRenderer.java b/src/main/java/com/jjoe64/graphview/GridLabelRenderer.java index 6dfff1dac..86509dea4 100644 --- a/src/main/java/com/jjoe64/graphview/GridLabelRenderer.java +++ b/src/main/java/com/jjoe64/graphview/GridLabelRenderer.java @@ -13,14 +13,14 @@ * Created by jonas on 13.08.14. */ public class GridLabelRenderer { - private final class Styles { - float textSize; - Paint.Align verticalLabelsAlign; - int verticalLabelsColor; - int horizontalLabelsColor; - int gridColor; - boolean highlightZeroLines; - int padding; + public final class Styles { + public float textSize; + public Paint.Align verticalLabelsAlign; + public int verticalLabelsColor; + public int horizontalLabelsColor; + public int gridColor; + public boolean highlightZeroLines; + public int padding; } protected Styles mStyles; @@ -362,4 +362,16 @@ protected double humanRound(double in) { } return in*Math.pow(10d, ten); } + + public Styles getStyles() { + return mStyles; + } + + public int getLabelVerticalWidth() { + return mLabelVerticalWidth==null?0:mLabelVerticalWidth; + } + + public int getLabelHorizontalHeight() { + return mLabelHorizontalHeight==null?0:mLabelHorizontalHeight; + } } diff --git a/src/main/java/com/jjoe64/graphview/LineGraphSeries.java b/src/main/java/com/jjoe64/graphview/LineGraphSeries.java deleted file mode 100644 index 90ffec28b..000000000 --- a/src/main/java/com/jjoe64/graphview/LineGraphSeries.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.jjoe64.graphview; - -/** - * Created by jonas on 13.08.14. - */ -public class LineGraphSeries { -} diff --git a/src/main/java/com/jjoe64/graphview/series/BaseSeries.java b/src/main/java/com/jjoe64/graphview/series/BaseSeries.java new file mode 100644 index 000000000..96352231b --- /dev/null +++ b/src/main/java/com/jjoe64/graphview/series/BaseSeries.java @@ -0,0 +1,62 @@ +package com.jjoe64.graphview.series; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +/** + * Created by jonas on 28.08.14. + */ +public abstract class BaseSeries implements Series { + private List mData = new ArrayList(); + + public BaseSeries(E[] data) { + for (E d : data) { + mData.add(d); + } + } + + public double getLowestValueX() { + if (mData.isEmpty()) return 0d; + return mData.get(0).getX(); + } + + public double getHighestValueX() { + if (mData.isEmpty()) return 0d; + return mData.get(mData.size()-1).getX(); + } + + public double getLowestValueY() { + if (mData.isEmpty()) return 0d; + double l = mData.get(0).getY(); + for (int i = 1; i < mData.size(); i++) { + double c = mData.get(i).getY(); + if (l > c) { + l = c; + } + } + return l; + } + + public double getHighestValueY() { + if (mData.isEmpty()) return 0d; + double h = mData.get(0).getY(); + for (int i = 1; i < mData.size(); i++) { + double c = mData.get(i).getY(); + if (h < c) { + h = c; + } + } + return h; + } + + @Override + public Iterator getValues(double from, double until) { + if (from <= getLowestValueX() && until >= getHighestValueX()) { + return mData.iterator(); + } else { + // TODO + throw new IllegalStateException(); + } + } +} diff --git a/src/main/java/com/jjoe64/graphview/series/DataPoint.java b/src/main/java/com/jjoe64/graphview/series/DataPoint.java new file mode 100644 index 000000000..1db1350a3 --- /dev/null +++ b/src/main/java/com/jjoe64/graphview/series/DataPoint.java @@ -0,0 +1,26 @@ +package com.jjoe64.graphview.series; + +import android.provider.ContactsContract; + +/** + * Created by jonas on 28.08.14. + */ +public class DataPoint implements DataPointInterface { + private double x; + private double y; + + public DataPoint(double x, double y) { + this.x=x; + this.y=y; + } + + @Override + public double getX() { + return x; + } + + @Override + public double getY() { + return y; + } +} diff --git a/src/main/java/com/jjoe64/graphview/series/DataPointInterface.java b/src/main/java/com/jjoe64/graphview/series/DataPointInterface.java new file mode 100644 index 000000000..5ab760ed3 --- /dev/null +++ b/src/main/java/com/jjoe64/graphview/series/DataPointInterface.java @@ -0,0 +1,9 @@ +package com.jjoe64.graphview.series; + +/** + * Created by jonas on 28.08.14. + */ +public interface DataPointInterface { + public double getX(); + public double getY(); +} diff --git a/src/main/java/com/jjoe64/graphview/series/LineGraphSeries.java b/src/main/java/com/jjoe64/graphview/series/LineGraphSeries.java new file mode 100644 index 000000000..112baa75b --- /dev/null +++ b/src/main/java/com/jjoe64/graphview/series/LineGraphSeries.java @@ -0,0 +1,122 @@ +package com.jjoe64.graphview.series; + +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.Path; + +import com.jjoe64.graphview.GraphView; + +import java.util.Iterator; +import java.util.List; + +/** + * Created by jonas on 13.08.14. + */ +public class LineGraphSeries extends BaseSeries { + private final class Styles { + private int thickness = 3; + private int color = 0xff0077cc; + private boolean drawBackground = false; + private boolean drawDataPoints = false; + private float dataPointsRadius = 10f; + } + + private Styles mStyles; + private Paint mPaint; + private Path mPath; + + public LineGraphSeries(E[] data) { + super(data); + + mStyles = new Styles(); + mPaint = new Paint(); + mPaint.setStrokeCap(Paint.Cap.ROUND); + + mPath = new Path(); + } + + @Override + public void draw(GraphView graphView, Canvas canvas) { + // get data + double maxX = graphView.getViewport().getMaxX(); + double minX = graphView.getViewport().getMinX(); + double maxY = graphView.getViewport().getMaxY(); + double minY = graphView.getViewport().getMinY(); + Iterator values = getValues(minX, maxX); + + // draw background + double lastEndY = 0; + double lastEndX = 0; + + // draw data + mPaint.setStrokeWidth(mStyles.thickness); + mPaint.setColor(mStyles.color); + + if (mStyles.drawBackground) { + mPath.reset(); + } + + double diffY = maxY - minY; + double diffX = maxX - minX; + + float border = graphView.getGridLabelRenderer().getStyles().padding; + float graphheight = graphView.getHeight() - (2 * border) - graphView.getGridLabelRenderer().getLabelHorizontalHeight(); + float graphwidth = graphView.getWidth() - (2 * border) - graphView.getGridLabelRenderer().getLabelVerticalWidth(); + float horstart = border + graphView.getGridLabelRenderer().getLabelVerticalWidth(); + + lastEndY = 0; + lastEndX = 0; + float firstX = 0; + int i=0; + while (values.hasNext()) { + E value = values.next(); + + double valY = value.getY() - minY; + double ratY = valY / diffY; + double y = graphheight * ratY; + + double valX = value.getX() - minX; + double ratX = valX / diffX; + double x = graphwidth * ratX; + + if (i > 0) { + float startX = (float) lastEndX + (horstart + 1); + float startY = (float) (border - lastEndY) + graphheight; + float endX = (float) x + (horstart + 1); + float endY = (float) (border - y) + graphheight; + + // draw data point + if (mStyles.drawDataPoints) { + //fix: last value was not drawn. Draw here now the end values + canvas.drawCircle(endX, endY, mStyles.dataPointsRadius, mPaint); + } + + canvas.drawLine(startX, startY, endX, endY, mPaint); + if (mStyles.drawBackground) { + if (i==1) { + firstX = startX; + mPath.moveTo(startX, startY); + } + mPath.lineTo(endX, endY); + } + } else if (mStyles.drawDataPoints) { + //fix: last value not drawn as datapoint. Draw first point here, and then on every step the end values (above) + float first_X = (float) x + (horstart + 1); + float first_Y = (float) (border - y) + graphheight; + //TODO canvas.drawCircle(first_X, first_Y, dataPointsRadius, mPaint); + } + lastEndY = y; + lastEndX = x; + i++; + } + + if (mStyles.drawBackground) { + // end / close path + mPath.lineTo((float) lastEndX, graphheight + border); + mPath.lineTo(firstX, graphheight + border); + mPath.close(); + //TODO canvas.drawPath(mPath, mPaintBackground); + } + + } +} diff --git a/src/main/java/com/jjoe64/graphview/series/Series.java b/src/main/java/com/jjoe64/graphview/series/Series.java new file mode 100644 index 000000000..a2ce9b783 --- /dev/null +++ b/src/main/java/com/jjoe64/graphview/series/Series.java @@ -0,0 +1,19 @@ +package com.jjoe64.graphview.series; + +import android.graphics.Canvas; + +import com.jjoe64.graphview.GraphView; + +import java.util.Iterator; + +/** + * Created by jonas on 28.08.14. + */ +public interface Series { + public double getLowestValueX(); + public double getHighestValueX(); + public double getLowestValueY(); + public double getHighestValueY(); + public Iterator getValues(double from, double until); + public void draw(GraphView graphView, Canvas canvas); +} From 31c6f89edfa253522924f9cf2577a56ee9a2595d Mon Sep 17 00:00:00 2001 From: jogehring Date: Sat, 30 Aug 2014 09:31:49 +0200 Subject: [PATCH 020/231] auto viewport --- .../java/com/jjoe64/graphview/GraphView.java | 8 +- .../jjoe64/graphview/GridLabelRenderer.java | 2 + .../java/com/jjoe64/graphview/Viewport.java | 84 ++++++++++++++++++- 3 files changed, 83 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/jjoe64/graphview/GraphView.java b/src/main/java/com/jjoe64/graphview/GraphView.java index 7fe8c258c..f4eb2c9fb 100644 --- a/src/main/java/com/jjoe64/graphview/GraphView.java +++ b/src/main/java/com/jjoe64/graphview/GraphView.java @@ -55,7 +55,7 @@ public void addSeries(Series s) { public List getSeries() { // TODO immutable array - return null; + return mSeries; } protected void onDataChanged() { @@ -78,12 +78,6 @@ public Viewport getViewport() { @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); - // test data - mViewport.setMaxY(6); - mViewport.setMinY(0); - mViewport.setMaxX(4); - mViewport.setMinX(0); onDataChanged(); - } } diff --git a/src/main/java/com/jjoe64/graphview/GridLabelRenderer.java b/src/main/java/com/jjoe64/graphview/GridLabelRenderer.java index 86509dea4..74fc5d430 100644 --- a/src/main/java/com/jjoe64/graphview/GridLabelRenderer.java +++ b/src/main/java/com/jjoe64/graphview/GridLabelRenderer.java @@ -131,6 +131,7 @@ protected boolean adjustVertical() { double newMaxY = newMinY + (numVerticalLabels-1)*exactSteps; mGraphView.getViewport().setMinY(newMinY); mGraphView.getViewport().setMaxY(newMaxY); + mGraphView.getViewport().setYAxisBoundsStatus(Viewport.AxisBoundsStatus.AUTO_ADJUSTED); mStepsVertical = new LinkedHashMap(numVerticalLabels); int height = mGraphView.getHeight() - mStyles.padding*2 - mLabelHorizontalHeight; @@ -198,6 +199,7 @@ protected boolean adjustHorizontal() { double newMaxX = newMinX + (numHorizontalLabels-1)*exactSteps; mGraphView.getViewport().setMinX(newMinX); mGraphView.getViewport().setMaxX(newMaxX); + mGraphView.getViewport().setXAxisBoundsStatus(Viewport.AxisBoundsStatus.AUTO_ADJUSTED); mStepsHorizontal = new LinkedHashMap(numHorizontalLabels); int width = mGraphView.getWidth() - mStyles.padding*2 - mLabelVerticalWidth; diff --git a/src/main/java/com/jjoe64/graphview/Viewport.java b/src/main/java/com/jjoe64/graphview/Viewport.java index 7c51cf6c7..5d65fa394 100644 --- a/src/main/java/com/jjoe64/graphview/Viewport.java +++ b/src/main/java/com/jjoe64/graphview/Viewport.java @@ -1,33 +1,109 @@ package com.jjoe64.graphview; +import com.jjoe64.graphview.series.Series; + +import java.util.List; + /** * Created by jonas on 13.08.14. */ public class Viewport { + public enum AxisBoundsStatus { + INITIAL, AUTO_ADJUSTED, MANUAL + } + private final GraphView mGraphView; private double mMinX; private double mMaxX; private double mMinY; private double mMaxY; + private AxisBoundsStatus mXAxisBoundsStatus; + private AxisBoundsStatus mYAxisBoundsStatus; public Viewport(GraphView graphView) { mGraphView = graphView; + mXAxisBoundsStatus = AxisBoundsStatus.INITIAL; + mYAxisBoundsStatus = AxisBoundsStatus.INITIAL; + } + + public void setXAxisBoundsStatus(AxisBoundsStatus s) { + mXAxisBoundsStatus = s; + } + + public void setYAxisBoundsStatus(AxisBoundsStatus s) { + mYAxisBoundsStatus = s; } public double getMinX() { - return mMinX; + if (mXAxisBoundsStatus == AxisBoundsStatus.INITIAL) { + List series = mGraphView.getSeries(); + if (series.isEmpty()) { + return 0; + } + double d = series.get(0).getLowestValueX(); + for (Series s : series) { + if (d > s.getLowestValueX()) { + d = s.getLowestValueX(); + } + } + return d; + } else { + return mMinX; + } } public double getMaxX() { - return mMaxX; + if (mXAxisBoundsStatus == AxisBoundsStatus.INITIAL) { + List series = mGraphView.getSeries(); + if (series.isEmpty()) { + return 0; + } + double d = series.get(0).getHighestValueX(); + for (Series s : series) { + if (d < s.getHighestValueX()) { + d = s.getHighestValueX(); + } + } + return d; + } else { + return mMaxX; + } } public double getMinY() { - return mMinY; + if (mYAxisBoundsStatus == AxisBoundsStatus.INITIAL) { + List series = mGraphView.getSeries(); + if (series.isEmpty()) { + return 0; + } + double d = series.get(0).getLowestValueY(); + for (Series s : series) { + if (d > s.getLowestValueY()) { + d = s.getLowestValueY(); + } + } + return d; + } else { + return mMinY; + } } public double getMaxY() { - return mMaxY; + if (mYAxisBoundsStatus == AxisBoundsStatus.INITIAL) { + List series = mGraphView.getSeries(); + if (series.isEmpty()) { + return 0; + } + double d = series.get(0).getHighestValueY(); + for (Series s : series) { + if (d < s.getHighestValueY()) { + d = s.getHighestValueY(); + } + } + return d; + } else { + return mMaxY; + } } public void setMaxY(double y) { From 1cdf45999a260d5157c14cc017204ba96826b68c Mon Sep 17 00:00:00 2001 From: jogehring Date: Tue, 7 Oct 2014 07:20:55 +0200 Subject: [PATCH 021/231] manual viewport --- GraphView.iml | 3 +- .../jjoe64/graphview/GridLabelRenderer.java | 150 ++++++++++-------- .../java/com/jjoe64/graphview/Viewport.java | 9 ++ .../jjoe64/graphview/series/BaseSeries.java | 60 ++++++- 4 files changed, 152 insertions(+), 70 deletions(-) diff --git a/GraphView.iml b/GraphView.iml index 902dc3573..314f343bd 100644 --- a/GraphView.iml +++ b/GraphView.iml @@ -10,9 +10,10 @@ diff --git a/build.gradle b/build.gradle index 6161c63b7..759e11ad5 100644 --- a/build.gradle +++ b/build.gradle @@ -19,6 +19,7 @@ android { } dependencies { + compile 'com.android.support:appcompat-v7:20.0.0' } // This is the actual solution, as in http://stackoverflow.com/a/19037807/1002054 diff --git a/src/main/java/com/jjoe64/graphview/GridLabelRenderer.java b/src/main/java/com/jjoe64/graphview/GridLabelRenderer.java index 03fee4ff9..cefca7195 100644 --- a/src/main/java/com/jjoe64/graphview/GridLabelRenderer.java +++ b/src/main/java/com/jjoe64/graphview/GridLabelRenderer.java @@ -5,6 +5,7 @@ import android.graphics.Color; import android.graphics.Paint; import android.graphics.Rect; +import android.support.v4.view.ViewCompat; import android.util.Log; import android.util.TypedValue; import android.view.ContextThemeWrapper; @@ -484,7 +485,7 @@ public void draw(Canvas canvas) { } if (labelSizeChanged) { // redraw - mGraphView.postInvalidateOnAnimation(); + ViewCompat.postInvalidateOnAnimation(mGraphView); return; } diff --git a/src/main/java/com/jjoe64/graphview/Viewport.java b/src/main/java/com/jjoe64/graphview/Viewport.java index 8cfa09beb..f746bbf24 100644 --- a/src/main/java/com/jjoe64/graphview/Viewport.java +++ b/src/main/java/com/jjoe64/graphview/Viewport.java @@ -4,13 +4,15 @@ import android.graphics.Color; import android.graphics.Paint; import android.graphics.RectF; +import android.support.v4.view.ViewCompat; +import android.support.v4.widget.EdgeEffectCompat; import android.util.Log; import android.view.GestureDetector; import android.view.MotionEvent; import android.view.ScaleGestureDetector; -import android.widget.EdgeEffect; import android.widget.OverScroller; +import com.jjoe64.graphview.compat.OverScrollerCompat; import com.jjoe64.graphview.series.DataPointInterface; import com.jjoe64.graphview.series.Series; @@ -59,7 +61,7 @@ public boolean onScale(ScaleGestureDetector detector) { // adjust viewport, labels, etc. mGraphView.onDataChanged(); - mGraphView.postInvalidateOnAnimation(); + ViewCompat.postInvalidateOnAnimation(mGraphView); return true; } @@ -90,7 +92,7 @@ public void onScaleEnd(ScaleGestureDetector detector) { // adjust viewport, labels, etc. mGraphView.onDataChanged(); - mGraphView.postInvalidateOnAnimation(); + ViewCompat.postInvalidateOnAnimation(mGraphView); } }; @@ -105,7 +107,7 @@ public boolean onDown(MotionEvent e) { mScrollerStartViewport.set(mCurrentViewport); // Aborts any active scroll animations and invalidates. mScroller.forceFinished(true); - mGraphView.postInvalidateOnAnimation(); + ViewCompat.postInvalidateOnAnimation(mGraphView); return true; } @@ -187,7 +189,7 @@ public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float d // adjust viewport, labels, etc. mGraphView.onDataChanged(); - mGraphView.postInvalidateOnAnimation(); + ViewCompat.postInvalidateOnAnimation(mGraphView); return true; } @@ -222,10 +224,10 @@ public enum AxisBoundsStatus { protected ScaleGestureDetector mScaleGestureDetector; protected OverScroller mScroller; - private EdgeEffect mEdgeEffectTop; - private EdgeEffect mEdgeEffectBottom; - private EdgeEffect mEdgeEffectLeft; - private EdgeEffect mEdgeEffectRight; + private EdgeEffectCompat mEdgeEffectTop; + private EdgeEffectCompat mEdgeEffectBottom; + private EdgeEffectCompat mEdgeEffectLeft; + private EdgeEffectCompat mEdgeEffectRight; private boolean mEdgeEffectTopActive; private boolean mEdgeEffectBottomActive; private boolean mEdgeEffectLeftActive; @@ -243,10 +245,10 @@ public enum AxisBoundsStatus { public Viewport(GraphView graphView) { mScroller = new OverScroller(graphView.getContext()); - mEdgeEffectTop = new EdgeEffect(graphView.getContext()); - mEdgeEffectBottom = new EdgeEffect(graphView.getContext()); - mEdgeEffectLeft = new EdgeEffect(graphView.getContext()); - mEdgeEffectRight = new EdgeEffect(graphView.getContext()); + mEdgeEffectTop = new EdgeEffectCompat(graphView.getContext()); + mEdgeEffectBottom = new EdgeEffectCompat(graphView.getContext()); + mEdgeEffectLeft = new EdgeEffectCompat(graphView.getContext()); + mEdgeEffectRight = new EdgeEffectCompat(graphView.getContext()); mGestureDetector = new GestureDetector(graphView.getContext(), mGestureListener); mScaleGestureDetector = new ScaleGestureDetector(graphView.getContext(), mScaleGestureListener); @@ -441,7 +443,7 @@ private void fling(int velocityX, int velocityY) { 0, maxY, mGraphView.getGraphContentWidth() / 2, mGraphView.getGraphContentHeight() / 2); - mGraphView.postInvalidateOnAnimation(); + ViewCompat.postInvalidateOnAnimation(mGraphView); } public void computeScroll() { @@ -468,14 +470,14 @@ public void computeScroll() { && currX < 0 && mEdgeEffectLeft.isFinished() && !mEdgeEffectLeftActive) { - mEdgeEffectLeft.onAbsorb((int) mScroller.getCurrVelocity()); + mEdgeEffectLeft.onAbsorb((int) OverScrollerCompat.getCurrVelocity(mScroller)); mEdgeEffectLeftActive = true; needsInvalidate = true; } else if (canScrollX && currX > (completeWidth - mGraphView.getGraphContentWidth()) && mEdgeEffectRight.isFinished() && !mEdgeEffectRightActive) { - mEdgeEffectRight.onAbsorb((int) mScroller.getCurrVelocity()); + mEdgeEffectRight.onAbsorb((int) OverScrollerCompat.getCurrVelocity(mScroller)); mEdgeEffectRightActive = true; needsInvalidate = true; } @@ -484,14 +486,14 @@ public void computeScroll() { && currY < 0 && mEdgeEffectTop.isFinished() && !mEdgeEffectTopActive) { - mEdgeEffectTop.onAbsorb((int) mScroller.getCurrVelocity()); + mEdgeEffectTop.onAbsorb((int) OverScrollerCompat.getCurrVelocity(mScroller)); mEdgeEffectTopActive = true; needsInvalidate = true; } else if (canScrollY && currY > (completeHeight - mGraphView.getGraphContentHeight()) && mEdgeEffectBottom.isFinished() && !mEdgeEffectBottomActive) { - mEdgeEffectBottom.onAbsorb((int) mScroller.getCurrVelocity()); + mEdgeEffectBottom.onAbsorb((int) OverScrollerCompat.getCurrVelocity(mScroller)); mEdgeEffectBottomActive = true; needsInvalidate = true; } @@ -510,13 +512,12 @@ public void computeScroll() { } if (needsInvalidate) { - mGraphView.postInvalidateOnAnimation(); + ViewCompat.postInvalidateOnAnimation(mGraphView); } } /** - * Draws the overscroll "glow" at the four edges of the chart region, if necessary. The edges - * of the chart region are stored in {@link #mContentRect}. + * Draws the overscroll "glow" at the four edges of the chart region, if necessary. * * @see EdgeEffectCompat */ @@ -570,7 +571,7 @@ private void drawEdgeEffectsUnclipped(Canvas canvas) { } if (needsInvalidate) { - mGraphView.postInvalidateOnAnimation(); + ViewCompat.postInvalidateOnAnimation(mGraphView); } } diff --git a/src/main/java/com/jjoe64/graphview/compat/OverScrollerCompat.java b/src/main/java/com/jjoe64/graphview/compat/OverScrollerCompat.java new file mode 100644 index 000000000..8a3068033 --- /dev/null +++ b/src/main/java/com/jjoe64/graphview/compat/OverScrollerCompat.java @@ -0,0 +1,30 @@ +package com.jjoe64.graphview.compat; + +import android.annotation.TargetApi; +import android.os.Build; +import android.widget.OverScroller; + +/** + * Created by jonas on 15.11.14. + */ +/** + * A utility class for using {@link android.widget.OverScroller} in a backward-compatible fashion. + */ +public class OverScrollerCompat { + /** + * Disallow instantiation. + */ + private OverScrollerCompat() { + } + /** + * @see android.view.ScaleGestureDetector#getCurrentSpanY() + */ + @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH) + public static float getCurrVelocity(OverScroller overScroller) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) { + return overScroller.getCurrVelocity(); + } else { + return 0; + } + } +} \ No newline at end of file From 3472d6b7d5682437e5128fa25c9597ed080f6ba8 Mon Sep 17 00:00:00 2001 From: jogehring Date: Tue, 18 Nov 2014 20:03:30 +0100 Subject: [PATCH 044/231] xml integration --- .../java/com/jjoe64/graphview/GraphView.java | 33 ++++++++++++------ .../jjoe64/graphview/GridLabelRenderer.java | 34 +++++++++++++------ .../com/jjoe64/graphview/LegendRenderer.java | 14 +++++--- .../jjoe64/graphview/helper/GraphViewXML.java | 24 +++++++++++++ 4 files changed, 80 insertions(+), 25 deletions(-) create mode 100644 src/main/java/com/jjoe64/graphview/helper/GraphViewXML.java diff --git a/src/main/java/com/jjoe64/graphview/GraphView.java b/src/main/java/com/jjoe64/graphview/GraphView.java index ab637e87c..160829189 100644 --- a/src/main/java/com/jjoe64/graphview/GraphView.java +++ b/src/main/java/com/jjoe64/graphview/GraphView.java @@ -59,6 +59,7 @@ public boolean onTouchEvent(MotionEvent event) { private TitleRenderer mTitleRenderer; private Paint mPaintTitle; + private Paint mPreviewPaint; public GraphView(Context context) { super(context); @@ -76,6 +77,11 @@ public GraphView(Context context, AttributeSet attrs, int defStyle) { } protected void init() { + mPreviewPaint = new Paint(); + mPreviewPaint.setTextAlign(Paint.Align.CENTER); + mPreviewPaint.setColor(Color.BLACK); + mPreviewPaint.setTextSize(50); + mStyles = new Styles(); mViewport = new Viewport(this); mGridLabelRenderer = new GridLabelRenderer(this); @@ -116,19 +122,24 @@ public void onDataChanged() { @Override protected void onDraw(Canvas canvas) { - drawTitle(canvas); - mViewport.drawFirst(canvas); - mGridLabelRenderer.draw(canvas); - for (Series s : mSeries) { - s.draw(this, canvas, false); - } - if (mSecondScale != null) { - for (Series s : mSecondScale.getSeries()) { - s.draw(this, canvas, true); + if (isInEditMode()) { + canvas.drawColor(Color.rgb(200, 200, 200)); + canvas.drawText("GraphView: No Preview available", canvas.getWidth()/2, canvas.getHeight()/2, mPreviewPaint); + } else { + drawTitle(canvas); + mViewport.drawFirst(canvas); + mGridLabelRenderer.draw(canvas); + for (Series s : mSeries) { + s.draw(this, canvas, false); + } + if (mSecondScale != null) { + for (Series s : mSecondScale.getSeries()) { + s.draw(this, canvas, true); + } } + mViewport.draw(canvas); + mLegendRenderer.draw(canvas); } - mViewport.draw(canvas); - mLegendRenderer.draw(canvas); } protected void drawTitle(Canvas canvas) { diff --git a/src/main/java/com/jjoe64/graphview/GridLabelRenderer.java b/src/main/java/com/jjoe64/graphview/GridLabelRenderer.java index cefca7195..53dd5a135 100644 --- a/src/main/java/com/jjoe64/graphview/GridLabelRenderer.java +++ b/src/main/java/com/jjoe64/graphview/GridLabelRenderer.java @@ -65,16 +65,29 @@ public void resetStyles() { TypedValue typedValue = new TypedValue(); mGraphView.getContext().getTheme().resolveAttribute(android.R.attr.textAppearanceSmall, typedValue, true); - TypedArray array = mGraphView.getContext().obtainStyledAttributes(typedValue.data, new int[]{ - android.R.attr.textColorPrimary - , android.R.attr.textColorSecondary - , android.R.attr.textSize - , android.R.attr.horizontalGap}); - int color1 = array.getColor(0, Color.BLACK); - int color2 = array.getColor(1, Color.GRAY); - int size = array.getDimensionPixelSize(2, 20); - int size2 = array.getDimensionPixelSize(3, 20); - array.recycle(); + int color1; + int color2; + int size; + int size2; + + TypedArray array = null; + try { + array = mGraphView.getContext().obtainStyledAttributes(typedValue.data, new int[]{ + android.R.attr.textColorPrimary + , android.R.attr.textColorSecondary + , android.R.attr.textSize + , android.R.attr.horizontalGap}); + color1 = array.getColor(0, Color.BLACK); + color2 = array.getColor(1, Color.GRAY); + size = array.getDimensionPixelSize(2, 20); + size2 = array.getDimensionPixelSize(3, 20); + array.recycle(); + } catch (Exception e) { + color1 = Color.BLACK; + color2 = Color.GRAY; + size = 20; + size2 = 20; + } mStyles.verticalLabelsColor = color1; mStyles.verticalLabelsSecondScaleColor = color1; @@ -274,6 +287,7 @@ protected boolean adjustHorizontal() { double minX = mGraphView.getViewport().getMinX(false); double maxX = mGraphView.getViewport().getMaxX(false); + if (minX == maxX) return true; // TODO find the number of labels int numHorizontalLabels = 5; diff --git a/src/main/java/com/jjoe64/graphview/LegendRenderer.java b/src/main/java/com/jjoe64/graphview/LegendRenderer.java index 8693fc447..4f2df42be 100644 --- a/src/main/java/com/jjoe64/graphview/LegendRenderer.java +++ b/src/main/java/com/jjoe64/graphview/LegendRenderer.java @@ -61,10 +61,16 @@ public void resetStyles() { TypedValue typedValue = new TypedValue(); mGraphView.getContext().getTheme().resolveAttribute(android.R.attr.textAppearanceSmall, typedValue, true); - TypedArray array = mGraphView.getContext().obtainStyledAttributes(typedValue.data, new int[]{ - android.R.attr.textColorPrimary}); - int color1 = array.getColor(0, Color.BLACK); - array.recycle(); + int color1; + + try { + TypedArray array = mGraphView.getContext().obtainStyledAttributes(typedValue.data, new int[]{ + android.R.attr.textColorPrimary}); + color1 = array.getColor(0, Color.BLACK); + array.recycle(); + } catch (Exception e) { + color1 = Color.BLACK; + } mStyles.textColor = color1; diff --git a/src/main/java/com/jjoe64/graphview/helper/GraphViewXML.java b/src/main/java/com/jjoe64/graphview/helper/GraphViewXML.java new file mode 100644 index 000000000..f8bc83b24 --- /dev/null +++ b/src/main/java/com/jjoe64/graphview/helper/GraphViewXML.java @@ -0,0 +1,24 @@ +package com.jjoe64.graphview.helper; + +import android.content.Context; +import android.util.AttributeSet; + +import com.jjoe64.graphview.GraphView; +import com.jjoe64.graphview.series.DataPoint; +import com.jjoe64.graphview.series.DataPointInterface; +import com.jjoe64.graphview.series.LineGraphSeries; + +/** + * Created by jonas on 18.11.14. + */ +public class GraphViewXML extends GraphView { + public GraphViewXML(Context context, AttributeSet attrs) { + super(context, attrs); + + addSeries(new LineGraphSeries(new DataPointInterface[] { + new DataPoint(1, 5), + new DataPoint(2, 3), + new DataPoint(3, 8) + })); + } +} From ed763c38c08ef6521f43aa0f2ff74f9e97b32e03 Mon Sep 17 00:00:00 2001 From: jogehring Date: Wed, 19 Nov 2014 19:13:28 +0100 Subject: [PATCH 045/231] xml integration --- GraphView.iml | 2 +- .../jjoe64/graphview/helper/GraphViewXML.java | 73 +++++++++++++++++-- src/main/res/values/attr.xml | 10 +++ 3 files changed, 79 insertions(+), 6 deletions(-) create mode 100644 src/main/res/values/attr.xml diff --git a/GraphView.iml b/GraphView.iml index 3d5dc10ac..084dd5cd3 100644 --- a/GraphView.iml +++ b/GraphView.iml @@ -17,7 +17,7 @@
C2SG3v=v6ia3u0(2>|BAHD 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 literal 0 HcmV?d00001 diff --git a/doc-assets/Screenshot_20161012_180257_1.png b/doc-assets/Screenshot_20161012_180257_1.png new file mode 100644 index 0000000000000000000000000000000000000000..dca262fe7b0c7bcede567c944ac2ffa0d0aa7ce6 GIT binary patch literal 31400 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 literal 0 HcmV?d00001 diff --git a/doc-assets/Screenshot_20161012_180325_1.png b/doc-assets/Screenshot_20161012_180325_1.png new file mode 100644 index 0000000000000000000000000000000000000000..f20b1436c408ec0bdb03c0744506f06131d51524 GIT binary patch literal 38272 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 V`B{GsN+T_)T++ChdBOPc{{^+QmXZJf literal 0 HcmV?d00001 diff --git a/doc-assets/Screenshot_20161012_180355_1.png b/doc-assets/Screenshot_20161012_180355_1.png new file mode 100644 index 0000000000000000000000000000000000000000..f9797826c049afbde1e10d4310776a54d2e95cc5 GIT binary patch literal 35853 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 literal 0 HcmV?d00001 From 8a921ad8791fd02fe6be6172c1a105015accc417 Mon Sep 17 00:00:00 2001 From: Jonas Gehring Date: Fri, 12 Apr 2019 13:50:08 +0200 Subject: [PATCH 230/231] wiki link --- README.markdown | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.markdown b/README.markdown index 037e8b7df..7732c6a8b 100644 --- a/README.markdown +++ b/README.markdown @@ -51,7 +51,7 @@ implementation 'com.jjoe64:graphview:4.2.2' ``` 2) Add view to layout: -``` +```xml series = new LineGraphSeries(new DataPoint[] { new DataPoint(0, 1), @@ -78,9 +78,9 @@ graph.addSeries(series); ## More examples and documentation -Get started at project homepage +Get started at project wiki homepage To show you how to integrate the library into an existing project see the GraphView-Demos project! See GraphView-Demos for examples. https://github.com/jjoe64/GraphView-Demos
-
View GraphView page http://android-graphview.org +View GraphView wiki page https://github.com/jjoe64/GraphView/wiki From 14bcfc247ace00a722c36e35bbb7dbef0e969dbc Mon Sep 17 00:00:00 2001 From: pm-coffee Date: Fri, 17 Jan 2020 18:52:43 +0900 Subject: [PATCH 231/231] Updated Android Gradle plugin to 3.5.3 --- build.gradle | 9 +++++---- gradle/wrapper/gradle-wrapper.properties | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/build.gradle b/build.gradle index 0664898e0..ddd7534ac 100644 --- a/build.gradle +++ b/build.gradle @@ -2,14 +2,15 @@ buildscript { repositories { mavenCentral() google() + jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:3.2.0-rc03' + classpath 'com.android.tools.build:gradle:3.5.3' } } -task wrapper(type: Wrapper) { - gradleVersion = '4.4' +wrapper { + gradleVersion = '5.6' } apply plugin: 'com.android.library' @@ -17,7 +18,7 @@ apply plugin: 'com.android.library' android { compileSdkVersion 27 - buildToolsVersion '28.0.2' + buildToolsVersion '28.0.3' defaultConfig { minSdkVersion 9 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 933b6473c..25f587d12 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-5.6-all.zip