diff --git a/README.en.md b/README.en.md index 23e5d73..f54438a 100644 --- a/README.en.md +++ b/README.en.md @@ -2,7 +2,25 @@ ------ * [Chinese README](/README.md/) +### version 1.4 +> support horizontal rolling and set width ratio. +> to provide more cases +> +! [animation] (/img/zuoping.jpg) + +! [animation] (/img/gif/tip.gif) +### version 1.2 features + +#### supports Tip and MarkView is highly customizable +! [animation] (/img/gif/tip.gif) + +### version 1.1 features + +#### 1. ViewPager and a list of gestures to solve the conflict +! [gesture conflict] (/img/gif/viewpager.gif) +2. #### text rotation axis +! [spin] (/img/gif/rotate_axis_value.gif) * SmartChart is an Android chart framework that supports linear diagrams (broken lines, curves, scatter points) bar charts, area charts, pie charts, and 3D columnar diagrams to support a variety of configurations. * [apk download url](/img/smartChart.apk) ## Function display @@ -99,7 +117,7 @@ allprojects { > *Step 2. Add the dependency ```gradle dependencies { - compile 'com.github.huangyanbin:SmartChart:1.1' + compile 'com.github.huangyanbin:SmartChart:1.4' } ``` diff --git a/README.md b/README.md index 74cb7ca..b900606 100644 --- a/README.md +++ b/README.md @@ -7,12 +7,17 @@ * [apk下载地址](/img/smartChart.apk) -## 功能展示 -### 未来版本功能 - > 从实践看,还有很多需要开放更多功能。如果修改代码,可以满足几乎所有图表展示的功能。后面我将持续完善图表扩展内容。 +### 1.4 版本 +> 支持横向滚动,设置宽度比。 +> 提供更多案例 +> 后面将补充所有方法注释 +![动画](/img/zuoping.jpg) + + +![动画](/img/gif/tip.gif) ### 1.2版本功能 #### 支持Tip和MarkView高度可定制化 @@ -124,7 +129,7 @@ allprojects { > *Step 2. Add the dependency ```gradle dependencies { -        compile 'com.github.huangyanbin:SmartChart:1.3.3' +        compile 'com.github.huangyanbin:SmartChart:1.4' } ``` diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 8035978..5b09b50 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -34,7 +34,7 @@ - + \ No newline at end of file diff --git a/app/src/main/java/com/bin/david/smartchart/AreaChartActivity.java b/app/src/main/java/com/bin/david/smartchart/AreaChartActivity.java index e68ccbd..d175e9c 100644 --- a/app/src/main/java/com/bin/david/smartchart/AreaChartActivity.java +++ b/app/src/main/java/com/bin/david/smartchart/AreaChartActivity.java @@ -24,6 +24,7 @@ import com.daivd.chart.data.style.PointStyle; import com.daivd.chart.listener.OnClickColumnListener; import com.daivd.chart.provider.component.mark.BubbleMarkView; +import com.daivd.chart.provider.component.point.LegendPoint; import com.daivd.chart.provider.component.point.Point; import java.util.ArrayList; @@ -134,7 +135,7 @@ protected void onCreate(Bundle savedInstanceState) { levelLine.getLineStyle().setEffect(effects2); lineChart.getProvider().addLevelLine(levelLine); lineChart.getLegend().setDirection(IComponent.BOTTOM); - Point legendPoint = (Point) lineChart.getLegend().getPoint(); + LegendPoint legendPoint = (LegendPoint) lineChart.getLegend().getPoint(); PointStyle style = legendPoint.getPointStyle(); style.setShape(PointStyle.CIRCLE); lineChart.getLegend().setPercent(0.2f); @@ -442,7 +443,7 @@ private void showLegendStyle(ChartStyle c) { @Override public void onItemClick(String s, int position) { - Point legendPoint = (Point) lineChart.getLegend().getPoint(); + LegendPoint legendPoint = (LegendPoint) lineChart.getLegend().getPoint(); PointStyle style = legendPoint.getPointStyle(); if(position == 0){ style.setShape(PointStyle.SQUARE); diff --git a/app/src/main/java/com/bin/david/smartchart/Bar3DChartActivity.java b/app/src/main/java/com/bin/david/smartchart/Bar3DChartActivity.java index 414e84e..6d781cd 100644 --- a/app/src/main/java/com/bin/david/smartchart/Bar3DChartActivity.java +++ b/app/src/main/java/com/bin/david/smartchart/Bar3DChartActivity.java @@ -16,6 +16,7 @@ import com.daivd.chart.data.style.PointStyle; import com.daivd.chart.listener.OnClickColumnListener; import com.daivd.chart.provider.component.mark.BubbleMarkView; +import com.daivd.chart.provider.component.point.LegendPoint; import com.daivd.chart.provider.component.point.Point; import java.util.ArrayList; @@ -72,7 +73,7 @@ protected void onCreate(Bundle savedInstanceState) { levelLine.getLineStyle().setWidth(this,1).setColor(res.getColor(R.color.arc23)).setEffect(effects); bar3DChart.getProvider().addLevelLine(levelLine); bar3DChart.getProvider().setMarkView(new BubbleMarkView(this)); - Point legendPoint = (Point) bar3DChart.getLegend().getPoint(); + LegendPoint legendPoint = (LegendPoint) bar3DChart.getLegend().getPoint(); PointStyle style = legendPoint.getPointStyle(); style.setShape(PointStyle.CIRCLE); BaseAxis vaxis = bar3DChart.getLeftVerticalAxis(); diff --git a/app/src/main/java/com/bin/david/smartchart/BarChartActivity.java b/app/src/main/java/com/bin/david/smartchart/BarChartActivity.java index 4ff0df4..ca63060 100644 --- a/app/src/main/java/com/bin/david/smartchart/BarChartActivity.java +++ b/app/src/main/java/com/bin/david/smartchart/BarChartActivity.java @@ -16,6 +16,7 @@ import com.daivd.chart.data.style.PointStyle; import com.daivd.chart.listener.OnClickColumnListener; import com.daivd.chart.provider.component.mark.BubbleMarkView; +import com.daivd.chart.provider.component.point.LegendPoint; import com.daivd.chart.provider.component.point.Point; import java.util.ArrayList; @@ -73,7 +74,7 @@ protected void onCreate(Bundle savedInstanceState) { barChart.getProvider().addLevelLine(levelLine); barChart.getLeftVerticalAxis().getGridStyle().setEffect(effects); barChart.getProvider().setMarkView(new BubbleMarkView(this)); - Point legendPoint = (Point) barChart.getLegend().getPoint(); + LegendPoint legendPoint = (LegendPoint) barChart.getLegend().getPoint(); PointStyle style = legendPoint.getPointStyle(); style.setShape(PointStyle.CIRCLE); BaseAxis vaxis = barChart.getLeftVerticalAxis(); diff --git a/app/src/main/java/com/bin/david/smartchart/BarLineChartActivity.java b/app/src/main/java/com/bin/david/smartchart/BarLineChartActivity.java index 9503cdb..09797a5 100644 --- a/app/src/main/java/com/bin/david/smartchart/BarLineChartActivity.java +++ b/app/src/main/java/com/bin/david/smartchart/BarLineChartActivity.java @@ -23,6 +23,7 @@ import com.daivd.chart.provider.component.cross.DoubleDriCross; import com.daivd.chart.provider.component.level.LevelLine; import com.daivd.chart.provider.component.mark.BubbleMarkView; +import com.daivd.chart.provider.component.point.LegendPoint; import com.daivd.chart.provider.component.point.Point; import java.util.ArrayList; @@ -112,7 +113,7 @@ protected void onCreate(Bundle savedInstanceState) { levelLine.getLineStyle().setEffect(effects2); barLineChart.getProvider().addLevelLine(levelLine); barLineChart.getLegend().setDirection(IComponent.BOTTOM); - Point legendPoint = (Point)barLineChart.getLegend().getPoint(); + LegendPoint legendPoint = (LegendPoint) barLineChart.getLegend().getPoint(); PointStyle style = legendPoint.getPointStyle(); style.setShape(PointStyle.RECT); barLineChart.getLegend().setPercent(0.2f); @@ -416,7 +417,7 @@ private void showLegendStyle(ChartStyle c) { @Override public void onItemClick(String s, int position) { - Point legendPoint = (Point)barLineChart.getLegend().getPoint(); + LegendPoint legendPoint = (LegendPoint) barLineChart.getLegend().getPoint(); PointStyle style = legendPoint.getPointStyle(); if(position == 0){ style.setShape(PointStyle.SQUARE); diff --git a/app/src/main/java/com/bin/david/smartchart/CustomLineChartActivity.java b/app/src/main/java/com/bin/david/smartchart/CustomLineChartActivity.java index 9551a10..05a7afc 100644 --- a/app/src/main/java/com/bin/david/smartchart/CustomLineChartActivity.java +++ b/app/src/main/java/com/bin/david/smartchart/CustomLineChartActivity.java @@ -28,6 +28,7 @@ import com.daivd.chart.listener.OnClickColumnListener; import com.daivd.chart.provider.component.cross.VerticalCross; import com.daivd.chart.provider.component.level.LevelLine; +import com.daivd.chart.provider.component.point.LegendPoint; import com.daivd.chart.provider.component.point.Point; import com.daivd.chart.provider.component.tip.MultiLineBubbleTip; import com.daivd.chart.utils.DensityUtils; @@ -151,7 +152,7 @@ public String[] format(LineData lineData, int position) { levelLine.getLineStyle().setEffect(effects2); lineChart.getProvider().addLevelLine(levelLine); lineChart.getLegend().setDirection(IComponent.BOTTOM); - Point legendPoint = (Point)lineChart.getLegend().getPoint(); + LegendPoint legendPoint = (LegendPoint)lineChart.getLegend().getPoint(); PointStyle style = legendPoint.getPointStyle(); style.setShape(PointStyle.RECT); lineChart.getLegend().setPercent(0.2f); diff --git a/app/src/main/java/com/bin/david/smartchart/LineChartActivity.java b/app/src/main/java/com/bin/david/smartchart/LineChartActivity.java index bf2ad1f..fe1c856 100644 --- a/app/src/main/java/com/bin/david/smartchart/LineChartActivity.java +++ b/app/src/main/java/com/bin/david/smartchart/LineChartActivity.java @@ -34,6 +34,7 @@ import com.daivd.chart.data.style.PointStyle; import com.daivd.chart.listener.OnClickColumnListener; import com.daivd.chart.provider.component.point.IPoint; +import com.daivd.chart.provider.component.point.LegendPoint; import com.daivd.chart.provider.component.point.Point; import com.daivd.chart.provider.component.tip.MultiLineBubbleTip; import com.daivd.chart.utils.DensityUtils; @@ -165,7 +166,7 @@ public String[] format(LineData lineData, int position) { levelLine.getLineStyle().setEffect(effects2); lineChart.getProvider().addLevelLine(levelLine); lineChart.getLegend().setDirection(IComponent.BOTTOM); - Point legendPoint = (Point) lineChart.getLegend().getPoint(); + LegendPoint legendPoint = (LegendPoint) lineChart.getLegend().getPoint(); PointStyle style = legendPoint.getPointStyle(); style.setShape(PointStyle.RECT); lineChart.getLegend().setPercent(0.2f); @@ -494,7 +495,7 @@ private void showLegendStyle(ChartStyle c) { @Override public void onItemClick(String s, int position) { - Point legendPoint = (Point) lineChart.getLegend().getPoint(); + LegendPoint legendPoint = (LegendPoint) lineChart.getLegend().getPoint(); PointStyle style = legendPoint.getPointStyle(); if (position == 0) { style.setShape(PointStyle.SQUARE); diff --git a/app/src/main/java/com/bin/david/smartchart/MainActivity.java b/app/src/main/java/com/bin/david/smartchart/MainActivity.java index 0e69a05..aaed63b 100644 --- a/app/src/main/java/com/bin/david/smartchart/MainActivity.java +++ b/app/src/main/java/com/bin/david/smartchart/MainActivity.java @@ -35,7 +35,8 @@ protected void onCreate(Bundle savedInstanceState) { items.add(new MainItem(RadarChartActivity.class,"Radar chart")); items.add(new MainItem(RoseChartActivity.class,"Rose chart")); items.add(new MainItem(BarLineChartActivity.class,"Bar line chart")); - items.add(new MainItem(CustomLineChartActivity.class,"Custom line chart")); + items.add(new MainItem(TestChartActivity.class,"Custom line chart1")); + items.add(new MainItem(CustomLineChartActivity.class,"Custom line chart2")); items.add(new MainItem(ZoomChartListActivity.class,"scale chart List(Solving gesture conflict)")); items.add(new MainItem(RotateChartListActivity.class,"rotate chart List(Solving gesture conflict)")); itemAdapter = new ItemAdapter(items); diff --git a/app/src/main/java/com/bin/david/smartchart/Pie3DChartActivity.java b/app/src/main/java/com/bin/david/smartchart/Pie3DChartActivity.java index fe1a770..b8cd4d7 100644 --- a/app/src/main/java/com/bin/david/smartchart/Pie3DChartActivity.java +++ b/app/src/main/java/com/bin/david/smartchart/Pie3DChartActivity.java @@ -13,6 +13,7 @@ import com.daivd.chart.data.style.PointStyle; import com.daivd.chart.listener.OnClickColumnListener; import com.daivd.chart.provider.component.mark.BubbleMarkView; +import com.daivd.chart.provider.component.point.LegendPoint; import com.daivd.chart.provider.component.point.Point; import java.util.ArrayList; @@ -54,7 +55,7 @@ protected void onCreate(Bundle savedInstanceState) { fontStyle.setTextSpSize(this,15); pie3DChart.getProvider().setOpenMark(true); pie3DChart.getProvider().setMarkView(new BubbleMarkView(this)); - Point legendPoint = (Point) pie3DChart.getLegend().getPoint(); + LegendPoint legendPoint = (LegendPoint) pie3DChart.getLegend().getPoint(); PointStyle style = legendPoint.getPointStyle(); style.setShape(PointStyle.CIRCLE); pie3DChart.getLegend().setDirection(IComponent.TOP); diff --git a/app/src/main/java/com/bin/david/smartchart/PieChartActivity.java b/app/src/main/java/com/bin/david/smartchart/PieChartActivity.java index 96ca64a..634f055 100644 --- a/app/src/main/java/com/bin/david/smartchart/PieChartActivity.java +++ b/app/src/main/java/com/bin/david/smartchart/PieChartActivity.java @@ -13,6 +13,7 @@ import com.daivd.chart.data.style.PointStyle; import com.daivd.chart.listener.OnClickColumnListener; import com.daivd.chart.provider.component.mark.BubbleMarkView; +import com.daivd.chart.provider.component.point.LegendPoint; import com.daivd.chart.provider.component.point.Point; import java.util.ArrayList; @@ -54,7 +55,7 @@ protected void onCreate(Bundle savedInstanceState) { fontStyle.setTextSpSize(this,15); pieChart.getProvider().setOpenMark(true); pieChart.getProvider().setMarkView(new BubbleMarkView(this)); - Point legendPoint = (Point)pieChart.getLegend().getPoint(); + LegendPoint legendPoint = (LegendPoint)pieChart.getLegend().getPoint(); PointStyle style = legendPoint.getPointStyle(); style.setShape(PointStyle.CIRCLE); pieChart.getLegend().setDirection(IComponent.TOP); diff --git a/app/src/main/java/com/bin/david/smartchart/RadarChartActivity.java b/app/src/main/java/com/bin/david/smartchart/RadarChartActivity.java index c818c68..2d92d58 100644 --- a/app/src/main/java/com/bin/david/smartchart/RadarChartActivity.java +++ b/app/src/main/java/com/bin/david/smartchart/RadarChartActivity.java @@ -11,6 +11,7 @@ import com.daivd.chart.data.style.FontStyle; import com.daivd.chart.data.style.PointStyle; import com.daivd.chart.provider.component.mark.BubbleMarkView; +import com.daivd.chart.provider.component.point.LegendPoint; import com.daivd.chart.provider.component.point.Point; import java.util.ArrayList; @@ -70,7 +71,7 @@ protected void onCreate(Bundle savedInstanceState) { //设置标题样式 radarChart.getChartTitle().getFontStyle().setTextColor(res.getColor(R.color.arc23)); radarChart.getLegend().setDirection(IComponent.BOTTOM); - Point point = (Point)radarChart.getLegend().getPoint(); + LegendPoint point = (LegendPoint)radarChart.getLegend().getPoint(); point.getPointStyle().setShape(PointStyle.SQUARE); radarChart.getLegend().setPercent(0.2f); radarChart.setChartData(chartData2); diff --git a/app/src/main/java/com/bin/david/smartchart/RoseChartActivity.java b/app/src/main/java/com/bin/david/smartchart/RoseChartActivity.java index 4aa64e1..2b182d6 100644 --- a/app/src/main/java/com/bin/david/smartchart/RoseChartActivity.java +++ b/app/src/main/java/com/bin/david/smartchart/RoseChartActivity.java @@ -12,6 +12,7 @@ import com.daivd.chart.data.style.FontStyle; import com.daivd.chart.data.style.PointStyle; import com.daivd.chart.provider.component.mark.BubbleMarkView; +import com.daivd.chart.provider.component.point.LegendPoint; import com.daivd.chart.provider.component.point.Point; import java.util.ArrayList; @@ -78,7 +79,7 @@ protected void onCreate(Bundle savedInstanceState) { fontStyle.setTextColor(res.getColor(R.color.arc23)); fontStyle.setTextSpSize(this,16); roseChart.getLegend().setDirection(IComponent.BOTTOM); - Point legendPoint = (Point)roseChart.getLegend().getPoint(); + LegendPoint legendPoint = (LegendPoint)roseChart.getLegend().getPoint(); PointStyle style = legendPoint.getPointStyle(); style.setShape(PointStyle.SQUARE); roseChart.getLegend().setPercent(0.2f); diff --git a/app/src/main/java/com/bin/david/smartchart/ScatterChartActivity.java b/app/src/main/java/com/bin/david/smartchart/ScatterChartActivity.java index a4bf400..86737ce 100644 --- a/app/src/main/java/com/bin/david/smartchart/ScatterChartActivity.java +++ b/app/src/main/java/com/bin/david/smartchart/ScatterChartActivity.java @@ -23,6 +23,7 @@ import com.daivd.chart.data.style.LineStyle; import com.daivd.chart.data.style.PointStyle; import com.daivd.chart.provider.component.mark.BubbleMarkView; +import com.daivd.chart.provider.component.point.LegendPoint; import com.daivd.chart.provider.component.point.Point; import java.util.ArrayList; @@ -123,7 +124,7 @@ protected void onCreate(Bundle savedInstanceState) { levelLine.getLineStyle().setEffect(effects2); lineChart.getProvider().addLevelLine(levelLine); lineChart.getLegend().setDirection(IComponent.BOTTOM); - Point legendPoint = (Point)lineChart.getLegend().getPoint(); + LegendPoint legendPoint = (LegendPoint)lineChart.getLegend().getPoint(); PointStyle style = legendPoint.getPointStyle(); style.setShape(PointStyle.RECT); lineChart.getLegend().setPercent(0.2f); @@ -439,7 +440,7 @@ private void showLegendStyle(ChartStyle c) { @Override public void onItemClick(String s, int position) { - Point legendPoint = (Point) lineChart.getLegend().getPoint(); + LegendPoint legendPoint = (LegendPoint) lineChart.getLegend().getPoint(); PointStyle style = legendPoint.getPointStyle(); if(position == 0){ style.setShape(PointStyle.SQUARE); diff --git a/app/src/main/java/com/bin/david/smartchart/TestChartActivity.java b/app/src/main/java/com/bin/david/smartchart/TestChartActivity.java new file mode 100644 index 0000000..2a5fa36 --- /dev/null +++ b/app/src/main/java/com/bin/david/smartchart/TestChartActivity.java @@ -0,0 +1,38 @@ +package com.bin.david.smartchart; + +import android.os.Bundle; +import android.support.v7.app.AppCompatActivity; + +import com.bin.david.smartchart.helper.DrawHelper; +import com.daivd.chart.core.LineChart; + + +public class TestChartActivity extends AppCompatActivity { + + + LineChart lineChart2; + LineChart lineChart; + LineChart lineChart3; + LineChart lineChart4; + LineChart lineChart5; + LineChart lineChart6; + + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_test); + lineChart = (LineChart) findViewById(R.id.lineChart); + lineChart2 = (LineChart) findViewById(R.id.lineChart2); + lineChart3= (LineChart) findViewById(R.id.lineChart3); + lineChart4 = (LineChart) findViewById(R.id.lineChart4); + lineChart5 = (LineChart) findViewById(R.id.lineChart5); + lineChart6 = (LineChart) findViewById(R.id.lineChart6); + DrawHelper.drawWeatherChart(this, lineChart); + DrawHelper.drawFrozenSoilChart(this, lineChart2); + DrawHelper.drawGroundTempChart(this, lineChart3); + DrawHelper.drawFactorChart(this, lineChart4); + DrawHelper.drawSoilChart(this, lineChart5); + DrawHelper.drawHomeWeatherChart(this,lineChart6); + } +} diff --git a/app/src/main/java/com/bin/david/smartchart/adapter/RotateChartListAdapter.java b/app/src/main/java/com/bin/david/smartchart/adapter/RotateChartListAdapter.java index 726025c..965db96 100644 --- a/app/src/main/java/com/bin/david/smartchart/adapter/RotateChartListAdapter.java +++ b/app/src/main/java/com/bin/david/smartchart/adapter/RotateChartListAdapter.java @@ -13,6 +13,7 @@ import com.daivd.chart.data.style.FontStyle; import com.daivd.chart.data.style.PointStyle; import com.daivd.chart.provider.component.mark.BubbleMarkView; +import com.daivd.chart.provider.component.point.LegendPoint; import com.daivd.chart.provider.component.point.Point; import java.util.ArrayList; @@ -61,7 +62,7 @@ protected void convert(BaseViewHolder helper, String item) { fontStyle.setTextSpSize(mContext,15); pieChart.getProvider().setOpenMark(true); pieChart.getProvider().setMarkView(new BubbleMarkView(mContext)); - Point legendPoint = (Point) pieChart.getLegend().getPoint(); + LegendPoint legendPoint = (LegendPoint) pieChart.getLegend().getPoint(); PointStyle style = legendPoint.getPointStyle(); style.setShape(PointStyle.CIRCLE); pieChart.getLegend().setDirection(IComponent.TOP); diff --git a/app/src/main/java/com/bin/david/smartchart/adapter/ZoomChartListAdapter.java b/app/src/main/java/com/bin/david/smartchart/adapter/ZoomChartListAdapter.java index 646baf5..e2f5eaf 100644 --- a/app/src/main/java/com/bin/david/smartchart/adapter/ZoomChartListAdapter.java +++ b/app/src/main/java/com/bin/david/smartchart/adapter/ZoomChartListAdapter.java @@ -21,6 +21,7 @@ import com.daivd.chart.data.style.LineStyle; import com.daivd.chart.data.style.PointStyle; import com.daivd.chart.provider.component.mark.BubbleMarkView; +import com.daivd.chart.provider.component.point.LegendPoint; import com.daivd.chart.provider.component.point.Point; import java.util.ArrayList; @@ -119,7 +120,7 @@ protected void convert(BaseViewHolder helper, String item) { levelLine.getLineStyle().setEffect(effects2); lineChart.getProvider().addLevelLine(levelLine); lineChart.getLegend().setDirection(IComponent.BOTTOM); - Point legendPoint = (Point) lineChart.getLegend().getPoint(); + LegendPoint legendPoint = (LegendPoint) lineChart.getLegend().getPoint(); PointStyle style = legendPoint.getPointStyle(); style.setShape(PointStyle.RECT); lineChart.getLegend().setPercent(0.2f); diff --git a/app/src/main/java/com/bin/david/smartchart/custom/MarkPoint.java b/app/src/main/java/com/bin/david/smartchart/custom/MarkPoint.java index 392512b..c234978 100644 --- a/app/src/main/java/com/bin/david/smartchart/custom/MarkPoint.java +++ b/app/src/main/java/com/bin/david/smartchart/custom/MarkPoint.java @@ -40,8 +40,11 @@ public MarkPoint(Context context,int height){ } + + + @Override - 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) { rect.top = (int) (y - height); rect.bottom = (int) y; rect.right = (int) (x + width/2); @@ -50,22 +53,10 @@ public void drawPoint(Canvas canvas, float x, float y, boolean isShowDefaultColo int layerId = canvas.saveLayer(rect.left,rect.top,rect.right,rect.bottom , null, Canvas.ALL_SAVE_FLAG); rect.bottom = rect.top+rect.width(); paint.setStyle(Paint.Style.FILL); - canvas.drawCircle(rect.centerX(),rect.centerY(),rect.width()/2,paint); - paint.setXfermode(xFermode); - canvas.drawBitmap(avatorBitmap, avatorBitmapRect,rect,paint); - paint.setXfermode(null); + canvas.drawCircle(rect.centerX(),rect.centerY(),rect.width()/2,paint); + paint.setXfermode(xFermode); + canvas.drawBitmap(avatorBitmap, avatorBitmapRect,rect,paint); + paint.setXfermode(null); canvas.restoreToCount(layerId);//将自己创建的画布Layer绘制到画布默认的Layer } - - @Override - public float getWidth() { - return width; - } - - @Override - public float getHeight() { - return height; - } - - } diff --git a/app/src/main/java/com/bin/david/smartchart/custom/StarPoint.java b/app/src/main/java/com/bin/david/smartchart/custom/StarPoint.java index 26585d5..e6ed98b 100644 --- a/app/src/main/java/com/bin/david/smartchart/custom/StarPoint.java +++ b/app/src/main/java/com/bin/david/smartchart/custom/StarPoint.java @@ -22,32 +22,8 @@ public StarPoint(int radius,int color){ this.mPath =new Path(); } - @Override - public void drawPoint(Canvas canvas, float x, float y, boolean isShowDefaultColor, Paint paint) { - paint.setStyle(Paint.Style.FILL); - paint.setColor(color); - mPath.reset(); - float[] floats = fivePoints(x,y-radius/2,radius); - for (int i = 0; i < floats.length - 1; i++) { - if(i == 0){ - mPath.moveTo(floats[i], floats[i += 1]); - }else { - mPath.lineTo(floats[i], floats[i += 1]); - } - } - mPath.close(); - canvas.drawPath(mPath,paint); - } - @Override - public float getWidth() { - return radius; - } - @Override - public float getHeight() { - return radius; - } /** * 五角星Path @@ -71,4 +47,21 @@ public static float[] fivePoints(float xA, float yA, int rFive) { float[] floats = new float[]{xA, yA, xD, yD,xB, yB, xE, yE, xC, yC}; return floats; } + + @Override + public void drawPoint(Canvas canvas, float x, float y, int position, boolean isShowDefaultColor, Paint paint) { + paint.setStyle(Paint.Style.FILL); + paint.setColor(color); + mPath.reset(); + float[] floats = fivePoints(x,y-radius/2,radius); + for (int i = 0; i < floats.length - 1; i++) { + if(i == 0){ + mPath.moveTo(floats[i], floats[i += 1]); + }else { + mPath.lineTo(floats[i], floats[i += 1]); + } + } + mPath.close(); + canvas.drawPath(mPath,paint); + } } diff --git a/app/src/main/java/com/bin/david/smartchart/helper/DrawHelper.java b/app/src/main/java/com/bin/david/smartchart/helper/DrawHelper.java new file mode 100644 index 0000000..f175224 --- /dev/null +++ b/app/src/main/java/com/bin/david/smartchart/helper/DrawHelper.java @@ -0,0 +1,785 @@ +package com.bin.david.smartchart.helper; + +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.DashPathEffect; +import android.graphics.Paint; +import android.graphics.Path; +import android.graphics.PathEffect; +import android.graphics.PointF; +import android.graphics.PorterDuff; +import android.graphics.PorterDuffColorFilter; +import android.graphics.Rect; +import android.support.v4.content.ContextCompat; +import android.util.LruCache; +import android.view.Gravity; +import android.view.View; + +import com.bin.david.smartchart.R; +import com.bin.david.smartchart.view.BubbleMarkView; +import com.daivd.chart.component.axis.HorizontalAxis; +import com.daivd.chart.component.base.IAxis; +import com.daivd.chart.core.LineChart; +import com.daivd.chart.data.ChartData; +import com.daivd.chart.data.LineData; +import com.daivd.chart.data.format.IFormat; +import com.daivd.chart.data.style.FontStyle; +import com.daivd.chart.provider.barLine.LineProvider; +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.path.IPath; +import com.daivd.chart.provider.component.path.LinePath; +import com.daivd.chart.provider.component.point.IPoint; +import com.daivd.chart.provider.component.text.IText; +import com.daivd.chart.provider.component.tip.SingleLineBubbleTip; +import com.daivd.chart.utils.ColorUtils; +import com.daivd.chart.utils.DensityUtils; +import com.daivd.chart.utils.DrawUtils; + +import java.util.ArrayList; + +/** + * Created by huang on 2017/12/1. + */ + +public class DrawHelper { + + private LruCache lruCache; + private BitmapFactory.Options options = new BitmapFactory.Options(); + + private static DrawHelper helper; + + public static DrawHelper getInstance() { + if (helper == null) { + synchronized (DrawHelper.class) { + if (helper == null) { + helper = new DrawHelper(); + } + } + } + return helper; + } + + protected Bitmap getBitmap(Context context, int resID) { + Bitmap bitmap = lruCache.get(resID); + if (bitmap == null) { + bitmap = BitmapFactory.decodeResource(context.getResources(), resID, options); + if (bitmap != null) { + lruCache.put(resID, bitmap); + } + } + return bitmap; + } + + private DrawHelper() { + int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);// kB + int cacheSize = maxMemory / 16; + lruCache = new LruCache(cacheSize) { + @Override + protected int sizeOf(Integer key, Bitmap bitmap) { + return bitmap.getRowBytes() * bitmap.getHeight() / 1024;// KB + } + }; + } + + public static void drawSoilChart(final Context context, LineChart lineChart){ + lineChart.getLeftVerticalAxis().setDisplay(false); + ArrayList temp1 = new ArrayList<>(); + for (int i = 0; i < 24; i++) { + temp1.add((double) ((int) (Math.random() * 20)) + 20); + } + final ArrayList xDatas = new ArrayList<>(); + for (int i = 0; i < 24; i++) { + xDatas.add("11."+i ); + } + lineChart.getMatrixHelper().setWidthMultiple(3); + lineChart.setShowChartName(false); + lineChart.getLegend().setDisplay(false); + lineChart.setLineModel(LineChart.CURVE_MODEL); + final int lineWidth = DensityUtils.dp2px(context, 1.5f); + + final int dp10 = DensityUtils.dp2px(context, 10); + final int whiteColor = ContextCompat.getColor(context, android.R.color.white); + LineProvider provider = lineChart.getProvider(); + provider.getLineStyle().setWidth(lineWidth*1.3f); + LineData lineData1 = new LineData("土壤含水率", "%", whiteColor + , temp1); + provider.setStartZero(false); + HorizontalAxis horizontalAxis = lineChart.getHorizontalAxis(); + horizontalAxis.setAxisDirection(IAxis.AxisDirection.TOP); + horizontalAxis.getScaleStyle().setTextSpSize(context,12).setTextColor(whiteColor); + horizontalAxis.setShowAxisLine(false); + horizontalAxis.getScaleStyle().setPadding(dp10*2); + horizontalAxis.setGravity(Gravity.CENTER); + + horizontalAxis.isLine(false); + final int alphaColor = ColorUtils.changeAlpha(whiteColor,75); + lineChart.getProvider().setGrid(new IGrid() { + + @Override + public void drawGrid(Canvas canvas, float x, Rect rect, int perWidth, Paint paint) { + float centerX = x+perWidth/2; + paint.setStyle(Paint.Style.STROKE); + paint.setStrokeWidth(lineWidth); + paint.setColor(ContextCompat.getColor(context, R.color.soil_grid_color)); + canvas.drawLine(centerX, 0, centerX, rect.bottom, paint); + + } + + @Override + public void drawClickBg(Canvas canvas, PointF pointF, Rect rect, int perWidth, Paint paint) { + + } + + @Override + public void drawColumnContent(Canvas canvas, int position, Rect zoomRect, Rect rect, int perWidth, Paint paint) { + + } + }); + provider.setPoint(new IPoint() { + + public void drawPoint(Canvas canvas, float x, float y, int position, boolean isShowDefaultColor, Paint paint) { + if(position == xDatas.size()-2) { + paint.setColor(ContextCompat.getColor(context,R.color.soil_bg)); + paint.setStyle(Paint.Style.FILL); + canvas.drawCircle(x, y, dp10 / 2, paint); + paint.setColor(whiteColor); + paint.setStyle(Paint.Style.STROKE); + canvas.drawCircle(x, y, dp10 / 2, paint); + } + + } + }); + provider.setPath(new LinePath(){ + @Override + public void drawPath(Canvas canvas, Rect rect, Path path, int perWidth, Paint paint, float progress) { + paint.setColor(alphaColor); + Path alphaPath = new Path(path); + alphaPath.lineTo(rect.right-perWidth/2,rect.bottom); + alphaPath.lineTo(rect.left+perWidth/2,rect.bottom); + alphaPath.close(); + paint.setStyle(Paint.Style.FILL); + canvas.drawPath(alphaPath,paint); + paint.setStyle(Paint.Style.STROKE); + paint.setColor(whiteColor); + super.drawPath(canvas, rect, path, perWidth, paint, progress); + } + }); + ChartData chartData = new ChartData<>("要素分析", xDatas, lineData1); + lineChart.setChartData(chartData); + } + + /** + * 要素分析 + * + * @param context + * @param lineChart + */ + public static void drawFactorChart(final Context context, LineChart lineChart) { + lineChart.getLeftVerticalAxis().setDisplay(false); + ArrayList temp1 = new ArrayList<>(); + for (int i = 0; i < 24; i++) { + temp1.add((double) ((int) (Math.random() * 20)) + 20); + } + ArrayList xDatas = new ArrayList<>(); + for (int i = 0; i < 24; i++) { + xDatas.add(i + ""); + } + lineChart.getMatrixHelper().setWidthMultiple(3); + lineChart.setShowChartName(false); + lineChart.getLegend().setDisplay(false); + final int lineWidth = DensityUtils.dp2px(context, 1.5f); + lineChart.setLineModel(LineChart.CURVE_MODEL); + final int lineColor = ContextCompat.getColor(context, R.color.low_temp_color); + final int dp10 = DensityUtils.dp2px(context, 10); + final int fontSize = DensityUtils.sp2px(context, 13); + final int perColor = ContextCompat.getColor(context, R.color.temp_value_color); + final int axisColor = ContextCompat.getColor(context,R.color.factor_axis_color); + final int currentColor = ContextCompat.getColor(context,R.color.temp_text_color); + LineProvider provider = lineChart.getProvider(); + provider.getLineStyle().setWidth((float) (lineWidth)); + LineData lineData1 = new LineData("空气温度", "℃", lineColor + , temp1); + + provider.setStartZero(true); + HorizontalAxis horizontalAxis = lineChart.getHorizontalAxis(); + horizontalAxis.getScaleStyle().setTextSpSize(context,12).setTextColor(perColor); + horizontalAxis.getAxisStyle().setWidth(lineWidth).setColor(axisColor); + horizontalAxis.setGravity(Gravity.LEFT); + horizontalAxis.isLine(true); + horizontalAxis.setFormat(new IFormat() { + @Override + public String format(String s) { + return (s.length() ==1 ?"0"+s :s)+"时"; + } + }); + + provider.setText(new IText() { + + public void drawText(Canvas canvas, String value, float x, float y, int position, int line, Paint paint) { + paint.setTextAlign(Paint.Align.CENTER); + paint.setStyle(Paint.Style.FILL); + paint.setTextSize(fontSize); + paint.setColor(currentColor); + int textSize = DrawUtils.getTextHeight(paint); + int dis = dp10 / 2 + textSize; + canvas.drawText(value + "℃", x, y + dis, paint); + } + }); + lineChart.getProvider().setGrid(new IGrid() { + @Override + public void drawGrid(Canvas canvas, float x, Rect rect, int perWidth, Paint paint) { + paint.setStyle(Paint.Style.STROKE); + paint.setStrokeWidth(lineWidth); + paint.setColor(ContextCompat.getColor(context, R.color.factor_grid_color)); + canvas.drawLine(x + perWidth / 2, rect.top, x + perWidth / 2, rect.bottom, paint); + } + + @Override + public void drawClickBg(Canvas canvas, PointF pointF, Rect rect, int perWidth, Paint paint) { + + } + + @Override + public void drawColumnContent(Canvas canvas, int position, Rect zoomRect, Rect rect, int perWidth, Paint paint) { + + } + }); + provider.setPoint(new IPoint() { + @Override + public void drawPoint(Canvas canvas, float x, float y, int position, boolean isShowDefaultColor, Paint paint) { + int oldColor = paint.getColor(); + paint.setColor(Color.WHITE); + paint.setStyle(Paint.Style.FILL); + canvas.drawCircle(x, y, dp10 / 2, paint); + paint.setColor(oldColor); + paint.setStyle(Paint.Style.STROKE); + canvas.drawCircle(x, y, dp10 / 2, paint); + + } + }); + ChartData chartData = new ChartData<>("要素分析", xDatas, lineData1); + lineChart.setChartData(chartData); + } + + /** + * 绘制观测站地温 + */ + public static void drawGroundTempChart(final Context context, LineChart lineChart) { + final ArrayList temp1 = new ArrayList<>(); + ArrayList temp2 = new ArrayList<>(); + ArrayList temp3 = new ArrayList<>(); + + for (int i = 0; i < 6; i++) { + temp1.add((double) ((int) (Math.random() * 10)) + 30); + } + for (int i = 0; i < 6; i++) { + temp2.add((double) ((int) (Math.random() * 10)) + 20); + } + for (int i = 0; i < 6; i++) { + temp3.add((double) ((int) (Math.random() * 10)) + 10); + } + final ArrayList xDatas = new ArrayList<>(); + for (int i = 0; i < 6; i++) { + xDatas.add(i + ""); + } + lineChart.setShowChartName(false); + lineChart.getLegend().setDisplay(false); + lineChart.setLineModel(LineChart.CURVE_MODEL); + LineData lineData1 = new LineData("5cm", "℃", + ContextCompat.getColor(context, R.color.ground_5cm), temp1); + LineData lineData2 = new LineData("10cm", "℃", + ContextCompat.getColor(context, R.color.ground_10cm), temp2); + LineData lineData3 = new LineData("20cm", "℃", + ContextCompat.getColor(context, R.color.ground_20cm), temp3); + ChartData chartData = new ChartData<>("地温", xDatas, lineData1, lineData2, lineData3); + LineProvider provider = lineChart.getProvider(); + lineChart.getHorizontalAxis().setDisplay(false); + lineChart.getLeftVerticalAxis().setDisplay(false); + provider.setArea(true); + provider.setAreaAlpha(255); + provider.setStartZero(true); + provider.setChartPercent(0.8f); + provider.addLevelLine(getLevelLine(context, temp1.get(0),lineData1.getName())); + provider.addLevelLine(getLevelLine(context, temp2.get(0),lineData2.getName())); + provider.addLevelLine(getLevelLine(context, temp3.get(0),lineData3.getName())); + provider.setMarkView(new BubbleMarkView(context, ContextCompat.getColor(context, R.color.ground_mark_text_color))); + Paint paint = new Paint(); + paint.setAntiAlias(true); + paint.setTextSize(com.daivd.chart.utils.DensityUtils.sp2px(context, 13)); + paint.setStyle(Paint.Style.FILL); + paint.setColor(ContextCompat.getColor(context, R.color.ground_mark_text_color)); + provider.setTip(new SingleLineBubbleTip(context, R.mipmap.round, R.mipmap.transparent, paint + ) { + @Override + public boolean isShowTip(LineData lineData, int position) { + if (position == xDatas.size() - 2) { + return true; + } + return false; + } + + @Override + public String format(LineData lineData, int position) { + double temp = lineData.getChartYDataList().get(position); + return temp + lineData.getUnit(); + } + }); + lineChart.setChartData(chartData); + + } + + private static ILevel getLevelLine(final Context context, final double value, final String val) { + + final int levelColor = ContextCompat.getColor(context, R.color.ground_level_color); + return new ILevel() { + @Override + public int getAxisDirection() { + return IAxis.AxisDirection.LEFT; + } + + @Override + public void drawLevel(Canvas canvas, Rect rect, float y, Paint paint) { + paint.setColor(levelColor); + paint.setTextSize(DensityUtils.sp2px(context, 12)); + paint.setTextAlign(Paint.Align.LEFT); + canvas.drawText(val , rect.left + 10, y + DrawUtils.getTextHeight(paint), paint); + } + + @Override + public double getValue() { + return value; + } + + }; + + } + + + /** + * 绘制观测站冻土 + */ + public static void drawFrozenSoilChart(final Context context, LineChart lineChart) { + lineChart.getLeftVerticalAxis().setDisplay(false); + ArrayList temp1 = new ArrayList<>(); + for (int i = 0; i < 24; i++) { + temp1.add((double) ((int) (Math.random() * 20)) + 20); + } + ArrayList xDatas = new ArrayList<>(); + for (int i = 0; i < 24; i++) { + xDatas.add(i + ""); + } + lineChart.setShowChartName(false); + lineChart.getLegend().setDisplay(false); + final int lineWidth = DensityUtils.dp2px(context, 2f); + lineChart.setLineModel(LineChart.CURVE_MODEL); + final int lineColor = ContextCompat.getColor(context, R.color.frozen_line_color); + final int crossColor = ContextCompat.getColor(context, R.color.frozen_cross_color); + final int shadowColor = ContextCompat.getColor(context, R.color.frozen_shadow_color); + LineProvider provider = lineChart.getProvider(); + provider.getLineStyle().setWidth((float) (lineWidth * 1.2)); + LineData lineData1 = new LineData("冻土", "cm", lineColor + , temp1); + + provider.setStartZero(true); + HorizontalAxis horizontalAxis = lineChart.getHorizontalAxis(); + horizontalAxis.getScaleStyle().setTextColor(lineColor); + horizontalAxis.setGravity(Gravity.LEFT); + horizontalAxis.isLine(true); + horizontalAxis.getAxisStyle().setColor(crossColor).setWidth(lineWidth); + provider.setMarkView(new BubbleMarkView(context, ContextCompat.getColor(context, R.color.frozen_mark_text_color))); + lineChart.setLayerType(View.LAYER_TYPE_SOFTWARE, null); + provider.setCross(new ICross() { + @Override + public void drawCross(Canvas canvas, PointF pointF, Rect rect, Paint paint) { + paint.setColor(lineColor); + paint.setStyle(Paint.Style.FILL); + canvas.drawCircle(pointF.x, pointF.y, lineWidth * 2, paint); + paint.setStyle(Paint.Style.STROKE); + paint.setStrokeWidth(lineWidth); + paint.setColor(crossColor); + canvas.drawLine(pointF.x, pointF.y, pointF.x, rect.bottom, paint); + } + }); + provider.setPath(new IPath() { + @Override + public void drawPath(Canvas canvas, Rect rect, Path path, int perWidth, Paint paint, float progress) { + + paint.setShadowLayer(40, 10, 50, shadowColor); + canvas.drawPath(path, paint); + paint.clearShadowLayer(); + } + }); + ChartData chartData = new ChartData<>("观测站", xDatas, lineData1); + lineChart.setChartData(chartData); + } + + /** + * 绘制天气 + * + * @param context + */ + public static void drawWeatherChart(final Context context, LineChart lineChart) { + ArrayList temp1 = new ArrayList<>(); + for (int i = 0; i < 7; i++) { + temp1.add((double) ((int) (Math.random() * 20)) + 20); + } + ArrayList temp2 = new ArrayList<>(); + for (int i = 0; i < 7; i++) { + temp2.add((double) ((int) (Math.random() * 20))); + } + ArrayList xDatas = new ArrayList<>(); + for (int i = 0; i < 7; i++) { + xDatas.add(""); + } + lineChart.getMatrixHelper().setWidthMultiple(7/5f); + lineChart.setShowChartName(false); + lineChart.getLegend().setDisplay(false); + final android.graphics.Point selectPosition = new android.graphics.Point(1, 0); + final int lineWidth = DensityUtils.dp2px(context, 1.5f); + final int dp10 = DensityUtils.dp2px(context, 10); + final int fontSize = DensityUtils.sp2px(context, 13); + final int clickColor = ContextCompat.getColor(context, R.color.temp_click_text_color); + final int perColor = ContextCompat.getColor(context, R.color.temp_value_color); + final int currentColor = ContextCompat.getColor(context, R.color.temp_text_color); + final PorterDuffColorFilter colorFilter = new PorterDuffColorFilter(clickColor, PorterDuff.Mode.SRC_IN); + + FontStyle.setDefaultTextSpSize(context, 14); + LineData lineData1 = new LineData("温度1", "℃", + ContextCompat.getColor(context, R.color.high_temp_color), temp1); + LineData lineData2 = new LineData("温度2", "℃", + ContextCompat.getColor(context, R.color.low_temp_color), temp2); + ChartData chartData = new ChartData<>("天气", xDatas, lineData1, lineData2); + lineChart.setLineModel(LineChart.CURVE_MODEL); + lineChart.getHorizontalAxis().setDisplay(false); + lineChart.getLeftVerticalAxis().setDisplay(false); + LineProvider provider = lineChart.getProvider(); + provider.getLineStyle().setWidth(lineWidth); + provider.setStartZero(false); + provider.setChartPercent(0.37f); + provider.setPoint(new IPoint() { + @Override + public void drawPoint(Canvas canvas, float x, float y, int position, boolean isShowDefaultColor, Paint paint) { + if (position == selectPosition.x) { + paint.setStyle(Paint.Style.FILL); + canvas.drawCircle(x, y, dp10 / 2, paint); + } else { + int oldColor = paint.getColor(); + paint.setColor(Color.WHITE); + paint.setStyle(Paint.Style.FILL); + canvas.drawCircle(x, y, dp10 / 2, paint); + paint.setColor(oldColor); + paint.setStyle(Paint.Style.STROKE); + canvas.drawCircle(x, y, dp10 / 2, paint); + } + } + }); + provider.setText(new IText() { + @Override + public void drawText(Canvas canvas, String value, float x, float y, int position, int line, Paint paint) { + paint.setTextAlign(Paint.Align.CENTER); + paint.setStyle(Paint.Style.FILL); + paint.setTextSize(fontSize); + paint.setColor(perColor); + int textSize = DrawUtils.getTextHeight(paint); + int dis = dp10 / 2 + textSize; + canvas.drawText(value + "℃", x, line == 0 ? y - dis + textSize / 2 : y + dis, paint); + } + }); + + provider.setPath(new IPath() { + @Override + public void drawPath(Canvas canvas, Rect rect, Path path, int perWidth, Paint paint, float progress) { + if (progress != 1) { + canvas.save(); + canvas.clipRect(rect.left, rect.top, rect.width() * progress, rect.bottom); + } + canvas.save(); + DashPathEffect effects = new DashPathEffect(new float[]{1, 2, 4, 8}, 1); + canvas.clipRect(rect.left, rect.top, rect.left + perWidth * 3 / 2, rect.bottom); + paint.setPathEffect(effects); + canvas.drawPath(path, paint); + canvas.restore(); + canvas.save(); + paint.setPathEffect(new PathEffect()); + canvas.clipRect(rect.left + perWidth * 3 / 2, rect.top, rect.right, rect.bottom); + canvas.drawPath(path, paint); + canvas.restore(); + if (progress != 1) { + canvas.restore(); + } + } + }); + final Rect imgRect = new Rect(); + final Rect drawRect = new Rect(); + lineChart.getProvider().setGrid(new IGrid() { + PointF pointF = new PointF(); + + @Override + public void drawGrid(Canvas canvas, float x, Rect rect, int perWidth, Paint paint) { + paint.setStyle(Paint.Style.STROKE); + paint.setStrokeWidth(lineWidth); + paint.setColor(ContextCompat.getColor(context, R.color.temp_grid_color)); + canvas.drawLine(x + perWidth / 2, rect.top, x + perWidth / 2, rect.bottom, paint); + } + + @Override + public void drawClickBg(Canvas canvas, PointF pointF, Rect rect, int perWidth, Paint paint) { + if (pointF != null) { + int position; + if (this.pointF.x != pointF.x && this.pointF.y != pointF.y) { + this.pointF.set(pointF); + position = (int) ((pointF.x - rect.left) / perWidth); + selectPosition.x = position; + } else { + position = selectPosition.x; + } + int left = rect.left + position * perWidth; + paint.setColor(ContextCompat.getColor(context, R.color.temp_click_bg_color)); + paint.setStyle(Paint.Style.FILL); + canvas.drawRect(left, rect.top, left + perWidth, rect.bottom, paint); + } + } + + @Override + public void drawColumnContent(Canvas canvas, int position, Rect zoomRect, Rect rect, int perWidth, Paint paint) { + + int left = zoomRect.left + perWidth * position; + int right = left + perWidth; + if (rect.contains(left, rect.centerY()) || rect.contains(right, rect.centerY())) { + int centerX = (left + right) / 2; + paint.setStyle(Paint.Style.FILL); + if (position == selectPosition.x) { + paint.setColor(clickColor); + } else if (position == 0) { + paint.setColor(perColor); + } else { + paint.setColor(currentColor); + } + paint.setTextSize(fontSize); + paint.setTextAlign(Paint.Align.CENTER); + canvas.drawText("今天", centerX, DrawUtils.getTextCenterY(dp10 * 2, paint), paint); + canvas.drawText("12/01", centerX, DrawUtils.getTextCenterY((int) (dp10 * 3.5), paint), paint); + canvas.drawText("晴", centerX, DrawUtils.getTextCenterY(dp10 * 6, paint), paint); + drawBitmap(canvas, centerX, (int) (dp10 * 9.3), R.mipmap.sun, paint, position == selectPosition.x); + if (position % 2 == 0) { + canvas.drawText("西北风", centerX, DrawUtils.getTextCenterY((int) (dp10 * 12.3), paint), paint); + canvas.drawText("3级", centerX, DrawUtils.getTextCenterY((int) (dp10 * 12.5) + DrawUtils.getTextHeight(paint), paint), paint); + } else { + canvas.drawText("西北风", centerX, DrawUtils.getTextCenterY((int) (dp10 * 13.1), paint), paint); + } + canvas.drawText("微风", centerX, DrawUtils.getTextCenterY(zoomRect.bottom - (int) (dp10 * 3.2), paint), paint); + drawBitmap(canvas, centerX, (int) (zoomRect.bottom - dp10 * 6.2), R.mipmap.wind, paint, false); + drawBitmap(canvas, centerX, (int) (zoomRect.bottom - dp10 * 10.4), R.mipmap.rain, paint, position == selectPosition.x); + canvas.drawText("晴", centerX, DrawUtils.getTextCenterY(zoomRect.bottom - (int) (dp10 * 13.5), paint), paint); + } + } + + private void drawBitmap(Canvas canvas, int x, int y, int drawableID, Paint paint, boolean isColorFilter) { + + Bitmap bitmap = DrawHelper.getInstance().getBitmap(context, drawableID); + int width = bitmap.getWidth(); + int height = bitmap.getHeight(); + imgRect.set(0, 0, width, height); + int imgHalfWidth = (int) (dp10 * 1.25); + drawRect.set(x - imgHalfWidth, y - imgHalfWidth, x + imgHalfWidth, y + imgHalfWidth); + if (isColorFilter) { + paint.setColorFilter(colorFilter); + canvas.drawBitmap(bitmap, imgRect, drawRect, paint); + paint.setColorFilter(null); + } else { + canvas.drawBitmap(bitmap, imgRect, drawRect, paint); + } + } + }); + lineChart.setChartData(chartData); + lineChart.startChartAnim(1000); + } + /** + * 绘制首页天气 + * + * @param context + */ + public static void drawHomeWeatherChart(final Context context, LineChart lineChart) { + ArrayList temp1 = new ArrayList<>(); + for (int i = 0; i < 7; i++) { + temp1.add((double) ((int) (Math.random() * 20)) + 20); + } + ArrayList temp2 = new ArrayList<>(); + for (int i = 0; i < 7; i++) { + temp2.add((double) ((int) (Math.random() * 20))); + } + ArrayList xDatas = new ArrayList<>(); + for (int i = 0; i < 7; i++) { + xDatas.add(""); + } + lineChart.getMatrixHelper().setWidthMultiple(7/5f); + lineChart.setShowChartName(false); + lineChart.getLegend().setDisplay(false); + final android.graphics.Point selectPosition = new android.graphics.Point(1, 0); + final int lineWidth = DensityUtils.dp2px(context, 1.5f); + final int dp10 = DensityUtils.dp2px(context, 10); + final int fontSize = DensityUtils.sp2px(context, 13); + final int clickColor = ContextCompat.getColor(context, R.color.temp_click_text_color); + final int perColor = ContextCompat.getColor(context, R.color.temp_value_color); + final int currentColor = ContextCompat.getColor(context, R.color.temp_text_color); + final PorterDuffColorFilter colorFilter = new PorterDuffColorFilter(clickColor, PorterDuff.Mode.SRC_IN); + + FontStyle.setDefaultTextSpSize(context, 14); + LineData lineData1 = new LineData("温度1", "℃", + ContextCompat.getColor(context, R.color.high_temp_color), temp1); + LineData lineData2 = new LineData("温度2", "℃", + ContextCompat.getColor(context, R.color.low_temp_color), temp2); + ChartData chartData = new ChartData<>("天气", xDatas, lineData1, lineData2); + lineChart.setLineModel(LineChart.CURVE_MODEL); + lineChart.getHorizontalAxis().setDisplay(false); + lineChart.getLeftVerticalAxis().setDisplay(false); + LineProvider provider = lineChart.getProvider(); + provider.getLineStyle().setWidth(lineWidth); + provider.setStartZero(false); + provider.setChartPercent(0.37f); + provider.setPoint(new IPoint() { + @Override + public void drawPoint(Canvas canvas, float x, float y, int position, boolean isShowDefaultColor, Paint paint) { + if (position == selectPosition.x) { + paint.setStyle(Paint.Style.FILL); + canvas.drawCircle(x, y, dp10 / 2, paint); + } else { + int oldColor = paint.getColor(); + paint.setColor(Color.WHITE); + paint.setStyle(Paint.Style.FILL); + canvas.drawCircle(x, y, dp10 / 2, paint); + paint.setColor(oldColor); + paint.setStyle(Paint.Style.STROKE); + canvas.drawCircle(x, y, dp10 / 2, paint); + } + } + }); + provider.setText(new IText() { + @Override + public void drawText(Canvas canvas, String value, float x, float y, int position, int line, Paint paint) { + paint.setTextAlign(Paint.Align.CENTER); + paint.setStyle(Paint.Style.FILL); + paint.setTextSize(fontSize); + paint.setColor(perColor); + int textSize = DrawUtils.getTextHeight(paint); + int dis = dp10 / 2 + textSize; + canvas.drawText(value + "℃", x, line == 0 ? y - dis + textSize / 2 : y + dis, paint); + } + }); + + provider.setPath(new IPath() { + @Override + public void drawPath(Canvas canvas, Rect rect, Path path, int perWidth, Paint paint, float progress) { + if (progress != 1) { + canvas.save(); + canvas.clipRect(rect.left, rect.top, rect.width() * progress, rect.bottom); + } + canvas.save(); + DashPathEffect effects = new DashPathEffect(new float[]{1, 2, 4, 8}, 1); + canvas.clipRect(rect.left, rect.top, rect.left + perWidth * 3 / 2, rect.bottom); + paint.setPathEffect(effects); + canvas.drawPath(path, paint); + canvas.restore(); + canvas.save(); + paint.setPathEffect(new PathEffect()); + canvas.clipRect(rect.left + perWidth * 3 / 2, rect.top, rect.right, rect.bottom); + canvas.drawPath(path, paint); + canvas.restore(); + if (progress != 1) { + canvas.restore(); + } + } + }); + final Rect imgRect = new Rect(); + final Rect drawRect = new Rect(); + lineChart.getProvider().setGrid(new IGrid() { + PointF pointF = new PointF(); + + @Override + public void drawGrid(Canvas canvas, float x, Rect rect, int perWidth, Paint paint) { + /*paint.setStyle(Paint.Style.STROKE); + paint.setStrokeWidth(lineWidth); + paint.setColor(ContextCompat.getColor(context, R.color.temp_grid_color)); + canvas.drawLine(x + perWidth / 2, rect.top, x + perWidth / 2, rect.bottom, paint);*/ + } + + @Override + public void drawClickBg(Canvas canvas, PointF pointF, Rect rect, int perWidth, Paint paint) { + if (pointF != null) { + int position; + if (this.pointF.x != pointF.x && this.pointF.y != pointF.y) { + this.pointF.set(pointF); + position = (int) ((pointF.x - rect.left) / perWidth); + selectPosition.x = position; + } else { + position = selectPosition.x; + } + int left = rect.left + position * perWidth; + paint.setColor(ContextCompat.getColor(context, R.color.temp_click_bg_color)); + paint.setStyle(Paint.Style.FILL); + canvas.drawRect(left, rect.top, left + perWidth, rect.bottom, paint); + } + } + + @Override + public void drawColumnContent(Canvas canvas, int position, Rect zoomRect, Rect rect, int perWidth, Paint paint) { + + int left = zoomRect.left + perWidth * position; + int right = left + perWidth; + if (rect.contains(left, rect.centerY()) || rect.contains(right, rect.centerY())) { + int centerX = (left + right) / 2; + paint.setStyle(Paint.Style.FILL); + if (position == selectPosition.x) { + paint.setColor(clickColor); + } else if (position == 0) { + paint.setColor(perColor); + } else { + paint.setColor(currentColor); + } + paint.setTextSize(fontSize); + paint.setTextAlign(Paint.Align.CENTER); + int textHeight = DrawUtils.getTextHeight(paint); + canvas.drawText("12/01", centerX, DrawUtils.getTextCenterY((int) (dp10 * 1.3f)+textHeight/2, paint), paint); + canvas.drawText("今天", centerX, DrawUtils.getTextCenterY((int) (dp10 * 2.2+textHeight), paint), paint); + canvas.drawText("晴", centerX, DrawUtils.getTextCenterY((int) (dp10 * 8.7f), paint), paint); + drawBitmap(canvas, centerX, (int) (dp10 * 6.2), R.mipmap.sun, paint, position == selectPosition.x); + /* if (position % 2 == 0) { + canvas.drawText("西北风", centerX, DrawUtils.getTextCenterY((int) (dp10 * 12.3), paint), paint); + canvas.drawText("3级", centerX, DrawUtils.getTextCenterY((int) (dp10 * 12.5) + DrawUtils.getTextHeight(paint), paint), paint); + } else { + canvas.drawText("西北风", centerX, DrawUtils.getTextCenterY((int) (dp10 * 13.1), paint), paint); + }*/ + canvas.drawText("微风", centerX, DrawUtils.getTextCenterY(zoomRect.bottom - (int) (dp10 * 2.2), paint), paint); + drawBitmap(canvas, centerX, (int) (zoomRect.bottom - dp10 * 4.3), R.mipmap.wind, paint, false); + drawBitmap(canvas, centerX, (int) (zoomRect.bottom - dp10 * 9.2), R.mipmap.rain, paint, position == selectPosition.x); + canvas.drawText("晴", centerX, DrawUtils.getTextCenterY(zoomRect.bottom - (int) (dp10 * 6.8), paint), paint); + } + } + + private void drawBitmap(Canvas canvas, int x, int y, int drawableID, Paint paint, boolean isColorFilter) { + + Bitmap bitmap = DrawHelper.getInstance().getBitmap(context, drawableID); + int width = bitmap.getWidth(); + int height = bitmap.getHeight(); + imgRect.set(0, 0, width, height); + int imgHalfWidth = (int) (dp10 * 1.25); + drawRect.set(x - imgHalfWidth, y - imgHalfWidth, x + imgHalfWidth, y + imgHalfWidth); + if (isColorFilter) { + paint.setColorFilter(colorFilter); + canvas.drawBitmap(bitmap, imgRect, drawRect, paint); + paint.setColorFilter(null); + } else { + canvas.drawBitmap(bitmap, imgRect, drawRect, paint); + } + } + }); + lineChart.setChartData(chartData); + lineChart.startChartAnim(1000); + } + +} diff --git a/app/src/main/java/com/bin/david/smartchart/view/BubbleMarkView.java b/app/src/main/java/com/bin/david/smartchart/view/BubbleMarkView.java new file mode 100644 index 0000000..b7def9e --- /dev/null +++ b/app/src/main/java/com/bin/david/smartchart/view/BubbleMarkView.java @@ -0,0 +1,57 @@ +package com.bin.david.smartchart.view; + + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.Rect; + +import com.bin.david.smartchart.R; +import com.daivd.chart.data.BarData; +import com.daivd.chart.provider.component.mark.IMark; +import com.daivd.chart.provider.component.tip.SingleLineBubbleTip; +import com.daivd.chart.utils.DensityUtils; + +/** + * Created by huang on 2017/9/28. + */ + +public class BubbleMarkView implements IMark { + + private SingleLineBubbleTip bubbleTip; + private Paint paint; + + public BubbleMarkView(Context context, int color) { + paint = new Paint(); + paint.setAntiAlias(true); + paint.setTextSize(DensityUtils.sp2px(context,13)); + paint.setStyle(Paint.Style.FILL); + paint.setColor(color); + bubbleTip = new SingleLineBubbleTip(context, R.mipmap.round,R.mipmap.transparent,paint){ + + @Override + public boolean isShowTip(String s,int position) { + return true; + } + + @Override + public String format(String s, int position) { + return s; + } + }; + bubbleTip.setHorizontalPadding(DensityUtils.dp2px(context,10)); + } + + + + public Paint getPaint() { + return paint; + } + + @Override + public void drawMark(Canvas canvas, float x, float y, Rect rect, String content, BarData data, int position) { + + String text =data.getChartYDataList().get(position) + data.getUnit(); + bubbleTip.drawTip(canvas, x, y, rect, text,position); + } +} diff --git a/app/src/main/res/layout/activity_test.xml b/app/src/main/res/layout/activity_test.xml new file mode 100644 index 0000000..78f7abd --- /dev/null +++ b/app/src/main/res/layout/activity_test.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + diff --git a/app/src/main/res/mipmap-xhdpi/rain.png b/app/src/main/res/mipmap-xhdpi/rain.png new file mode 100644 index 0000000..d86ca0b Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/rain.png differ diff --git a/app/src/main/res/mipmap-xhdpi/round.9.png b/app/src/main/res/mipmap-xhdpi/round.9.png new file mode 100644 index 0000000..4ff6533 Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/round.9.png differ diff --git a/app/src/main/res/mipmap-xhdpi/sun.png b/app/src/main/res/mipmap-xhdpi/sun.png new file mode 100644 index 0000000..af670c6 Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/sun.png differ diff --git a/app/src/main/res/mipmap-xhdpi/transparent.png b/app/src/main/res/mipmap-xhdpi/transparent.png new file mode 100644 index 0000000..54c77a6 Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/transparent.png differ diff --git a/app/src/main/res/mipmap-xhdpi/wind.png b/app/src/main/res/mipmap-xhdpi/wind.png new file mode 100644 index 0000000..7bbe892 Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/wind.png differ diff --git a/app/src/main/res/mipmap-xxhdpi/triangle.png b/app/src/main/res/mipmap-xxhdpi/triangle.png new file mode 100644 index 0000000..82bed69 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/triangle.png differ diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 62ae6b5..900b53e 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -25,4 +25,33 @@ #079df9 #FFFFFF #f6f6f6 + + #ffbd2d + #2196f3 + #9b9b9b + #fafafa + #f5fff4 + #417505 + #4a4a4a + + + #20999999 + #c2f2ff + #1859a8 + #473C8B + + + #95dde8 + #b8acf3 + #ef97c4 + #4daebd + #5742bb + #ef97c4 + #b35886 + #877fae + + #d8d8d8 + #f5f5f5 + #0ac775 + #10FFFFFF diff --git a/chart/src/main/java/com/daivd/chart/component/ChartTitle.java b/chart/src/main/java/com/daivd/chart/component/ChartTitle.java index 000c8e4..5edef58 100644 --- a/chart/src/main/java/com/daivd/chart/component/ChartTitle.java +++ b/chart/src/main/java/com/daivd/chart/component/ChartTitle.java @@ -18,7 +18,7 @@ public class ChartTitle extends PercentComponent implements IChartTitle private static final float MAX_PERCENT =0.4f; private FontStyle fontStyle= new FontStyle(); - + Path path = new Path(); @Override @@ -33,12 +33,13 @@ public void setPercent(float percent) { public void draw(Canvas canvas, String chartName, Paint paint) { fontStyle.fillPaint(paint); Paint.FontMetrics fontMetrics = paint.getFontMetrics(); + paint.setTextAlign(Paint.Align.LEFT); float textHeight = fontMetrics.descent - fontMetrics.ascent; int textWidth = (int)paint.measureText(chartName); Rect rect = getRect(); int startY = rect.centerY(); int startX = rect.centerX(); - Path path = new Path(); + path.rewind(); switch (direction) { case TOP: case BOTTOM: diff --git a/chart/src/main/java/com/daivd/chart/component/EmptyView.java b/chart/src/main/java/com/daivd/chart/component/EmptyView.java index f808368..124d5a6 100644 --- a/chart/src/main/java/com/daivd/chart/component/EmptyView.java +++ b/chart/src/main/java/com/daivd/chart/component/EmptyView.java @@ -49,6 +49,7 @@ public void computeRect(Rect chartRect) { @Override public void draw(Canvas canvas, String emptyTip, Paint paint) { fontStyle.fillPaint(paint); + paint.setTextAlign(Paint.Align.LEFT); Paint.FontMetrics fontMetrics = paint.getFontMetrics(); int textHeight = (int) (fontMetrics.descent - fontMetrics.ascent); int textWidth = (int) paint.measureText(emptyTip); diff --git a/chart/src/main/java/com/daivd/chart/component/Legend.java b/chart/src/main/java/com/daivd/chart/component/Legend.java index 9ab1246..56e275d 100644 --- a/chart/src/main/java/com/daivd/chart/component/Legend.java +++ b/chart/src/main/java/com/daivd/chart/component/Legend.java @@ -11,7 +11,9 @@ import com.daivd.chart.data.ColumnData; import com.daivd.chart.data.style.FontStyle; import com.daivd.chart.listener.OnClickLegendListener; +import com.daivd.chart.provider.component.point.ILegendPoint; import com.daivd.chart.provider.component.point.IPoint; +import com.daivd.chart.provider.component.point.LegendPoint; import com.daivd.chart.provider.component.point.Point; import java.util.List; @@ -23,19 +25,27 @@ public class Legend extends PercentComponent> implements ILegend { private FontStyle fontStyle; - private IPoint point; + private ILegendPoint point; private int padding = 10; private PointF pointF; private boolean isSelectColumn = true; private OnClickLegendListener onClickLegendListener; + private boolean isDisplay = true; public Legend(){ - Point p = new Point(); + LegendPoint p = new LegendPoint(); p.getPointStyle().setWidth(p.getPointStyle().getWidth()*2); point = p; fontStyle = new FontStyle(); } + @Override + public void computeRect(Rect chartRect) { + if(isDisplay) { + super.computeRect(chartRect); + } + } + /** * 绘制 * @param canvas 画布 @@ -44,55 +54,59 @@ public Legend(){ */ @Override public void draw(Canvas canvas, ChartData chartData, Paint paint) { - Rect legendRect = getRect(); - List columnDataList = chartData.getColumnDataList(); - int maxLegendNameLength = 0; - int columnDataSize = columnDataList.size(); - String maxLengthColumnName = null; - for(int i = 0;i 0?columnSize:1; - int rowSize = columnDataSize/columnSize; - rowSize = rowSize >0?rowSize:1; - int perHeight = (int) (textHeight + padding); - int perWidth = legendRect.width()/columnSize; - int offsetY = (legendRect.height()-perHeight*rowSize)/2; - offsetY = offsetY >0 ?offsetY:0; - int offsetX = columnDataSize< columnSize ? (columnSize - columnDataSize)*perWidth/2:0; - for(int i = 0;i columnDataList = chartData.getColumnDataList(); + int maxLegendNameLength = 0; + int columnDataSize = columnDataList.size(); + String maxLengthColumnName = null; + for (int i = 0; i < columnDataSize; i++) { + ColumnData columnData = columnDataList.get(i); + String name = columnData.getName(); + if (maxLegendNameLength < name.length()) { + maxLengthColumnName = name; + maxLegendNameLength = name.length(); } - pointF = null; - if (onClickLegendListener != null) { - onClickLegendListener.onClickLegend(columnData, this); + } + fontStyle.fillPaint(paint); + int textWidth = (int) paint.measureText(maxLengthColumnName);//文本长度 + Paint.FontMetrics fontMetrics = paint.getFontMetrics(); + float textHeight = fontMetrics.descent - fontMetrics.ascent; + int maxLegendLength = (int) (point.getWidth() + padding * 3 + textWidth); + int columnSize = legendRect.width() / maxLegendLength; //列 + columnSize = columnSize > 0 ? columnSize : 1; + int rowSize = columnDataSize / columnSize; + rowSize = rowSize > 0 ? rowSize : 1; + int perHeight = (int) (textHeight + padding); + int perWidth = legendRect.width() / columnSize; + int offsetY = (legendRect.height() - perHeight * rowSize) / 2; + offsetY = offsetY > 0 ? offsetY : 0; + int offsetX = columnDataSize < columnSize ? (columnSize - columnDataSize) * perWidth / 2 : 0; + for (int i = 0; i < columnDataList.size(); i++) { + int column = i % columnSize; + int row = i / columnSize; + int startX = offsetX + legendRect.left + column * perWidth + (perWidth - maxLegendLength) / 2; + int startY = legendRect.top + offsetY + row * perHeight; + C columnData = columnDataList.get(i); + String name = columnData.getName(); + float pointWidth = point.getWidth(); + float pointHeight = point.getHeight(); + if (pointF != null && isClickRect(startX - pointWidth, startX + perWidth, startY - padding / 2, startY + perHeight + padding / 2)) { + if (isSelectColumn) { + columnData.setDraw(!columnData.isDraw()); + } + pointF = null; + if (onClickLegendListener != null) { + onClickLegendListener.onClickLegend(columnData, this); + } } + paint.setColor(columnData.getColor()); + drawPoint(canvas, columnData.isDraw(), startX, (int) (startY - textHeight / 2 + pointHeight / 2), paint); + startX += pointWidth + padding; + drawText(canvas, startX, startY, name, paint); } - paint.setColor(columnData.getColor()); - drawPoint(canvas, columnData.isDraw(), startX, (int) (startY-textHeight/2+pointHeight/2), paint); - startX += pointWidth + padding; - drawText(canvas, startX, startY, name, paint); } } @@ -125,7 +139,7 @@ private void drawText(Canvas canvas, int startX, int startY, String content, Pa private void drawPoint(Canvas canvas,boolean isDraw,int x, int y, Paint paint){ float w = point.getWidth(); x += w/2; - point.drawPoint(canvas,x,y,!isDraw,paint); + point.drawPoint(canvas,x,y,0,!isDraw,paint); } @@ -162,7 +176,7 @@ public IPoint getPoint() { return point; } - public void setPoint(IPoint point) { + public void setPoint(ILegendPoint point) { this.point = point; } @Override @@ -170,5 +184,10 @@ public void setSelectColumn(boolean selectColumn) { isSelectColumn = selectColumn; } + @Override + public void setDisplay(boolean isDisplay) { + this.isDisplay = isDisplay; + } + } diff --git a/chart/src/main/java/com/daivd/chart/component/axis/BaseAxis.java b/chart/src/main/java/com/daivd/chart/component/axis/BaseAxis.java index 9736695..b5a89b8 100644 --- a/chart/src/main/java/com/daivd/chart/component/axis/BaseAxis.java +++ b/chart/src/main/java/com/daivd/chart/component/axis/BaseAxis.java @@ -32,6 +32,7 @@ public abstract class BaseAxis implements IAxis { protected int direction; protected boolean isLine; private IFormat format; + private boolean isDisplay = true; public void setDrawGrid(boolean drawGrid) { isDrawGrid = drawGrid; @@ -69,10 +70,18 @@ public void isLine(boolean isLine) { this.isLine = isLine; } + public boolean isDisplay() { + return isDisplay; + } + + + @Override public void draw(Canvas canvas, Rect rect, MatrixHelper helper, Paint paint, ChartData chartData) { - drawScale(canvas, rect, helper, paint, chartData); - drawAxis(canvas, rect, paint, chartData); + if(isDisplay) { + drawScale(canvas, rect, helper, paint, chartData); + drawAxis(canvas, rect, paint, chartData); + } } @@ -133,4 +142,9 @@ public boolean isShowAxisLine() { public void setShowAxisLine(boolean showAxisLine) { isShowAxisLine = showAxisLine; } + + @Override + public void setDisplay(boolean isShow) { + this.isDisplay = isShow; + } } diff --git a/chart/src/main/java/com/daivd/chart/component/axis/HorizontalAxis.java b/chart/src/main/java/com/daivd/chart/component/axis/HorizontalAxis.java index ea098fc..8bf189f 100644 --- a/chart/src/main/java/com/daivd/chart/component/axis/HorizontalAxis.java +++ b/chart/src/main/java/com/daivd/chart/component/axis/HorizontalAxis.java @@ -29,38 +29,43 @@ public HorizontalAxis() { private int textWidth; private int textHeight; private int rotateTextHeight; + private boolean isShowFullValue; //是否显示全文字 + private ScaleData scaleData; + @Override public void computeScale(ChartData chartData, Rect rect, Paint paint) { - ScaleData scaleData = chartData.getScaleData(); - scaleStyle.fillPaint(paint); - Paint.FontMetrics fontMetrics = paint.getFontMetrics(); - textHeight = (int) (fontMetrics.descent - fontMetrics.ascent); - int maxLength = 0; - String maxLengthXData = null; - for (String xData : chartData.getCharXDataList()) { - String formatData = formatData(xData); - if (maxLength < formatData.length()) { - maxLengthXData = formatData; - maxLength = formatData.length(); - } - } - textWidth = (int) paint.measureText(maxLengthXData); - //计算旋转的高宽 - int dis = textHeight; - if(isRotateAngle) { - int tempHeight = (int) Math.abs(textWidth *Math.sin(rotateAngle*Math.PI/180) - + textHeight*Math.cos(rotateAngle*Math.PI/180)); - int tempWidth = (int) Math.abs(textWidth *Math.cos(rotateAngle*Math.PI/180) - +textHeight*Math.sin(rotateAngle*Math.PI/180)); - rotateTextHeight = tempHeight; - dis += rotateTextHeight; - textWidth = tempWidth; - } - dis += (int) (scaleStyle.getPadding()*2 + axisStyle.getWidth()); - if (direction == AxisDirection.BOTTOM) { - scaleData.scaleRect.bottom = dis; - } else { - scaleData.scaleRect.top = dis; + if(isDisplay()) { + scaleData = chartData.getScaleData(); + scaleStyle.fillPaint(paint); + Paint.FontMetrics fontMetrics = paint.getFontMetrics(); + textHeight = (int) (fontMetrics.descent - fontMetrics.ascent); + int maxLength = 0; + String maxLengthXData = "1"; + for (String xData : chartData.getCharXDataList()) { + String formatData = formatData(xData); + if (maxLength < formatData.length()) { + maxLengthXData = formatData; + maxLength = formatData.length(); + } + } + textWidth = (int) paint.measureText(maxLengthXData); + //计算旋转的高宽 + int dis = textHeight; + if (isRotateAngle) { + int tempHeight = (int) Math.abs(textWidth * Math.sin(rotateAngle * Math.PI / 180) + + textHeight * Math.cos(rotateAngle * Math.PI / 180)); + int tempWidth = (int) Math.abs(textWidth * Math.cos(rotateAngle * Math.PI / 180) + + textHeight * Math.sin(rotateAngle * Math.PI / 180)); + rotateTextHeight = tempHeight; + dis += rotateTextHeight; + textWidth = tempWidth; + } + dis += (int) (scaleStyle.getPadding() * 2 + axisStyle.getWidth()); + if (direction == AxisDirection.BOTTOM) { + scaleData.scaleRect.bottom = dis; + } else { + scaleData.scaleRect.top = dis; + } } } @@ -89,7 +94,7 @@ protected void drawScale(Canvas canvas, Rect zoomRect, Rect rect, Paint paint, //留1px缓冲 if (startX >= rect.left-1 && startX<= rect.right+1) { if( i % filterMultiple == 0) { - drawText(canvas, content,startX, startY, paint); + drawText(canvas, content,startX, startY,i, paint); drawGrid(canvas, startX, rect, scaleData.scaleRect, paint); } } @@ -105,21 +110,27 @@ private int getGravityStartX(int left, int position, double perWidth) { } return startX; } - /** * 绘制文字 */ - private void drawText(Canvas canvas, String contentStr,int startX,float startY, Paint paint) { + private void drawText(Canvas canvas, String contentStr, int startX, float startY, int position, Paint paint) { String content = formatData(contentStr); scaleStyle.fillPaint(paint); - int width = (int) paint.measureText(content); - if(isRotateAngle){ + paint.setTextAlign(Paint.Align.CENTER); + if (isShowFullValue && position == 0) { + int width = (int) paint.measureText(content); + startX+= width/2; + } else if (isShowFullValue && position == scaleData.rowSize - 1) { + int width = (int) paint.measureText(content); + startX-= width/2; + } + if (isRotateAngle) { canvas.save(); - canvas.rotate(rotateAngle,startX,startY); - canvas.drawText(content,startX-width/2,startY+textHeight/2,paint); + canvas.rotate(rotateAngle, startX, startY); + canvas.drawText(content, startX, startY + textHeight / 2, paint); canvas.restore(); - }else { - canvas.drawText(content, startX-width/2,startY+textHeight/2, paint); + } else { + canvas.drawText(content, startX, startY + textHeight / 2, paint); } } @@ -173,4 +184,12 @@ public void setRotateAngle(int rotateAngle) { isRotateAngle = true; this.rotateAngle = rotateAngle; } + public boolean isShowFullValue() { + return isShowFullValue; + } + + public void setShowFullValue(boolean showFullValue) { + isShowFullValue = showFullValue; + } + } diff --git a/chart/src/main/java/com/daivd/chart/component/axis/VerticalAxis.java b/chart/src/main/java/com/daivd/chart/component/axis/VerticalAxis.java index 0ac6ffa..2c10967 100644 --- a/chart/src/main/java/com/daivd/chart/component/axis/VerticalAxis.java +++ b/chart/src/main/java/com/daivd/chart/component/axis/VerticalAxis.java @@ -23,6 +23,7 @@ public class VerticalAxis extends BaseAxis { private ScaleSetData scaleSetData = new ScaleSetData(); + public VerticalAxis(int direction) { this.direction = direction; } @@ -31,17 +32,19 @@ public VerticalAxis(int direction) { @Override public void computeScale(ChartData chartData, Rect rect, Paint paint) { - ScaleData scaleData = chartData.getScaleData(); - scaleData.resetScale(scaleSetData,direction); - scaleStyle.fillPaint(paint); - int length = Math.max(formatVerticalAxisData(scaleData.getMaxScaleValue(direction)).length(), - formatVerticalAxisData(scaleData.getMinScaleValue(direction)).length()); - int textHeight = (int) (paint.measureText("1", 0, 1) * length); - int dis = (int) (textHeight + scaleStyle.getPadding() + axisStyle.getWidth()); - if (direction == AxisDirection.LEFT) { - scaleData.scaleRect.left = dis; - } else { - scaleData.scaleRect.right = dis; + if(isDisplay()) { + ScaleData scaleData = chartData.getScaleData(); + scaleData.resetScale(scaleSetData, direction); + scaleStyle.fillPaint(paint); + int length = Math.max(formatVerticalAxisData(scaleData.getMaxScaleValue(direction)).length(), + formatVerticalAxisData(scaleData.getMinScaleValue(direction)).length()); + int textHeight = (int) (paint.measureText("1", 0, 1) * length); + int dis = (int) (textHeight + scaleStyle.getPadding() + axisStyle.getWidth()); + if (direction == AxisDirection.LEFT) { + scaleData.scaleRect.left = dis; + } else { + scaleData.scaleRect.right = dis; + } } } @@ -76,6 +79,7 @@ protected void drawScale(Canvas canvas, Rect zoomRect, Rect clipRect, Paint pain private void drawText(Canvas canvas, float startX, float startY, double value, Paint paint) { scaleStyle.fillPaint(paint); String content = formatVerticalAxisData(value); + paint.setTextAlign(Paint.Align.LEFT); canvas.drawText(content, startX, startY, paint); } @@ -132,4 +136,5 @@ public void setMaxValue(double maxValue) { public void setMinValue(double minValue) { this.scaleSetData.setMinValue(minValue); } + } diff --git a/chart/src/main/java/com/daivd/chart/component/base/IAxis.java b/chart/src/main/java/com/daivd/chart/component/base/IAxis.java index 2a6c8e5..e8eeb51 100644 --- a/chart/src/main/java/com/daivd/chart/component/base/IAxis.java +++ b/chart/src/main/java/com/daivd/chart/component/base/IAxis.java @@ -21,6 +21,7 @@ public interface IAxis { void setAxisDirection(int axisDirection); void setFormat(IFormat format); IFormat getFormat(); + void setDisplay(boolean isShow); /** * Created by huangYanBin on 2017/9/26. diff --git a/chart/src/main/java/com/daivd/chart/component/base/ILegend.java b/chart/src/main/java/com/daivd/chart/component/base/ILegend.java index f79856b..58a1303 100644 --- a/chart/src/main/java/com/daivd/chart/component/base/ILegend.java +++ b/chart/src/main/java/com/daivd/chart/component/base/ILegend.java @@ -5,6 +5,7 @@ import com.daivd.chart.data.ChartData; import com.daivd.chart.data.ColumnData; import com.daivd.chart.data.style.FontStyle; +import com.daivd.chart.provider.component.point.ILegendPoint; import com.daivd.chart.provider.component.point.IPoint; import com.daivd.chart.listener.OnClickLegendListener; @@ -37,7 +38,9 @@ public interface ILegend extends IComponent> 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; + } +}