From bb077f98145a7ff3998ef1a9192ca801d3292c5d Mon Sep 17 00:00:00 2001 From: Arman Kolahan Date: Sat, 10 Apr 2021 15:44:48 +0200 Subject: [PATCH] marker single tap listener --- .../mpchartexample/MultiLineChartActivity.java | 8 ++++++++ .../mpchartexample/fragments/BarChartFrag.java | 5 +++++ .../mikephil/charting/components/IMarker.java | 9 +++++++++ .../charting/components/MarkerImage.java | 12 +++++++++++- .../charting/components/MarkerView.java | 17 ++++++++++++++--- .../listener/BarLineChartTouchListener.java | 4 +++- .../listener/OnChartGestureListener.java | 7 +++++++ .../listener/PieRadarChartTouchListener.java | 4 +++- 8 files changed, 60 insertions(+), 6 deletions(-) diff --git a/MPChartExample/src/main/java/com/xxmassdeveloper/mpchartexample/MultiLineChartActivity.java b/MPChartExample/src/main/java/com/xxmassdeveloper/mpchartexample/MultiLineChartActivity.java index 11d69d8dae..db767ebcae 100644 --- a/MPChartExample/src/main/java/com/xxmassdeveloper/mpchartexample/MultiLineChartActivity.java +++ b/MPChartExample/src/main/java/com/xxmassdeveloper/mpchartexample/MultiLineChartActivity.java @@ -321,6 +321,11 @@ public void onChartSingleTapped(MotionEvent me) { Log.i("SingleTap", "Chart single-tapped."); } + @Override + public void onMarkerSingleTapped(MotionEvent me) { + Log.i("MarkerSingleTap", "Marker single-tapped."); + } + @Override public void onChartFling(MotionEvent me1, MotionEvent me2, float velocityX, float velocityY) { Log.i("Fling", "Chart fling. VelocityX: " + velocityX + ", VelocityY: " + velocityY); @@ -351,4 +356,7 @@ public void onStartTrackingTouch(SeekBar seekBar) {} @Override public void onStopTrackingTouch(SeekBar seekBar) {} + + @Override + public void onPointerCaptureChanged(boolean hasCapture) {} } diff --git a/MPChartExample/src/main/java/com/xxmassdeveloper/mpchartexample/fragments/BarChartFrag.java b/MPChartExample/src/main/java/com/xxmassdeveloper/mpchartexample/fragments/BarChartFrag.java index 4bcc543722..27ac1c911c 100644 --- a/MPChartExample/src/main/java/com/xxmassdeveloper/mpchartexample/fragments/BarChartFrag.java +++ b/MPChartExample/src/main/java/com/xxmassdeveloper/mpchartexample/fragments/BarChartFrag.java @@ -94,6 +94,11 @@ public void onChartSingleTapped(MotionEvent me) { Log.i("SingleTap", "Chart single-tapped."); } + @Override + public void onMarkerSingleTapped(MotionEvent me) { + Log.i("MarkerSingleTap", "Marker single-tapped."); + } + @Override public void onChartFling(MotionEvent me1, MotionEvent me2, float velocityX, float velocityY) { Log.i("Fling", "Chart fling. VelocityX: " + velocityX + ", VelocityY: " + velocityY); diff --git a/MPChartLib/src/main/java/com/github/mikephil/charting/components/IMarker.java b/MPChartLib/src/main/java/com/github/mikephil/charting/components/IMarker.java index 3b8ca43c81..3becf6e6b4 100644 --- a/MPChartLib/src/main/java/com/github/mikephil/charting/components/IMarker.java +++ b/MPChartLib/src/main/java/com/github/mikephil/charting/components/IMarker.java @@ -1,6 +1,7 @@ package com.github.mikephil.charting.components; import android.graphics.Canvas; +import android.view.MotionEvent; import com.github.mikephil.charting.data.Entry; import com.github.mikephil.charting.highlight.Highlight; @@ -44,4 +45,12 @@ public interface IMarker { * @param posY */ void draw(Canvas canvas, float posX, float posY); + + /** + * Checks the click position is on the marker or not + * + * @param posX + * @param posY + */ + boolean isClickOnMarker(float posX, float posY); } diff --git a/MPChartLib/src/main/java/com/github/mikephil/charting/components/MarkerImage.java b/MPChartLib/src/main/java/com/github/mikephil/charting/components/MarkerImage.java index 7bd7b8e6c3..365f0472a5 100644 --- a/MPChartLib/src/main/java/com/github/mikephil/charting/components/MarkerImage.java +++ b/MPChartLib/src/main/java/com/github/mikephil/charting/components/MarkerImage.java @@ -158,10 +158,20 @@ public void draw(Canvas canvas, float posX, float posY) { int saveId = canvas.save(); // translate to the correct position and draw - canvas.translate(posX + offset.x, posY + offset.y); + float drawingPosX = posX + offset.x; + float drawingPosY = posY + offset.y; + canvas.translate(drawingPosX, drawingPosY); mDrawable.draw(canvas); canvas.restoreToCount(saveId); mDrawable.setBounds(mDrawableBoundsCache); } + + @Override + public boolean isClickOnMarker(float posX, float posY) { + if(mDrawableBoundsCache == null) { + return false; + } + return mDrawableBoundsCache.contains((int) posX, (int) posY); + } } diff --git a/MPChartLib/src/main/java/com/github/mikephil/charting/components/MarkerView.java b/MPChartLib/src/main/java/com/github/mikephil/charting/components/MarkerView.java index 162e88e33c..7c0b611f4f 100644 --- a/MPChartLib/src/main/java/com/github/mikephil/charting/components/MarkerView.java +++ b/MPChartLib/src/main/java/com/github/mikephil/charting/components/MarkerView.java @@ -2,6 +2,7 @@ import android.content.Context; import android.graphics.Canvas; +import android.graphics.Rect; import android.view.LayoutInflater; import android.view.View; import android.widget.RelativeLayout; @@ -25,6 +26,7 @@ public class MarkerView extends RelativeLayout implements IMarker { private MPPointF mOffset = new MPPointF(); private MPPointF mOffset2 = new MPPointF(); private WeakReference mWeakChart; + private Rect rect; /** * Constructor. Sets up the MarkerView with a custom layout resource. @@ -117,13 +119,22 @@ public void refreshContent(Entry e, Highlight highlight) { @Override public void draw(Canvas canvas, float posX, float posY) { - MPPointF offset = getOffsetForDrawingAtPoint(posX, posY); - int saveId = canvas.save(); // translate to the correct position and draw - canvas.translate(posX + offset.x, posY + offset.y); + float drawingPosX = posX + offset.x; + float drawingPosY = posY + offset.y; + canvas.translate(drawingPosX, drawingPosY); draw(canvas); canvas.restoreToCount(saveId); + rect = new Rect((int) drawingPosX, (int) drawingPosY, (int) drawingPosX + getWidth(), (int) drawingPosY + getHeight()); + } + + @Override + public boolean isClickOnMarker(float posX, float posY) { + if(rect == null) { + return false; + } + return rect.contains((int) posX, (int) posY); } } diff --git a/MPChartLib/src/main/java/com/github/mikephil/charting/listener/BarLineChartTouchListener.java b/MPChartLib/src/main/java/com/github/mikephil/charting/listener/BarLineChartTouchListener.java index 5685d32fa0..061bf3edf6 100644 --- a/MPChartLib/src/main/java/com/github/mikephil/charting/listener/BarLineChartTouchListener.java +++ b/MPChartLib/src/main/java/com/github/mikephil/charting/listener/BarLineChartTouchListener.java @@ -619,7 +619,9 @@ public boolean onSingleTapUp(MotionEvent e) { OnChartGestureListener l = mChart.getOnChartGestureListener(); - if (l != null) { + if (l != null && mChart != null && mChart.isDrawMarkersEnabled() && mChart.valuesToHighlight() && mChart.getMarker().isClickOnMarker(e.getX(), e.getY())) { + l.onMarkerSingleTapped(e); + } else if (l != null) { l.onChartSingleTapped(e); } diff --git a/MPChartLib/src/main/java/com/github/mikephil/charting/listener/OnChartGestureListener.java b/MPChartLib/src/main/java/com/github/mikephil/charting/listener/OnChartGestureListener.java index da0c5ed180..ab4342ce9b 100644 --- a/MPChartLib/src/main/java/com/github/mikephil/charting/listener/OnChartGestureListener.java +++ b/MPChartLib/src/main/java/com/github/mikephil/charting/listener/OnChartGestureListener.java @@ -46,6 +46,13 @@ public interface OnChartGestureListener { */ void onChartSingleTapped(MotionEvent me); + /** + * Callbacks when the marker is single-tapped. + * + * @param me + */ + void onMarkerSingleTapped(MotionEvent me); + /** * Callbacks then a fling gesture is made on the chart. * diff --git a/MPChartLib/src/main/java/com/github/mikephil/charting/listener/PieRadarChartTouchListener.java b/MPChartLib/src/main/java/com/github/mikephil/charting/listener/PieRadarChartTouchListener.java index d3527f924a..0ca622fe5f 100644 --- a/MPChartLib/src/main/java/com/github/mikephil/charting/listener/PieRadarChartTouchListener.java +++ b/MPChartLib/src/main/java/com/github/mikephil/charting/listener/PieRadarChartTouchListener.java @@ -141,7 +141,9 @@ public boolean onSingleTapUp(MotionEvent e) { OnChartGestureListener l = mChart.getOnChartGestureListener(); - if (l != null) { + if (l != null && mChart != null && mChart.isDrawMarkersEnabled() && mChart.valuesToHighlight() && mChart.getMarker().isClickOnMarker(e.getX(), e.getY())) { + l.onMarkerSingleTapped(e); + } else if (l != null) { l.onChartSingleTapped(e); }