Die Verwendung der Bibliothek scheint nicht möglich zu sein, jedoch besteht eine Lösung darin, eine View oder ViewGroup über dem Diagramm zu zeigen, das einen Button enthält. Sie müssen ein leeres Layout für die MarkerView einrichten und Ihr Diagramm in eine ViewGroup wie beispielsweise RelativeLayout einbinden.
Definieren Sie einen Zuhörer wie dies in Ihrem CustomMarkerView:
public interface Listener {
/**
* A callback with the x,y position of the marker
* @param x the x in pixels
* @param y the y in pixels
*/
void onMarkerViewLayout(int x, int y);
}
einige Membervariablen ein:
private Listener mListener;
private int mLayoutX;
private int mLayoutY;
private int mMarkerVisibility;
In Ihrem Konstruktor einen Zuhörer benötigen:
/**
* Constructor. Sets up the MarkerView with a custom layout resource.
* @param context a context
* @param layoutResource the layout resource to use for the MarkerView
* @param listener listens for the bid now click
*/
public SQUChartMarkerView(Context context, int layoutResource, Listener listener) {
super(context, layoutResource);
mListener = listener;
}
Store, um die Ort der Marker sollte sein, wenn die Werte eingestellt sind:
@Override public int getXOffset(float xpos) {
mLayoutX = (int) (xpos - (getWidth()/2));
return -getWidth()/2;
}
@Override public int getYOffset(float ypos) {
mLayoutY = (int) (ypos - getWidth());
return -getHeight();
}
Dann OnDraw außer Kraft setzen, um zu bestimmen, wenn Sie Ihr Layout ziehen sollten:
@Override protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if(mMarkerVisibility == View.VISIBLE) mListener.onMarkerViewLayout(mLayoutX, mLayoutY);
}
Ich habe eine Option, um den Zustand der Markierung zu ändern:
public void setMarkerVisibility(int markerVisibility) {
mMarkerVisibility = markerVisibility;
}
Wo Sie für Marker Wesen hören angelegt, erhalten Sie Ihr Layout (z. B. blasen Sie es auf oder Sie können es als eine Mitgliedsvariable haben), stellen Sie sicher, dass Sie es messen, und stellen Sie dann die Ränder ein. In diesem Fall verwende ich getParent(), da das Diagramm und das Layout für den Marker dasselbe Elternelement verwenden. Ich habe ein BarChart, so dass meine Margen möglicherweise anders sind als bei Ihnen.
@Override public void onMarkerViewLayout(int x, int y) {
if(getParent() == null || mChartListener.getAmount() == null) return;
// remove the marker
((ViewGroup) getParent()).removeView(mMarkerLayout);
((ViewGroup) getParent()).addView(mMarkerLayout);
// measure the layout
// if this is not done, the first calculation of the layout parameter margins
// will be incorrect as the layout at this point has no height or width
int widthMeasureSpec = View.MeasureSpec.makeMeasureSpec(((ViewGroup) getParent()).getWidth(), View.MeasureSpec.UNSPECIFIED);
int heightMeasureSpec = View.MeasureSpec.makeMeasureSpec(((ViewGroup) getParent()).getHeight(), View.MeasureSpec.UNSPECIFIED);
mMarkerLayout.measure(widthMeasureSpec, heightMeasureSpec);
// set up layout parameters so our marker is in the same position as the mpchart marker would be (based no the x and y)
RelativeLayout.LayoutParams lps = (RelativeLayout.LayoutParams) mMarkerLayout.getLayoutParams();
lps.height = FrameLayout.LayoutParams.WRAP_CONTENT;
lps.width = FrameLayout.LayoutParams.WRAP_CONTENT;
lps.leftMargin = x - mMarkerLayout.getMeasuredWidth()/2;
lps.topMargin = y - mMarkerLayout.getMeasuredHeight();
}
Hoffe, das hilft.
Mit der neuesten Bibliothek 3.0.2 sehe ich nicht getXOffset() oder getYOffset() vorhanden. –
Und hier hören Sie, wenn der Marker onDraw() ausführt, nicht wirklich, wenn der Benutzer auf die markerView klickt. Ich denke, es gibt einen Unterschied. –