Ich habe eine benutzerdefinierte Ansicht geschrieben, die eine Google Map Marker zur Laufzeit folgende Code generieren:Teil der benutzerdefinierten Ansicht nicht zur Laufzeit gerendert?
public class CustomMapMarker extends View {
Paint paint;
Path bodyPath;
Path dotPath;
private Paint paint2;
private int backGroundColor;
private int foreGroundColor;
Matrix scaleMatrix;
public CustomMapMarker(Context context)
{
super(context);
init(context);
}
public CustomMapMarker(Context context, AttributeSet attrs) {
super(context, attrs);
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CustomMapMarker);
try {
backGroundColor = a.getColor(R.styleable.CustomMapMarker_markerBackgroundColor, Color.parseColor("#4180e0"));
foreGroundColor = a.getColor(R.styleable.CustomMapMarker_dotBackgroundColor, Color.WHITE);
}
finally {
a.recycle();
}
init(context);
}
public CustomMapMarker(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(context);
}
private void init(Context context) {
scaleMatrix = new Matrix();
bodyPath = new Path();
dotPath = new Path();
paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setStyle(Paint.Style.FILL);
paint.setColor(backGroundColor);
paint2 = new Paint(Paint.ANTI_ALIAS_FLAG);
paint2.setStyle(Paint.Style.FILL);
paint2.setColor(foreGroundColor);
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
@Override
public void onDraw(Canvas canvas)
{
bodyPath.setFillType(Path.FillType.EVEN_ODD);
bodyPath.moveTo(132, 416);
bodyPath.cubicTo(123, 370, 107, 332, 87, 297);
bodyPath.cubicTo(72, 270, 55, 246, 39, 221);
bodyPath.cubicTo(33, 212, 29, 203, 24, 194);
bodyPath.cubicTo(14,177,5,156, 6, 130);
bodyPath.cubicTo(6,104,14,83,25,66);
bodyPath.cubicTo(42,38,72,15,112,9);
bodyPath.cubicTo(145, 4, 176,12,197,25);
bodyPath.cubicTo(215, 36, 229,49,239,66);
bodyPath.cubicTo(250, 83, 258, 103,258,129);
bodyPath.cubicTo(259, 143, 256, 155, 253, 166);
bodyPath.cubicTo(250, 176, 245, 185, 241, 194);
bodyPath.cubicTo(232, 212, 221, 229, 210, 246);
bodyPath.cubicTo(177, 296, 146, 347, 132, 416);
bodyPath.close();
dotPath.setFillType(Path.FillType.EVEN_ODD);
dotPath.arcTo(82, 85, 182, 185, 270, 360, true);
dotPath.close();
bodyPath.addPath(dotPath);
RectF drawableRect = new RectF(0, 0, 265, 412);
RectF viewRect = new RectF(0, 0, getWidth(), getHeight());
scaleMatrix.setRectToRect(drawableRect, viewRect, Matrix.ScaleToFit.CENTER);
bodyPath.transform(scaleMatrix);
dotPath.transform(scaleMatrix);
canvas.drawPath(bodyPath, paint);
canvas.drawPath(dotPath, paint2);
}
public void setBackgroundColor(int mColor) {
this.backGroundColor = mColor;
this.invalidate();
}
public void setForeGroundColor(int mColor) {
this.foreGroundColor = mColor;
this.invalidate();
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int desiredWidth = 255;
int desiredHeight = 412;
int widthMode = MeasureSpec.getMode(widthMeasureSpec);
int widthSize = MeasureSpec.getSize(widthMeasureSpec);
int heightMode = MeasureSpec.getMode(heightMeasureSpec);
int heightSize = MeasureSpec.getSize(heightMeasureSpec);
int width;
int height;
if (widthMode == MeasureSpec.EXACTLY) {
width = widthSize;
} else if (widthMode == MeasureSpec.AT_MOST) {
width = Math.min(desiredWidth, widthSize);
} else {
width = desiredWidth;
}
if (heightMode == MeasureSpec.EXACTLY) {
height = heightSize;
} else if (heightMode == MeasureSpec.AT_MOST) {
height = Math.min(desiredHeight, heightSize);
} else {
height = desiredHeight;
}
setMeasuredDimension(width, height);
}
}
, die in der XML-Vorschau, zeigt, wie beabsichtigt:
, jedoch bei Laufzeit, Einbettung dieser Marker irgendwo in der App zu testen, ist der weiße Punkt nicht sichtbar?
Würde jemand mit mehr Erfahrung mit benutzerdefinierten Ansichten der Lage sein, etwas Licht in diesen Schuppen? Ich vermute, dass es etwas damit zu tun hat, wie ich den Weg skaliere, um ihn an jede Größe anzupassen?
Verwenden Sie keine hartcodierten Zahlen, berechnen Sie den Pfad mit getWidth() und getHeight() und Prozentangaben von denen, dann brauchen Sie überhaupt keine Skalierung. Warum fügen Sie einen Pfad zum Körperpfad hinzu? In den setXXXColor-Funktionen müssen Sie paint.setColor() verwenden, sonst haben sie keine Wirkung. – ElDuderino
@ElDuderino Danke für die Antwort, guten Ruf auf die setXXXColors, sie sind eigentlich nicht im Moment verwendet, aber hätte mich später gestochen! Leider bin ich bezüglich der Skalierung sehr unerfahren mit programmatischem Zeichnen und/oder benutzerdefinierten Ansichten und würde sehr wenig Erfolg beim Versuch haben, die richtige Methode, die Sie erwähnt haben, zu versuchen! – Broak