说到在Android中画图,相信大家对MPAndroidChart不陌生,其功能强大,能画出各种各样非常绚丽的效果图。但是近期公司的项目要求在markerview上添加一些按钮,能够直接在markerview上操作按钮来直接对图上的point进行操控。然后在lib里找了半天,发现原生根本就不支持此功能,然后在其github MPAndroidChart的issue里查找相关问题,发现还真是有很多人提出了这个问题,让作者解决这个问题,但是这个问题一直没有得到很好的解决,记得作者在issue里回答说”it is harder than what I thought…”,然后就没有然后了。我直接懵逼…
但是,硬着头皮也要上,自己override各种方法来尝试,均为成功,差点没有崩溃!最后,在issue里发现了一个对我很有启发的方式,这里谢谢这个哥们儿!
https://github.com/PhilJay/MPAndroidChart/issues/2482
不过这种方式需要改源码,不能让你使用如下方式来集成进项目
compile ‘com.github.PhilJay:MPAndroidChart:v3.0.0-beta1’
所以,要解决这个问题,首先必须把MPAndroidChart从github上download下来,以compile library的方式来使用。
另外,这个只解决了,是否点击了markerview,如果点击了的话,相应其点击事件。如果此时,需要更为精确的控制,比如最开始提出的在markerview里添加一些按钮,对这些按钮来响应不同的点击事件,该怎么办呢?我这里已经实现了!在这里把它分享出来,相信对有需要的朋友有所帮助!
- 在BarLineChartBase里修改一下onTouchEvent方法,如下:
@Override
public boolean onTouchEvent(MotionEvent event) {
super.onTouchEvent(event);
if (mChartTouchListener == null || mData == null)
return false;
//这里是新添加的判断,让markerView有机会相应点击事件!
if(mMarker !=null && MotionEvent.ACTION_UP == event.getAction() && mMarker.isTouch(event)){
mMarker.markViewClick();
return true;
}
// check if touch gestures are enabled
if (!mTouchEnabled)
return false;
else
return mChartTouchListener.onTouch(this, event);
}
- 在IMarker里添加如下方法
boolean isTouch(MotionEvent event);
void markViewClick();
- 在MarkerView里修改draw方法,实现isTouch,markViewClick方法,另外添加2个属性用来记录点击point在markerview里的相对位置
/**
* relativeTouchPointX, relativeTouchPointY 是 touch 的点