package com.nutiteq.advancedmap3.vectorelements; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Paint.Style; import android.graphics.Path; import android.graphics.RectF; import android.graphics.Typeface; import android.text.Layout.Alignment; import android.text.StaticLayout; import android.text.TextPaint; import com.nutiteq.core.ScreenPos; import com.nutiteq.graphics.Bitmap; import com.nutiteq.styles.PopupStyle; import com.nutiteq.styles.PopupStyleBuilder; import com.nutiteq.utils.BitmapUtils; import com.nutiteq.vectorelements.Billboard; import com.nutiteq.vectorelements.Popup; /** * Simple text-based popup. */ public class CustomPopup extends Popup { static final int SCREEN_PADDING = 10; static final int POPUP_PADDING = 10; static final int FONT_SIZE = 15; static final int STROKE_WIDTH = 2; static final int TRIANGLE_SIZE = 10; static final int TEXT_COLOR = android.graphics.Color.BLACK; static final int STROKE_COLOR = android.graphics.Color.BLACK; static final int BACKGROUND_COLOR = android.graphics.Color.WHITE; static final PopupStyle STYLE; static { // Create custom style, set attachment anchor point a bit to the right from the center PopupStyleBuilder styleBuilder = new PopupStyleBuilder(); styleBuilder.setAttachAnchorPoint(0.5f, 0); STYLE = styleBuilder.buildStyle(); } private String text; public CustomPopup(Billboard baseBillboard, String text) { super(baseBillboard, STYLE); this.text = text; } public synchronized String getText() { return text; } public void setText(String text) { synchronized (this) { this.text = text; } notifyElementChanged(); } @Override public Bitmap drawBitmap(ScreenPos anchorScreenPos, float screenWidth, float screenHeight, float dpToPX) { // Calculate scaled dimensions float pxToDP = 1 / dpToPX; if (STYLE.isScaleWithDPI()) { dpToPX = 1; } else { pxToDP = 1; } screenWidth *= pxToDP; screenHeight *= pxToDP; int fontSize = (int) (FONT_SIZE * dpToPX); int triangleWidth = (int) (TRIANGLE_SIZE * dpToPX); int triangleHeight = (int) (TRIANGLE_SIZE * dpToPX); int strokeWidth = (int) (STROKE_WIDTH * dpToPX); int screenPadding = (int) (SCREEN_PADDING * dpToPX); // Get fonts Typeface font = Typeface.create("HelveticaNeue-Light", Typeface.NORMAL); // Calculate the maximum popup size, adjust with dpi int maxPopupWidth = (int) Math.min(screenWidth, screenHeight); float halfStrokeWidth = strokeWidth * 0.5f; int maxTextWidth = maxPopupWidth - screenPadding * 2 - strokeWidth; // Create paint object Paint paint = new Paint(); paint.setAntiAlias(true); // Measure text size TextPaint textPaint = new TextPaint(); textPaint.setColor(TEXT_COLOR); textPaint.setTextSize(fontSize); textPaint.setTypeface(font); android.graphics.Point textSize = new android.graphics.Point(0, 0); StaticLayout textLayout = null; if (text != "") { textLayout = new StaticLayout(text, textPaint, maxTextWidth, Alignment.ALIGN_NORMAL, 1, 0, false); textSize.set((int) Math.min(textPaint.measureText(text), textLayout.getWidth()), textLayout.getHeight()); } // Calculate bitmap size and create graphics context int popupWidth = textSize.x; popupWidth += 2 * POPUP_PADDING + strokeWidth + triangleWidth; int popupHeight = textSize.y; popupHeight += 2 * POPUP_PADDING + strokeWidth; // Create bitmap and canvas android.graphics.Bitmap bitmap = android.graphics.Bitmap.createBitmap(popupWidth, popupHeight, android.graphics.Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); // Prepare triangle path Path trianglePath = new Path(); trianglePath.moveTo(triangleWidth, 0); trianglePath.lineTo(halfStrokeWidth, triangleHeight * 0.5f); trianglePath.lineTo(triangleWidth, triangleHeight); trianglePath.close(); // Calculate anchor point and triangle position int triangleOffsetX = 0; int triangleOffsetY = (popupHeight - triangleHeight) / 2; setAnchorPoint(-1, 0); // Stroke background paint.setStyle(Style.STROKE); paint.setStrokeWidth(strokeWidth); paint.setColor(STROKE_COLOR); RectF backgroundRect = new RectF( triangleWidth, halfStrokeWidth, popupWidth - strokeWidth, popupHeight - strokeWidth); canvas.drawRect(backgroundRect, paint); // Stroke triangle canvas.save(); canvas.translate(triangleOffsetX, triangleOffsetY); canvas.drawPath(trianglePath, paint); canvas.restore(); // Fill background paint.setStyle(Style.FILL); paint.setColor(BACKGROUND_COLOR); canvas.drawRect(backgroundRect, paint); // Fill triangle canvas.save(); canvas.translate(triangleOffsetX, triangleOffsetY); canvas.drawPath(trianglePath, paint); canvas.restore(); if (textLayout != null) { // Draw text canvas.save(); canvas.translate(halfStrokeWidth + triangleWidth + POPUP_PADDING, halfStrokeWidth + POPUP_PADDING); textLayout.draw(canvas); canvas.restore(); } return BitmapUtils.createBitmapFromAndroidBitmap(bitmap); } }