>
IPoint getPoint();
- void setPoint(IPoint point);
+ void setPoint(ILegendPoint point);
void setSelectColumn(boolean selectColumn);
+
+ void setDisplay(boolean isDisplay);
}
\ No newline at end of file
diff --git a/chart/src/main/java/com/daivd/chart/core/base/BaseBarLineChart.java b/chart/src/main/java/com/daivd/chart/core/base/BaseBarLineChart.java
index ada01f9..44a884a 100644
--- a/chart/src/main/java/com/daivd/chart/core/base/BaseBarLineChart.java
+++ b/chart/src/main/java/com/daivd/chart/core/base/BaseBarLineChart.java
@@ -78,6 +78,9 @@ private void computeScaleRect(){
}
+ public void setHeightPercent(){
+
+ }
diff --git a/chart/src/main/java/com/daivd/chart/core/base/BaseChart.java b/chart/src/main/java/com/daivd/chart/core/base/BaseChart.java
index cc72342..a4a5804 100644
--- a/chart/src/main/java/com/daivd/chart/core/base/BaseChart.java
+++ b/chart/src/main/java/com/daivd/chart/core/base/BaseChart.java
@@ -23,6 +23,7 @@
import com.daivd.chart.component.ChartTitle;
import com.daivd.chart.component.EmptyView;
import com.daivd.chart.component.base.IEmpty;
+import com.daivd.chart.listener.OnChartChangeListener;
import com.daivd.chart.listener.OnClickColumnListener;
import com.daivd.chart.listener.OnClickLegendListener;
import com.daivd.chart.listener.ChartGestureObserver;
@@ -35,7 +36,7 @@
*/
public abstract class BaseChart,C extends ColumnData> extends View
- implements ChartGestureObserver,OnClickLegendListener {
+ implements ChartGestureObserver,OnClickLegendListener,OnChartChangeListener {
protected int width; //高
protected int height; //宽
@@ -83,6 +84,7 @@ protected void init() {
legend.setOnClickLegendListener(this);
matrixHelper = new MatrixHelper(getContext());
matrixHelper.register(this);
+ matrixHelper.setOnTableChangeListener(this);
emptyView = new EmptyView();
provider = initProvider();
}
@@ -294,11 +296,8 @@ public void setZoom(boolean zoom) {
matrixHelper.setCanZoom(zoom);
}
- /**
- * 图表放大位移之后通知更新
- */
@Override
- public void onViewChanged(float scale, float translateX, float translateY) {
+ public void onTableChanged(float translateX, float translateY) {
invalidate();
}
diff --git a/chart/src/main/java/com/daivd/chart/data/ChartContentData.java b/chart/src/main/java/com/daivd/chart/data/ChartContentData.java
new file mode 100644
index 0000000..3d83cb6
--- /dev/null
+++ b/chart/src/main/java/com/daivd/chart/data/ChartContentData.java
@@ -0,0 +1,21 @@
+package com.daivd.chart.data;
+
+import android.graphics.Canvas;
+import android.graphics.Paint;
+import android.graphics.Rect;
+
+/**
+ * Created by huang on 2017/12/13.
+ */
+
+public class ChartContentData {
+
+ public Canvas canvas;
+ public Paint paint;
+ public Rect rect;
+ public Rect zoomRect;
+ public int YDataPosition;
+ public int columnPosition;
+ public float progress;
+
+}
diff --git a/chart/src/main/java/com/daivd/chart/data/ChartData.java b/chart/src/main/java/com/daivd/chart/data/ChartData.java
index 286bfd3..3854cb1 100644
--- a/chart/src/main/java/com/daivd/chart/data/ChartData.java
+++ b/chart/src/main/java/com/daivd/chart/data/ChartData.java
@@ -1,5 +1,6 @@
package com.daivd.chart.data;
+import java.util.Arrays;
import java.util.List;
/**
@@ -14,12 +15,17 @@ public class ChartData {
private ScaleData scaleData = new ScaleData();
private List columnDataList;
+ public ChartData(String chartName,List charXDataList, T... columnDataList){
+ this.chartName = chartName;
+ this.charXDataList = charXDataList;
+ this.columnDataList = Arrays.asList(columnDataList);
+ }
+
public ChartData(String chartName,List charXDataList, List columnDataList){
this.chartName = chartName;
this.charXDataList = charXDataList;
this.columnDataList = columnDataList;
}
-
public String getChartName() {
return chartName;
}
diff --git a/chart/src/main/java/com/daivd/chart/data/style/FontStyle.java b/chart/src/main/java/com/daivd/chart/data/style/FontStyle.java
index 29049d3..8a07f3b 100644
--- a/chart/src/main/java/com/daivd/chart/data/style/FontStyle.java
+++ b/chart/src/main/java/com/daivd/chart/data/style/FontStyle.java
@@ -16,7 +16,6 @@ public class FontStyle implements IStyle{
public static int defaultFontColor = Color.parseColor("#333333");
private int textSize;
private int textColor;
- private int rotate;
private int padding = 10;
public static void setDefaultTextSize(int defaultTextSize){
@@ -53,12 +52,14 @@ public int getTextSize() {
return textSize;
}
- public void setTextSize(int textSize) {
+ public FontStyle setTextSize(int textSize) {
this.textSize = textSize;
+ return this;
}
- public void setTextSpSize(Context context,int sp){
+ public FontStyle setTextSpSize(Context context,int sp){
this.setTextSize(DensityUtils.sp2px(context,sp));
+ return this;
}
public int getTextColor() {
@@ -68,17 +69,10 @@ public int getTextColor() {
return textColor;
}
- public void setTextColor(int textColor) {
+ public FontStyle setTextColor(int textColor) {
this.textColor = textColor;
- }
-
- public int getRotate() {
- return rotate;
- }
-
- public void setRotate(int rotate) {
- this.rotate = rotate;
+ return this;
}
public int getPadding() {
diff --git a/chart/src/main/java/com/daivd/chart/listener/ChartGestureObserver.java b/chart/src/main/java/com/daivd/chart/listener/ChartGestureObserver.java
index 18195ea..8643cb3 100644
--- a/chart/src/main/java/com/daivd/chart/listener/ChartGestureObserver.java
+++ b/chart/src/main/java/com/daivd/chart/listener/ChartGestureObserver.java
@@ -8,5 +8,4 @@ public interface ChartGestureObserver {
void onClick(float x,float y);
- void onViewChanged(float scale,float translateX,float translateY);
}
diff --git a/chart/src/main/java/com/daivd/chart/listener/OnChartChangeListener.java b/chart/src/main/java/com/daivd/chart/listener/OnChartChangeListener.java
new file mode 100644
index 0000000..8a9d8e0
--- /dev/null
+++ b/chart/src/main/java/com/daivd/chart/listener/OnChartChangeListener.java
@@ -0,0 +1,10 @@
+package com.daivd.chart.listener;
+
+/**
+ * Created by huang on 2017/11/4.
+ */
+
+public interface OnChartChangeListener {
+
+ void onTableChanged(float translateX, float translateY);
+}
diff --git a/chart/src/main/java/com/daivd/chart/matrix/MatrixHelper.java b/chart/src/main/java/com/daivd/chart/matrix/MatrixHelper.java
index 6768033..570b305 100644
--- a/chart/src/main/java/com/daivd/chart/matrix/MatrixHelper.java
+++ b/chart/src/main/java/com/daivd/chart/matrix/MatrixHelper.java
@@ -1,16 +1,23 @@
package com.daivd.chart.matrix;
+import android.animation.TimeInterpolator;
+import android.animation.ValueAnimator;
import android.content.Context;
+import android.graphics.Point;
import android.graphics.Rect;
import android.util.Log;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.ScaleGestureDetector;
+import android.view.ViewConfiguration;
import android.view.ViewParent;
+import android.view.animation.DecelerateInterpolator;
+import android.widget.Scroller;
import com.daivd.chart.core.base.BaseChart;
import com.daivd.chart.listener.Observable;
import com.daivd.chart.listener.ChartGestureObserver;
+import com.daivd.chart.listener.OnChartChangeListener;
import java.util.List;
@@ -35,11 +42,19 @@ public class MatrixHelper extends Observable implements IT
private float mDownX, mDownY;
private int pointMode; //屏幕的手指点个数
private float widthMultiple =1;
+ private Scroller scroller;
+ private int mMinimumVelocity;
+ private boolean isFling;
+ private float flingRate = 0.8f; //速率
+ private OnChartChangeListener listener;
public MatrixHelper(Context context) {
mScaleGestureDetector = new ScaleGestureDetector(context, this);
mGestureDetector = new GestureDetector(context, new OnChartGestureListener());
+ final ViewConfiguration configuration = ViewConfiguration.get(context);
+ mMinimumVelocity = configuration.getScaledMinimumFlingVelocity();
+ scroller = new Scroller(context);
}
/**
@@ -98,9 +113,9 @@ public void onDisallowInterceptEvent(BaseChart chart, MotionEvent event) {
isDisallowIntercept = false;
}
} else {
- if ((disY > 0 && toRectTop()) || (disY < 0 && toRectBottom())) {
+ /* if ((disY > 0 && toRectTop()) || (disY < 0 && toRectBottom())) {*/
isDisallowIntercept = false;
- }
+ /* }*/
}
parent.requestDisallowInterceptTouchEvent(isDisallowIntercept);
break;
@@ -132,16 +147,14 @@ private boolean toRectTop() {
return translateY <= -(zoomRect.height() - originalRect.height()) / 2;
}
-
@Override
public void notifyObservers(List observers) {
- for (ChartGestureObserver observer : observers) {
- observer.onViewChanged(zoom, translateX, translateY);
- }
+
}
private float tempScale = MIN_ZOOM; //缩放比例 不得小于1
-
+ private int tempTranslateX; //以左上角为准,X轴位移的距离
+ private int tempTranslateY;//以左上角为准,y轴位移的距离
class OnChartGestureListener extends GestureDetector.SimpleOnGestureListener {
@Override
@@ -153,7 +166,7 @@ public void onLongPress(MotionEvent e) {
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
translateX += distanceX;
translateY += distanceY;
- notifyObservers(observables);
+ notifyViewChanged();
return true;
}
@@ -162,6 +175,21 @@ public boolean onDown(MotionEvent e) {
return true;
}
+ @Override
+ public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
+ if(Math.abs(velocityX) >mMinimumVelocity || Math.abs(velocityY) >mMinimumVelocity) {
+ scroller.setFinalX(0);
+ scroller.setFinalY(0);
+ tempTranslateX = translateX;
+ tempTranslateY = translateY;
+ scroller.fling(0,0,(int)velocityX,(int)velocityY,-50000,50000
+ ,-50000,50000);
+ isFling = true;
+ startFilingAnim(false);
+ }
+
+ return true;
+ }
//双击
@Override
@@ -192,12 +220,62 @@ public boolean onDoubleTap(MotionEvent e) {
//单击
@Override
public boolean onSingleTapUp(MotionEvent e) {
+ notifyViewChanged();
for (ChartGestureObserver observer : observables) {
observer.onClick(e.getX(), e.getY());
}
return true;
}
}
+ private Point startPoint = new Point(0, 0);
+ private Point endPoint = new Point();
+ private TimeInterpolator interpolator = new DecelerateInterpolator();
+ private PointEvaluator evaluator= new PointEvaluator();
+
+ /**
+ * 开始飞滚
+ * @param doubleWay 双向飞滚
+ */
+ private void startFilingAnim(boolean doubleWay) {
+
+ int scrollX =Math.abs(scroller.getFinalX());
+ int scrollY =Math.abs(scroller.getFinalY());
+ if(doubleWay){
+ endPoint.set((int) (scroller.getFinalX() * flingRate),
+ (int) (scroller.getFinalY() * flingRate));
+ }else {
+ if (scrollX > scrollY) {
+ endPoint.set((int) (scroller.getFinalX() * flingRate), 0);
+ } else {
+ endPoint.set(0, (int) (scroller.getFinalY() * flingRate));
+ }
+ }
+ final ValueAnimator valueAnimator = ValueAnimator.ofObject(evaluator,startPoint,endPoint);
+ valueAnimator.setInterpolator(interpolator);
+ valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
+ @Override
+ public void onAnimationUpdate(ValueAnimator animation) {
+ if(isFling) {
+ Point point = (Point) animation.getAnimatedValue();
+ translateX = tempTranslateX - point.x;
+ translateY = tempTranslateY - point.y;
+ notifyViewChanged();
+ }else{
+ animation.cancel();
+ }
+ }
+ });
+ int duration = (int)(Math.max(scrollX,scrollY)*flingRate)/2;
+ valueAnimator.setDuration(duration>300 ?300:duration);
+ valueAnimator.start();
+ }
+
+ public void notifyViewChanged(){
+ if(listener != null) {
+ listener.onTableChanged(translateX, translateY);
+ }
+ }
+
@Override
public boolean onScaleBegin(ScaleGestureDetector detector) {
@@ -283,7 +361,7 @@ public float getWidthMultiple() {
return widthMultiple;
}
- public void setWidthMultiple(int widthMultiple) {
+ public void setWidthMultiple(float widthMultiple) {
this.widthMultiple = widthMultiple;
}
@@ -301,5 +379,12 @@ public float getZoom() {
return zoom;
}
+ public OnChartChangeListener getOnTableChangeListener() {
+ return listener;
+ }
+
+ public void setOnTableChangeListener(OnChartChangeListener onTableChangeListener) {
+ this.listener = onTableChangeListener;
+ }
}
diff --git a/chart/src/main/java/com/daivd/chart/matrix/PointEvaluator.java b/chart/src/main/java/com/daivd/chart/matrix/PointEvaluator.java
new file mode 100644
index 0000000..323e96b
--- /dev/null
+++ b/chart/src/main/java/com/daivd/chart/matrix/PointEvaluator.java
@@ -0,0 +1,23 @@
+package com.daivd.chart.matrix;
+
+import android.animation.TypeEvaluator;
+import android.graphics.Point;
+
+/**
+ * Created by huang on 2017/11/3.
+ */
+public class PointEvaluator implements TypeEvaluator {
+
+ private Point point = new Point();
+
+ @Override
+ public Object evaluate(float fraction, Object startValue, Object endValue) {
+ Point startPoint = (Point) startValue;
+ Point endPoint = (Point) endValue;
+ int x = (int) (startPoint.x + fraction * (endPoint.x - startPoint.x));
+ int y = (int) (startPoint.y + fraction * (endPoint.y - startPoint.y));
+ point.set(x,y);
+ return point;
+ }
+
+}
diff --git a/chart/src/main/java/com/daivd/chart/provider/BaseProvider.java b/chart/src/main/java/com/daivd/chart/provider/BaseProvider.java
index f51812a..e907d0e 100644
--- a/chart/src/main/java/com/daivd/chart/provider/BaseProvider.java
+++ b/chart/src/main/java/com/daivd/chart/provider/BaseProvider.java
@@ -16,6 +16,7 @@
import com.daivd.chart.listener.OnClickColumnListener;
import com.daivd.chart.provider.component.mark.IMark;
import com.daivd.chart.matrix.MatrixHelper;
+import com.daivd.chart.provider.component.text.IText;
/**
* Created by huang on 2017/9/26.
@@ -28,10 +29,9 @@ public abstract class BaseProvider implements IProvider
protected IMark markView;
private boolean isOpenMark;
private boolean isShowText =true;
- private int pointTextHeight;
protected ChartData chartData;
private Rect providerRect;
- private FontStyle textStyle = new FontStyle();
+ private IText text;
protected OnClickColumnListener onClickColumnListener;
@@ -98,19 +98,13 @@ public void onAnimationEnd(Animator animation) {
animator.start();
}
- public void drawPointText(Canvas canvas,double value,float x,float y,Paint paint){
- if(isShowText) {
- int oldColor = paint.getColor();
- textStyle.fillPaint(paint);
- paint.setColor(oldColor);
- String val = String.valueOf(value);
- if(pointTextHeight == 0){
- pointTextHeight = (int) paint.measureText(val,0,1);
- }
- if (containsRect(x,y) && containsRect(x,y-pointTextHeight)) {
- canvas.drawText(val, x-pointTextHeight*val.length()/2, y-pointTextHeight, paint);
- }
- }
+ public void drawPointText(Canvas canvas,double value,float x,float y,int position,int line,Paint paint){
+ if(text != null) {
+ String val = String.valueOf(value);
+ if (containsRect(x,y)) {
+ text.drawText(canvas,val,x,y,position,line,paint);
+ }
+ }
}
public boolean containsRect( float x,float y){
@@ -145,6 +139,11 @@ public Rect getProviderRect() {
}
+
+ public float getProgress() {
+ return progress;
+ }
+
public boolean isShowText() {
return isShowText;
}
@@ -156,7 +155,13 @@ public void setShowText(boolean showText) {
public void setOnClickColumnListener(OnClickColumnListener onClickColumnListener) {
this.onClickColumnListener = onClickColumnListener;
}
+ public IText getText() {
+ return text;
+ }
+ public void setText(IText text) {
+ this.text = text;
+ }
}
diff --git a/chart/src/main/java/com/daivd/chart/provider/barLine/Bar3DProvider.java b/chart/src/main/java/com/daivd/chart/provider/barLine/Bar3DProvider.java
index 1756f36..d21882b 100644
--- a/chart/src/main/java/com/daivd/chart/provider/barLine/Bar3DProvider.java
+++ b/chart/src/main/java/com/daivd/chart/provider/barLine/Bar3DProvider.java
@@ -15,7 +15,7 @@
public class Bar3DProvider extends BarProvider {
@Override
- protected void drawBar(Canvas canvas,Rect rect,double value,Paint paint){
+ protected void drawBar(Canvas canvas,Rect rect,double value,int position,int line,Paint paint){
canvas.drawRect(rect, paint);
float w = rect.right - rect.left;
float offsetY= w/2;
@@ -34,7 +34,7 @@ protected void drawBar(Canvas canvas,Rect rect,double value,Paint paint){
path.lineTo(rect.right+offsetX,rect.top-offsetY);
path.close();
canvas.drawPath(path,paint);
- drawPointText(canvas,value,(rect.right + rect.left) / 2, rect.top-offsetY, paint );
+ drawPointText(canvas,value,(rect.right + rect.left) / 2, rect.top-offsetY,position,line, paint );
}
diff --git a/chart/src/main/java/com/daivd/chart/provider/barLine/BarLineProvider.java b/chart/src/main/java/com/daivd/chart/provider/barLine/BarLineProvider.java
index 805f3a4..c447913 100644
--- a/chart/src/main/java/com/daivd/chart/provider/barLine/BarLineProvider.java
+++ b/chart/src/main/java/com/daivd/chart/provider/barLine/BarLineProvider.java
@@ -56,10 +56,10 @@ public void drawProvider(Canvas canvas, Rect zoomRect, Rect rect, Paint paint) {
int bottom = zoomRect.bottom;
paint.setColor(columnData.getColor());
Rect barRect = new Rect(left, top, right, bottom);
- drawBar(canvas, barRect, value, paint);
+ drawBar(canvas, barRect, value,i,j, paint);
}else{
float x = (float)(zoomRect.left+perWidth*(j+0.5));
- drawLine(canvas,j== 0,j == rowSize-1,columnData,x,top,value,paint);
+ drawLine(canvas,j== 0,j == rowSize-1,columnData,x,top,value,i,j,paint);
}
}
}
@@ -67,7 +67,7 @@ public void drawProvider(Canvas canvas, Rect zoomRect, Rect rect, Paint paint) {
}
- protected void drawLine(Canvas canvas, boolean isNewBar,boolean isLast, BarLineData columnData, float x,float y, double value, Paint paint) {
+ protected void drawLine(Canvas canvas, boolean isNewBar,boolean isLast, BarLineData columnData, float x,float y, double value,int position,int line, Paint paint) {
if(columnData.getModel() ==BarLineData.CURVE
|| columnData.getModel() ==BarLineData.BROKEN){
@@ -77,7 +77,7 @@ protected void drawLine(Canvas canvas, boolean isNewBar,boolean isLast, BarLineD
}
pointX.add(x);
pointY.add(y);
- drawPointText(canvas,value,x, y,paint);
+ drawPointText(canvas,value,x, y,position,line,paint);
if(isLast){
Path path;
if(columnData.getModel() ==BarLineData.CURVE){
diff --git a/chart/src/main/java/com/daivd/chart/provider/barLine/BarProvider.java b/chart/src/main/java/com/daivd/chart/provider/barLine/BarProvider.java
index 8497f2d..8ea4e94 100644
--- a/chart/src/main/java/com/daivd/chart/provider/barLine/BarProvider.java
+++ b/chart/src/main/java/com/daivd/chart/provider/barLine/BarProvider.java
@@ -25,6 +25,7 @@ public class BarProvider extends BaseBarLineProvider {
@Override
public void drawProvider(Canvas canvas, Rect zoomRect, Rect rect, Paint paint) {
paint.setStyle(Paint.Style.FILL);
+ paint.setTextAlign(Paint.Align.LEFT);
List columnDataList = chartData.getColumnDataList();
int columnSize = columnDataList.size();
int rowSize = chartData.getCharXDataList().size();
@@ -59,7 +60,7 @@ public void drawProvider(Canvas canvas, Rect zoomRect, Rect rect, Paint paint) {
}
}
Rect barRect = new Rect(left, top, right, bottom);
- drawBar(canvas, barRect, value, paint);
+ drawBar(canvas, barRect, value,i,j, paint);
drawTip(canvas,left+barRect.width()/2,top,columnData,j);
}
}
@@ -79,9 +80,9 @@ protected void matrixRectEnd(Canvas canvas, Rect rect) {
}
- protected void drawBar(Canvas canvas, Rect rect, double value, Paint paint) {
+ protected void drawBar(Canvas canvas, Rect rect,double value, int position,int line,Paint paint) {
canvas.drawRect(rect, paint);
- drawPointText(canvas, value, (rect.right + rect.left) / 2, rect.top, paint);
+ drawPointText(canvas, value, (rect.right + rect.left) / 2, rect.top, position,line,paint);
}
diff --git a/chart/src/main/java/com/daivd/chart/provider/barLine/BaseBarLineProvider.java b/chart/src/main/java/com/daivd/chart/provider/barLine/BaseBarLineProvider.java
index ebd8a10..74cf16d 100644
--- a/chart/src/main/java/com/daivd/chart/provider/barLine/BaseBarLineProvider.java
+++ b/chart/src/main/java/com/daivd/chart/provider/barLine/BaseBarLineProvider.java
@@ -7,12 +7,14 @@
import com.daivd.chart.component.base.IAxis;
import com.daivd.chart.data.ChartData;
import com.daivd.chart.provider.component.cross.ICross;
+import com.daivd.chart.provider.component.grid.IGrid;
import com.daivd.chart.provider.component.level.ILevel;
import com.daivd.chart.provider.component.level.LevelLine;
import com.daivd.chart.data.BarData;
import com.daivd.chart.data.ScaleData;
import com.daivd.chart.exception.ChartException;
import com.daivd.chart.provider.BaseProvider;
+import com.daivd.chart.provider.component.path.IPath;
import com.daivd.chart.provider.component.tip.ITip;
import java.util.ArrayList;
@@ -28,6 +30,9 @@ public abstract class BaseBarLineProvider extends BaseProvide
private boolean isOpenCross;
protected ITip tip;
private List levelLine = new ArrayList<>();
+ private float chartPercent = 1;
+ private boolean isFromBottom;
+
@Override
@@ -104,8 +109,9 @@ protected float getStartY(Rect zoomRect, double value, int direction){
ScaleData scaleData = chartData.getScaleData();
double minValue = scaleData.getMinScaleValue(direction);
double totalScaleLength = scaleData.getTotalScaleLength(direction);
- float length = (float) ((value - minValue) * zoomRect.height() / totalScaleLength);
- return zoomRect.bottom - getAnimValue(length);
+ float length = (float) ((value - minValue) * zoomRect.height()*chartPercent / totalScaleLength);
+ return zoomRect.bottom-(isFromBottom?0:(1-chartPercent)/2*zoomRect.height()) - length;
+
}
/**
@@ -147,7 +153,7 @@ void drawMark(Canvas canvas,float x, float y,Rect rect, int position, int column
- public void addLevelLine(LevelLine levelLine) {
+ public void addLevelLine(ILevel levelLine) {
this.levelLine.add(levelLine);
}
@@ -180,4 +186,18 @@ public ITip getTip() {
public void setTip(ITip tip) {
this.tip = tip;
}
+
+ public float getChartPercent() {
+ return chartPercent;
+ }
+ public boolean isFromBottom() {
+ return isFromBottom;
+ }
+
+ public void setFromBottom(boolean fromBottom) {
+ isFromBottom = fromBottom;
+ }
+ public void setChartPercent(float chartPercent) {
+ this.chartPercent = chartPercent;
+ }
}
diff --git a/chart/src/main/java/com/daivd/chart/provider/barLine/LineProvider.java b/chart/src/main/java/com/daivd/chart/provider/barLine/LineProvider.java
index 2ad52aa..497b4db 100644
--- a/chart/src/main/java/com/daivd/chart/provider/barLine/LineProvider.java
+++ b/chart/src/main/java/com/daivd/chart/provider/barLine/LineProvider.java
@@ -8,8 +8,11 @@
import com.daivd.chart.data.LineData;
import com.daivd.chart.data.style.LineStyle;
+import com.daivd.chart.provider.component.grid.IGrid;
import com.daivd.chart.provider.component.line.BrokenLineModel;
import com.daivd.chart.provider.component.line.ILineModel;
+import com.daivd.chart.provider.component.path.IPath;
+import com.daivd.chart.provider.component.path.LinePath;
import com.daivd.chart.provider.component.point.IPoint;
import com.daivd.chart.utils.ColorUtils;
@@ -31,6 +34,11 @@ public class LineProvider extends BaseBarLineProvider {
private boolean isDrawLine = true;
private int filterPointTextCount = 30; //最多显示30个点文字
private ILineModel lineModel = new BrokenLineModel();
+ private IPath path;
+ private int perWidth;
+ private IGrid grid;
+ private boolean isStartZero =true;
+ private int areaAlpha = 125;
@Override
public void drawProvider(Canvas canvas, Rect zoomRect, Rect rect, Paint paint) {
@@ -40,6 +48,9 @@ public void drawProvider(Canvas canvas, Rect zoomRect, Rect rect, Paint paint) {
rowSize = chartData.getCharXDataList().size();
int filter = rowSize/filterPointTextCount;
filter = filter <1 ?1 : filter;
+ if(grid !=null) {
+ grid.drawClickBg(canvas, pointF, zoomRect, perWidth, paint);
+ }
for (int i = 0; i < columnSize; i++) {
LineData lineData = columnDataList.get(i);
paint.setColor(lineData.getColor());
@@ -54,15 +65,19 @@ public void drawProvider(Canvas canvas, Rect zoomRect, Rect rect, Paint paint) {
double value = chartYDataList.get(j);
float x = getStartX(zoomRect, j);
float y = getStartY(zoomRect, value, lineData.getDirection());
+ if(grid !=null && i == 0) {
+ grid.drawGrid(canvas, x, zoomRect, perWidth, paint);
+ grid.drawColumnContent(canvas,j,zoomRect,rect,perWidth,paint);
+ }
pointX.add(x);
pointY.add(y);
if(j % filter == 0) {
- drawPointText(canvas, value, x, y, paint);
+ drawPointText(canvas, value, x, y,j,i, paint);
}
}
canvas.save();
canvas.clipRect(rect);
- drawLine(canvas, rect, paint, lineData, pointX, pointY);
+ drawLine(canvas, rect,zoomRect, paint, lineData, pointX, pointY);
drawTip(canvas, pointX, pointY, lineData);
canvas.restore();
drawPoint(canvas, pointX, pointY,lineData, paint);
@@ -72,7 +87,7 @@ public void drawProvider(Canvas canvas, Rect zoomRect, Rect rect, Paint paint) {
drawClickCross(canvas, rect, zoomRect, paint);
}
- private void drawLine(Canvas canvas, Rect rect, Paint paint, LineData lineData, List pointX, List pointY) {
+ private void drawLine(Canvas canvas, Rect rect,Rect zoomRect, Paint paint, LineData lineData, List pointX, List pointY) {
LineStyle style = lineData.getLineStyle();
style = style == null?lineStyle:style;
style.fillPaint(paint);
@@ -86,10 +101,10 @@ private void drawLine(Canvas canvas, Rect rect, Paint paint, LineData lineData,
path.lineTo(rect.right, rect.bottom);
path.lineTo(rect.left, rect.bottom);
path.close();
- int alphaColor = ColorUtils.changeAlpha(paint.getColor(), 125);
+ int alphaColor = ColorUtils.changeAlpha(paint.getColor(), areaAlpha);
paint.setColor(alphaColor);
}
- canvas.drawPath(path, paint);
+ getPath().drawPath(canvas,zoomRect,path,perWidth,paint,getProgress());
}
}
@@ -104,11 +119,14 @@ protected void matrixRectEnd(Canvas canvas, Rect rect) {
protected void matrixRectStart(Canvas canvas, Rect rect) {
}
-
private float getStartX(Rect zoomRect, int position) {
-
- double width = ((double) zoomRect.width()) / (rowSize - 1);
- return (float) (position * width + zoomRect.left);
+ if(isStartZero){
+ perWidth = (zoomRect.width()) / (rowSize-1);
+ return (float) (position * perWidth+ zoomRect.left);
+ }else {
+ perWidth = (zoomRect.width()) / rowSize;
+ return (float) (position * perWidth + perWidth / 2 + zoomRect.left);
+ }
}
@@ -169,11 +187,11 @@ private void drawPoint(Canvas canvas, List pointX, List pointY,Lin
if (linePoint != null) {
for (int i = 0; i < pointY.size(); i++) {
- float x = pointX.get(i);
- float y = pointY.get(i);
- if (containsRect(x, y)) {
- linePoint.drawPoint(canvas, x, y, false, paint);
- }
+ float x = pointX.get(i);
+ float y = pointY.get(i);
+ if (containsRect(x, y)) {
+ linePoint.drawPoint(canvas, x, y, i,false, paint);
+ }
}
}
@@ -206,7 +224,24 @@ public double[] setMaxMinValue(double maxValue, double minValue) {
}
return new double[]{maxValue, minValue};
}
+ public IPath getPath() {
+ if(path == null){
+ path = new LinePath();
+ }
+ return path;
+ }
+
+ public IGrid getGrid() {
+ return grid;
+ }
+ public void setGrid(IGrid grid) {
+ this.grid = grid;
+ }
+
+ public void setPath(IPath path) {
+ this.path = path;
+ }
public void setArea(boolean isArea) {
this.isArea = isArea;
@@ -231,4 +266,21 @@ public void setFilterPointTextCount(int filterPointTextCount) {
public void setPoint(IPoint point) {
this.point = point;
}
+
+
+ public boolean isStartZero() {
+ return isStartZero;
+ }
+
+ public void setStartZero(boolean startZero) {
+ isStartZero = startZero;
+ }
+
+ public int getAreaAlpha() {
+ return areaAlpha;
+ }
+
+ public void setAreaAlpha(int areaAlpha) {
+ this.areaAlpha = areaAlpha;
+ }
}
diff --git a/chart/src/main/java/com/daivd/chart/provider/component/cross/VerticalCross.java b/chart/src/main/java/com/daivd/chart/provider/component/cross/VerticalCross.java
index 7ede433..05eee20 100644
--- a/chart/src/main/java/com/daivd/chart/provider/component/cross/VerticalCross.java
+++ b/chart/src/main/java/com/daivd/chart/provider/component/cross/VerticalCross.java
@@ -23,7 +23,7 @@ public void drawCross(Canvas canvas, PointF pointF, Rect rect, Paint paint) {
crossStyle.fillPaint(paint);
canvas.drawLine(pointF.x, rect.top, pointF.x, rect.bottom, paint);
if(point != null){
- point.drawPoint(canvas,pointF.x,pointF.y,false,paint);
+ point.drawPoint(canvas,pointF.x,pointF.y,0,false,paint);
}
}
diff --git a/chart/src/main/java/com/daivd/chart/provider/component/grid/IGrid.java b/chart/src/main/java/com/daivd/chart/provider/component/grid/IGrid.java
new file mode 100644
index 0000000..26e75d6
--- /dev/null
+++ b/chart/src/main/java/com/daivd/chart/provider/component/grid/IGrid.java
@@ -0,0 +1,42 @@
+package com.daivd.chart.provider.component.grid;
+
+import android.graphics.Canvas;
+import android.graphics.Paint;
+import android.graphics.PointF;
+import android.graphics.Rect;
+
+/**
+ * Created by huang on 2017/12/1.
+ */
+
+public interface IGrid {
+ /**
+ * 绘制网格
+ * @param canvas
+ * @param x
+ * @param rect
+ * @param perWidth
+ * @param paint
+ */
+ void drawGrid(Canvas canvas, float x, Rect rect, int perWidth, Paint paint);
+
+ /**
+ * 绘制点击背景
+ * @param canvas
+ * @param pointF
+ * @param rect
+ * @param perWidth
+ * @param paint
+ */
+ void drawClickBg(Canvas canvas, PointF pointF, Rect rect, int perWidth, Paint paint);
+
+ /**
+ * 绘制列内容
+ * @param canvas
+ * @param position
+ * @param rect
+ * @param perWidth
+ * @param paint
+ */
+ void drawColumnContent(Canvas canvas, int position, Rect zoomRect, Rect rect, int perWidth, Paint paint);
+}
diff --git a/chart/src/main/java/com/daivd/chart/provider/component/path/IPath.java b/chart/src/main/java/com/daivd/chart/provider/component/path/IPath.java
new file mode 100644
index 0000000..7a2de08
--- /dev/null
+++ b/chart/src/main/java/com/daivd/chart/provider/component/path/IPath.java
@@ -0,0 +1,15 @@
+package com.daivd.chart.provider.component.path;
+
+import android.graphics.Canvas;
+import android.graphics.Paint;
+import android.graphics.Path;
+import android.graphics.Rect;
+
+/**
+ * Created by huang on 2017/11/30.
+ */
+
+public interface IPath {
+
+ void drawPath(Canvas canvas, Rect rect, Path path, int perWidth, Paint paint, float progress);
+}
diff --git a/chart/src/main/java/com/daivd/chart/provider/component/path/LinePath.java b/chart/src/main/java/com/daivd/chart/provider/component/path/LinePath.java
new file mode 100644
index 0000000..f93c6aa
--- /dev/null
+++ b/chart/src/main/java/com/daivd/chart/provider/component/path/LinePath.java
@@ -0,0 +1,17 @@
+package com.daivd.chart.provider.component.path;
+
+import android.graphics.Canvas;
+import android.graphics.Paint;
+import android.graphics.Path;
+import android.graphics.Rect;
+
+/**
+ * Created by huang on 2017/11/30.
+ */
+
+public class LinePath implements IPath{
+
+ public void drawPath(Canvas canvas, Rect rect, Path path, int perWidth, Paint paint,float progress){
+ canvas.drawPath(path, paint);
+ }
+}
diff --git a/chart/src/main/java/com/daivd/chart/provider/component/point/ILegendPoint.java b/chart/src/main/java/com/daivd/chart/provider/component/point/ILegendPoint.java
new file mode 100644
index 0000000..fe4e417
--- /dev/null
+++ b/chart/src/main/java/com/daivd/chart/provider/component/point/ILegendPoint.java
@@ -0,0 +1,11 @@
+package com.daivd.chart.provider.component.point;
+
+/**
+ * Created by huang on 2017/12/13.
+ */
+
+public interface ILegendPoint extends IPoint{
+
+ float getWidth();
+ float getHeight();
+}
diff --git a/chart/src/main/java/com/daivd/chart/provider/component/point/IPoint.java b/chart/src/main/java/com/daivd/chart/provider/component/point/IPoint.java
index 3574847..489cdd2 100644
--- a/chart/src/main/java/com/daivd/chart/provider/component/point/IPoint.java
+++ b/chart/src/main/java/com/daivd/chart/provider/component/point/IPoint.java
@@ -9,8 +9,7 @@
public interface IPoint {
- void drawPoint(Canvas canvas, float x,float y,boolean isShowDefaultColor,Paint paint);
- float getWidth();
- float getHeight();
+ void drawPoint(Canvas canvas, float x, float y, int position, boolean isShowDefaultColor, Paint paint);
+
}
diff --git a/chart/src/main/java/com/daivd/chart/provider/component/point/LegendPoint.java b/chart/src/main/java/com/daivd/chart/provider/component/point/LegendPoint.java
new file mode 100644
index 0000000..d0235ec
--- /dev/null
+++ b/chart/src/main/java/com/daivd/chart/provider/component/point/LegendPoint.java
@@ -0,0 +1,57 @@
+package com.daivd.chart.provider.component.point;
+
+import android.graphics.Canvas;
+import android.graphics.Paint;
+
+import com.daivd.chart.data.style.PointStyle;
+
+
+/**
+ * Created by huang on 2017/10/20.
+ */
+
+public class LegendPoint implements ILegendPoint {
+
+ private PointStyle pointStyle = new PointStyle();
+
+ public void drawPoint(Canvas canvas, float x, float y, int position,boolean isShowDefaultColor, Paint paint){
+ float w = pointStyle.getWidth();
+ if(isShowDefaultColor){
+ pointStyle.fillPaint(paint);
+ }else {
+ int oldColor =paint.getColor();
+ pointStyle.fillPaint(paint);
+ paint.setColor(oldColor);
+ }
+ if (pointStyle.getShape() == PointStyle.CIRCLE) {
+ canvas.drawCircle(x, y, w/2, paint);
+ } else if (pointStyle.getShape() == PointStyle.SQUARE) {
+ canvas.drawRect(x - w/2 , y - w/2 , x + w/2, y + w/2 , paint);
+ } else if (pointStyle.getShape() == PointStyle.RECT) {
+ canvas.drawRect(x - w * 2 / 3, y - w/2 , x + w * 2 / 3, y + w/2, paint);
+ }
+ }
+
+
+ @Override
+ public float getWidth() {
+ if(pointStyle.getShape() == PointStyle.RECT){
+ return pointStyle.getWidth() * 4/ 3;
+ }
+ return pointStyle.getWidth();
+ }
+
+ @Override
+ public float getHeight() {
+
+ return pointStyle.getWidth();
+ }
+
+
+ public PointStyle getPointStyle() {
+ return pointStyle;
+ }
+
+
+}
+
diff --git a/chart/src/main/java/com/daivd/chart/provider/component/point/Point.java b/chart/src/main/java/com/daivd/chart/provider/component/point/Point.java
index 2dad09d..69e9bb2 100644
--- a/chart/src/main/java/com/daivd/chart/provider/component/point/Point.java
+++ b/chart/src/main/java/com/daivd/chart/provider/component/point/Point.java
@@ -13,7 +13,7 @@ public class Point implements IPoint {
private PointStyle pointStyle = new PointStyle();
- public void drawPoint(Canvas canvas,float x, float y,boolean isShowDefaultColor, Paint paint){
+ public void drawPoint(Canvas canvas,float x, float y,int position,boolean isShowDefaultColor, Paint paint){
float w = pointStyle.getWidth();
if(isShowDefaultColor){
pointStyle.fillPaint(paint);
@@ -32,19 +32,7 @@ public void drawPoint(Canvas canvas,float x, float y,boolean isShowDefaultColor,
}
- @Override
- public float getWidth() {
- if(pointStyle.getShape() == PointStyle.RECT){
- return pointStyle.getWidth() * 4/ 3;
- }
- return pointStyle.getWidth();
- }
-
- @Override
- public float getHeight() {
- return pointStyle.getWidth();
- }
public PointStyle getPointStyle() {
diff --git a/chart/src/main/java/com/daivd/chart/provider/component/text/IText.java b/chart/src/main/java/com/daivd/chart/provider/component/text/IText.java
new file mode 100644
index 0000000..bc051d7
--- /dev/null
+++ b/chart/src/main/java/com/daivd/chart/provider/component/text/IText.java
@@ -0,0 +1,13 @@
+package com.daivd.chart.provider.component.text;
+
+import android.graphics.Canvas;
+import android.graphics.Paint;
+
+/**
+ * Created by huang on 2017/11/30.
+ */
+
+public interface IText {
+
+ void drawText(Canvas canvas, String value, float x, float y, int position, int line, Paint paint);
+}
diff --git a/chart/src/main/java/com/daivd/chart/provider/component/tip/BaseBubbleTip.java b/chart/src/main/java/com/daivd/chart/provider/component/tip/BaseBubbleTip.java
index 77e73b5..b651846 100644
--- a/chart/src/main/java/com/daivd/chart/provider/component/tip/BaseBubbleTip.java
+++ b/chart/src/main/java/com/daivd/chart/provider/component/tip/BaseBubbleTip.java
@@ -4,6 +4,7 @@
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
+import android.graphics.Color;
import android.graphics.NinePatch;
import android.graphics.Paint;
import android.graphics.PorterDuff;
@@ -23,7 +24,8 @@ public abstract class BaseBubbleTip implements ITip{
public static final int INVALID = -1;
private Rect tipRect;
private Paint paint;
- private int padding;
+ private int verticalPadding;
+ private int horizontalPadding;
private Bitmap triangleBitmap;
private NinePatch ninePatch;
private boolean isReversal = false;
@@ -32,6 +34,7 @@ public abstract class BaseBubbleTip implements ITip{
private int colorFilter = INVALID;
public BaseBubbleTip(Context context, int backgroundDrawableID, int triangleDrawableID, Paint paint){
+
tipRect = new Rect();
this.paint = paint;
triangleBitmap = Bitmap.createBitmap(BitmapFactory.decodeResource(context.getResources(), triangleDrawableID));
@@ -41,7 +44,8 @@ public BaseBubbleTip(Context context, int backgroundDrawableID, int triangleDraw
ninePatch = new NinePatch(bmp_9, bmp_9.getNinePatchChunk(), null);
}
- padding = DensityUtils.dp2px(context,5);
+ verticalPadding = DensityUtils.dp2px(context,5);
+ horizontalPadding = verticalPadding;
deviation = DensityUtils.dp2px(context,5);
}
@@ -52,28 +56,29 @@ public void drawTip(Canvas canvas, float x, float y, Rect rect,C c,int position)
int triangleHeight = triangleBitmap.getHeight();
int textWidth = getTextWidth(content);
int textHeight = getTextHeight(content);
- int w = textWidth + padding * 2;
- int h = textHeight + padding * 2;
+ int w = textWidth + horizontalPadding * 2;
+ int h = textHeight + verticalPadding * 2;
tipRect.left = (int) x - w / 2;
tipRect.right = (int) x + w / 2;
tipRect.bottom = (int) y - triangleHeight + triangleWidth / 8;
tipRect.top = tipRect.bottom - h;
int tranX = 0;
- if (tipRect.left < rect.left) {
- tranX = rect.left - tipRect.left - triangleWidth/2;
-
- } else if (tipRect.right > rect.right) {
- tranX = rect.right - tipRect.right + triangleWidth/2;
- }
-
- if (tipRect.top < rect.top) {
- showBottom(canvas, x, y, content, textWidth,textHeight, tranX);
- } else if (tipRect.bottom > rect.bottom) {
- showTop(canvas, x, y, content, textWidth,textHeight, tranX);
- } else if (isReversal) {
- showBottom(canvas, x, y, content, textWidth,textHeight, tranX);
- } else {
- showTop(canvas, x, y, content, textWidth,textHeight, tranX);
+ if(x > rect.left && x < rect.right) {
+ if (tipRect.left < rect.left) {
+ tranX = rect.left - tipRect.left - triangleWidth / 2;
+
+ } else if (tipRect.right > rect.right) {
+ tranX = rect.right - tipRect.right + triangleWidth / 2;
+ }
+ if (tipRect.top < rect.top) {
+ showBottom(canvas, x, y, content, textWidth, textHeight, tranX);
+ } else if (tipRect.bottom > rect.bottom) {
+ showTop(canvas, x, y, content, textWidth, textHeight, tranX);
+ } else if (isReversal) {
+ showBottom(canvas, x, y, content, textWidth, textHeight, tranX);
+ } else {
+ showTop(canvas, x, y, content, textWidth, textHeight, tranX);
+ }
}
}
@@ -91,8 +96,10 @@ private void showTop(Canvas canvas, float x, float y, S content, int textWidth,
int triangleWidth = triangleBitmap.getWidth();
int triangleHeight = triangleBitmap.getHeight();
startColorFilter();
+ // paint.setShadowLayer(40, 10, 50, Color.BLACK);
canvas.drawBitmap(triangleBitmap,x-triangleWidth/2,
y-triangleHeight,paint);
+ // paint.clearShadowLayer();
canvas.translate(tranX,0);
ninePatch.draw(canvas, tipRect);
clearColorFilter();
@@ -150,12 +157,20 @@ public void setReversal(boolean reversal) {
isReversal = reversal;
}
- public void setPadding(int padding) {
- this.padding = padding;
+ public void setVerticalPadding(int verticalPadding) {
+ this.verticalPadding = verticalPadding;
+ }
+
+ public int getVerticalPadding() {
+ return verticalPadding;
+ }
+
+ public int getHorizontalPadding() {
+ return horizontalPadding;
}
- public int getPadding() {
- return padding;
+ public void setHorizontalPadding(int horizontalPadding) {
+ this.horizontalPadding = horizontalPadding;
}
public int getColorFilter() {
diff --git a/chart/src/main/java/com/daivd/chart/provider/component/tip/MultiLineBubbleTip.java b/chart/src/main/java/com/daivd/chart/provider/component/tip/MultiLineBubbleTip.java
index 33f7591..41a6960 100644
--- a/chart/src/main/java/com/daivd/chart/provider/component/tip/MultiLineBubbleTip.java
+++ b/chart/src/main/java/com/daivd/chart/provider/component/tip/MultiLineBubbleTip.java
@@ -46,7 +46,7 @@ public void drawText(Canvas canvas, Rect tipRect, String[] content, int textWidt
int lineHeight =textHeight/content.length;
for(int i = 0;i < content.length;i++) {
String c = content[i];
- int bottom = tipRect.top+getPadding()+lineHeight+ (lineHeight)*i - lineSpacing-deviation/2;
+ int bottom = tipRect.top+getVerticalPadding()+lineHeight+ (lineHeight)*i - lineSpacing-deviation/2;
int left = tipRect.centerX()-textWidth/2;
canvas.drawText(c,left,bottom,paint);
diff --git a/chart/src/main/java/com/daivd/chart/utils/DrawUtils.java b/chart/src/main/java/com/daivd/chart/utils/DrawUtils.java
new file mode 100644
index 0000000..eb1e1fa
--- /dev/null
+++ b/chart/src/main/java/com/daivd/chart/utils/DrawUtils.java
@@ -0,0 +1,50 @@
+package com.daivd.chart.utils;
+
+import android.graphics.Paint;
+import android.graphics.PointF;
+import android.graphics.Rect;
+
+import com.daivd.chart.data.style.FontStyle;
+
+
+/**
+ * Created by huang on 2017/11/1.
+ */
+
+public class DrawUtils {
+
+ public static int getTextHeight(FontStyle style, Paint paint){
+ style.fillPaint(paint);
+ Paint.FontMetrics fontMetrics = paint.getFontMetrics();
+ return (int) (fontMetrics.descent - fontMetrics.ascent);
+ }
+
+ public static int getTextHeight(Paint paint){
+ Paint.FontMetrics fontMetrics = paint.getFontMetrics();
+ return (int) (fontMetrics.descent - fontMetrics.ascent);
+ }
+
+ public static float getTextCenterY(int centerY,Paint paint){
+ return centerY-((paint.descent() + paint.ascent()) / 2);
+ }
+
+ public static boolean isMixRect(Rect rect,int left,int top,int right,int bottom){
+
+ return rect.bottom>= top && rect.right >= left && rect.top = left && clickPoint.x <=right && clickPoint.y>=top && clickPoint.y <=bottom;
+ }
+
+
+
+ public static boolean isMixHorizontalRect(Rect rect,int left,int right){
+
+ return rect.right >= left && rect.left<= right;
+ }
+ public static boolean isVerticalMixRect(Rect rect,int top,int bottom){
+
+ return rect.bottom>= top && rect.top <=bottom;
+ }
+}