Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added method to change padding between subcolumns, added borders around columns #490

Open
wants to merge 7 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,9 @@
buildscript {
repositories {
mavenCentral()
google()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.1.0'
classpath 'com.android.tools.build:gradle:3.1.3'
}
}
4 changes: 2 additions & 2 deletions gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#Wed Apr 10 15:27:10 PDT 2013
#Fri Jun 29 12:57:06 CEST 2018
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=http\://services.gradle.org/distributions/gradle-2.2.1-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-all.zip
3 changes: 2 additions & 1 deletion hellocharts-library/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,10 @@ apply from: 'https://raw.github.com/chrisbanes/gradle-mvn-push/master/gradle-mvn
buildscript {
repositories {
mavenCentral()
google()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.1.0'
classpath 'com.android.tools.build:gradle:3.1.3'
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package lecho.lib.hellocharts.model;

import android.graphics.drawable.Drawable;

import java.util.Arrays;

import lecho.lib.hellocharts.util.ChartUtils;
Expand All @@ -16,6 +18,8 @@ public class SubcolumnValue {
private int color = ChartUtils.DEFAULT_COLOR;
private int darkenColor = ChartUtils.DEFAULT_DARKEN_COLOR;
private char[] label;
private Drawable picture;
private float subcolumnWidhtRatio = 1; // 1 means that the subcolumn widht equals the other, 0.5 means that the widht is the half of the others

public SubcolumnValue() {
setValue(0);
Expand All @@ -32,9 +36,26 @@ public SubcolumnValue(float value, int color) {
setColor(color);
}

public SubcolumnValue(float value, int color, Drawable picture) {
// point and targetPoint have to be different objects
setValue(value);
setColor(color);
setPicture(picture);
}

public SubcolumnValue(float value, int color, Drawable picture, float subcolumnWidhtRatio) {
// point and targetPoint have to be different objects
setValue(value);
setColor(color);
setPicture(picture);
setSubcolumnWidhtRatio(subcolumnWidhtRatio);
}

public SubcolumnValue(SubcolumnValue columnValue) {
setValue(columnValue.value);
setColor(columnValue.color);
setPicture(columnValue.picture);
setSubcolumnWidhtRatio(subcolumnWidhtRatio);
this.label = columnValue.label;
}

Expand Down Expand Up @@ -133,6 +154,23 @@ public int hashCode() {
result = 31 * result + color;
result = 31 * result + darkenColor;
result = 31 * result + (label != null ? Arrays.hashCode(label) : 0);
result = 31 * result + (picture != null ? picture.hashCode() : 0);
return result;
}

public Drawable getPicture() {
return picture;
}

public void setPicture(Drawable picture) {
this.picture = picture;
}

public float getSubcolumnWidhtRatio() {
return subcolumnWidhtRatio;
}

public void setSubcolumnWidhtRatio(float subcolumnWidhtRatio) {
this.subcolumnWidhtRatio = subcolumnWidhtRatio;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ public abstract class AbstractChartRenderer implements ChartRenderer {
protected int labelMargin;
protected boolean isValueLabelBackgroundEnabled;
protected boolean isValueLabelBackgroundAuto;
protected boolean touchable = true;

public AbstractChartRenderer(Context context, Chart chart) {
this.density = context.getResources().getDisplayMetrics().density;
Expand Down Expand Up @@ -126,7 +127,7 @@ protected void drawLabelTextAndBackground(Canvas canvas, char[] labelBuffer, int

@Override
public boolean isTouched() {
return selectedValue.isSet();
return selectedValue.isSet() && touchable;
}

@Override
Expand Down Expand Up @@ -177,4 +178,12 @@ public void selectValue(SelectedValue selectedValue) {
public SelectedValue getSelectedValue() {
return selectedValue;
}

public boolean isTouchable() {
return touchable;
}

public void setTouchable(boolean touchable) {
this.touchable = touchable;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,13 @@

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Cap;
import android.graphics.PointF;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.drawable.Drawable;

import lecho.lib.hellocharts.model.Column;
import lecho.lib.hellocharts.model.ColumnChartData;
Expand All @@ -22,15 +25,18 @@
public class ColumnChartRenderer extends AbstractChartRenderer {
public static final int DEFAULT_SUBCOLUMN_SPACING_DP = 1;
public static final int DEFAULT_COLUMN_TOUCH_ADDITIONAL_WIDTH_DP = 4;
public static final int MAX_SUBCOLUMN_SPACING_DP = 20;
public static final int BORDER_SIZE = 3;

private static final int MODE_DRAW = 0;
private static final int MODE_CHECK_TOUCH = 1;
private static final int MODE_HIGHLIGHT = 2;
private static final float PICTURE_RATIO = 0.7f; //Picture will occupy 70% of the column

private ColumnChartDataProvider dataProvider;

/**
* Additional width for hightlighted column, used to give tauch feedback.
* Additional width for highlighted column, used to give touch feedback.
*/
private int touchAdditionalWidth;

Expand Down Expand Up @@ -58,6 +64,10 @@ public class ColumnChartRenderer extends AbstractChartRenderer {

private float baseValue;

private boolean hasBorders = false;

private int bordersColor = Color.parseColor("#FFFFFF");

private Viewport tempMaximumViewport = new Viewport();

public ColumnChartRenderer(Context context, Chart chart, ColumnChartDataProvider dataProvider) {
Expand Down Expand Up @@ -220,15 +230,24 @@ private void processColumnForSubcolumns(Canvas canvas, Column column, float colu
float subcolumnRawX = rawX - halfColumnWidth;
int valueIndex = 0;
for (SubcolumnValue columnValue : column.getValues()) {
subcolumnWidth *= columnValue.getSubcolumnWidhtRatio();
columnPaint.setColor(columnValue.getColor());
if (subcolumnRawX > rawX + halfColumnWidth) {
break;
}
final float rawY = computator.computeRawY(columnValue.getValue());
calculateRectToDraw(columnValue, subcolumnRawX, subcolumnRawX + subcolumnWidth, baseRawY, rawY);
calculateRectToDraw(columnValue, subcolumnRawX, subcolumnRawX + subcolumnWidth, baseRawY, rawY, 0);
switch (mode) {
case MODE_DRAW:
drawSubcolumn(canvas, column, columnValue, false);
if(hasBorders) {
calculateRectToDraw(columnValue, subcolumnRawX, subcolumnRawX + subcolumnWidth, baseRawY, rawY, BORDER_SIZE);
columnPaint.setColor(bordersColor);
drawSubcolumn(canvas, column, columnValue, false);
columnPaint.setColor(columnValue.getColor());
calculateRectToDraw(columnValue, subcolumnRawX, subcolumnRawX + subcolumnWidth, baseRawY, rawY, 0);
drawSubcolumn(canvas, column, columnValue, false);
} else
drawSubcolumn(canvas, column, columnValue, false);
break;
case MODE_HIGHLIGHT:
highlightSubcolumn(canvas, column, columnValue, valueIndex, false);
Expand All @@ -243,6 +262,7 @@ private void processColumnForSubcolumns(Canvas canvas, Column column, float colu
}
subcolumnRawX += subcolumnWidth + subcolumnSpacing;
++valueIndex;
subcolumnWidth /= columnValue.getSubcolumnWidhtRatio();
}
}

Expand Down Expand Up @@ -298,10 +318,18 @@ private void processColumnForStacked(Canvas canvas, Column column, float columnW
}
final float rawBaseY = computator.computeRawY(subcolumnBaseValue);
final float rawY = computator.computeRawY(subcolumnBaseValue + columnValue.getValue());
calculateRectToDraw(columnValue, rawX - halfColumnWidth, rawX + halfColumnWidth, rawBaseY, rawY);
calculateRectToDraw(columnValue, rawX - halfColumnWidth, rawX + halfColumnWidth, rawBaseY, rawY, 0);
switch (mode) {
case MODE_DRAW:
drawSubcolumn(canvas, column, columnValue, true);
if(hasBorders) {
calculateRectToDraw(columnValue, rawX - halfColumnWidth, rawX + halfColumnWidth, rawBaseY, rawY, BORDER_SIZE);
columnPaint.setColor(bordersColor);
drawSubcolumn(canvas, column, columnValue, true);
columnPaint.setColor(columnValue.getColor());
calculateRectToDraw(columnValue, rawX - halfColumnWidth, rawX + halfColumnWidth, rawBaseY, rawY, 0);
drawSubcolumn(canvas, column, columnValue, true);
} else
drawSubcolumn(canvas, column, columnValue, true);
break;
case MODE_HIGHLIGHT:
highlightSubcolumn(canvas, column, columnValue, valueIndex, true);
Expand All @@ -320,11 +348,30 @@ private void processColumnForStacked(Canvas canvas, Column column, float columnW

private void drawSubcolumn(Canvas canvas, Column column, SubcolumnValue columnValue, boolean isStacked) {
canvas.drawRect(drawRect, columnPaint);
Drawable picture = columnValue.getPicture();
if(picture != null) {
picture.setBounds(findDrawableBounds(column));
picture.draw(canvas);
}
if (column.hasLabels()) {
drawLabel(canvas, column, columnValue, isStacked, labelOffset);
}
}

private Rect findDrawableBounds(Column column){
Rect r = new Rect();
Rect drawRectI = new Rect();
drawRect.round(drawRectI);
if(subcolumnSpacing < 0 && column.getValues().size() > 1) drawRectI.right += subcolumnSpacing;
int imageSize = (int) (drawRectI.width() * PICTURE_RATIO);
int spacing = (drawRectI.width() - imageSize)/2;
r.left = spacing + drawRectI.left;
r.top = drawRectI.bottom - spacing - imageSize;
r.bottom = drawRectI.bottom - spacing;
r.right = r.left + imageSize;
return r;
}

private void highlightSubcolumn(Canvas canvas, Column column, SubcolumnValue columnValue, int valueIndex,
boolean isStacked) {
if (selectedValue.getSecondIndex() == valueIndex) {
Expand Down Expand Up @@ -353,16 +400,16 @@ private float calculateColumnWidth() {
return columnWidth;
}

private void calculateRectToDraw(SubcolumnValue columnValue, float left, float right, float rawBaseY, float rawY) {
private void calculateRectToDraw(SubcolumnValue columnValue, float left, float right, float rawBaseY, float rawY, float border) {
// Calculate rect that will be drawn as column, subcolumn or label background.
drawRect.left = left;
drawRect.right = right;
drawRect.left = left - border;
drawRect.right = right + border;
if (columnValue.getValue() >= baseValue) {
drawRect.top = rawY;
drawRect.bottom = rawBaseY - subcolumnSpacing;
drawRect.top = rawY - border;
drawRect.bottom = rawBaseY - subcolumnSpacing + border;
} else {
drawRect.bottom = rawY;
drawRect.top = rawBaseY + subcolumnSpacing;
drawRect.bottom = rawY + border;
drawRect.top = rawBaseY + subcolumnSpacing - border;
}
}

Expand Down Expand Up @@ -419,4 +466,28 @@ private void drawLabel(Canvas canvas, Column column, SubcolumnValue columnValue,

}

public int getSubcolumnSpacing() {
return subcolumnSpacing;
}

public void setSubcolumnSpacing(int subcolumnSpacing) {
if(subcolumnSpacing > MAX_SUBCOLUMN_SPACING_DP) subcolumnSpacing = MAX_SUBCOLUMN_SPACING_DP;
this.subcolumnSpacing = subcolumnSpacing;
}

public boolean hasBorders() {
return hasBorders;
}

public void setBorders(boolean hasBorders) {
this.hasBorders = hasBorders;
}

public int getBordersColor() {
return bordersColor;
}

public void setBordersColor(int bordersColor) {
this.bordersColor = bordersColor;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -85,4 +85,21 @@ public void setOnValueTouchListener(ColumnChartOnValueSelectListener touchListen
this.onValueTouchListener = touchListener;
}
}

public void setSubcolumnSpacing(int subcolumnSpacing) {
((ColumnChartRenderer) chartRenderer).setSubcolumnSpacing(subcolumnSpacing);
}

public void setBorders(boolean hasBorders){
((ColumnChartRenderer) chartRenderer).setBorders(hasBorders);
}

public void setBordersColor(int id){
((ColumnChartRenderer) chartRenderer).setBordersColor(id);
}

public void setTouchable(boolean touchable){
((ColumnChartRenderer) chartRenderer).setTouchable(touchable);
}

}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package lecho.lib.hellocharts.samples;

import android.graphics.Color;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v7.app.ActionBarActivity;
Expand Down Expand Up @@ -64,7 +65,9 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle sa

chart = (ColumnChartView) rootView.findViewById(R.id.chart);
chart.setOnValueTouchListener(new ValueTouchListener());

chart.setBorders(true);
chart.setBordersColor(Color.parseColor("#009fff"));
chart.setSubcolumnSpacing(-10);
generateData();

return rootView;
Expand Down