سؤال

أحاول رسم نص نص على خريطة map على الروبوت. إن رسم النص يذهب بشكل جيد، ولكن من الصعب جدا قراءة النص لأنه أبيض مع عدم وجود حد أسود (مثل بقية النص الذي يظهر بشكل طبيعي على MAPViews للإشارة إلى المدن والدول والبلدان). لا أستطيع أن أرى كيفية رسم النص مع حدود سوداء. أي شخص يعرف كيفية القيام بذلك؟

هذا هو نوع من التعليمات البرمجية التي أستخدمها الآن (هذا رمز مثال فقط، وجدت في أحد التراكبات الخاصة بي):

@Override
public void draw(Canvas canvas, MapView mapView, boolean shadow) {
    Paint textPaint = new Paint();
    textPaint.setARGB(255, 255, 255, 255);
    textPaint.setTextAlign(Paint.Align.CENTER);
    textPaint.setTextSize(16);
    textPaint.setTypeface(Typeface.DEFAULT_BOLD);

    canvas.drawText("Some Text", 100, 100, textPaint);

    super.draw(canvas, mapView, shadow);
}
هل كانت مفيدة؟

المحلول

أسهل طريقة للقيام بذلك هي بسكتة دماغية ... شيء من هذا القبيل:

@Override
public void draw(Canvas canvas, MapView mapView, boolean shadow) {
    Paint strokePaint = new Paint();
    strokePaint.setARGB(255, 0, 0, 0);
    strokePaint.setTextAlign(Paint.Align.CENTER);
    strokePaint.setTextSize(16);
    strokePaint.setTypeface(Typeface.DEFAULT_BOLD);
    strokePaint.setStyle(Paint.Style.STROKE);
    strokePaint.setStrokeWidth(2);

    Paint textPaint = new Paint();
    textPaint.setARGB(255, 255, 255, 255);
    textPaint.setTextAlign(Paint.Align.CENTER);
    textPaint.setTextSize(16);
    textPaint.setTypeface(Typeface.DEFAULT_BOLD);

    canvas.drawText("Some Text", 100, 100, strokePaint);
    canvas.drawText("Some Text", 100, 100, textPaint);

    super.draw(canvas, mapView, shadow);
}

سيؤدي ذلك إلى رسم حدود من 2 بكسل حول النص الخارجي، ثم ارسم النص فوق الجزء العلوي منه، مما يتيح لك وهم مخطط.

أيضا، قد يستحق تحديد الدهانات في المنشئ ثم إعادة استخدامها فقط.

نصائح أخرى

بدلا من هذا الرمز (من الإجابة الأولى)

canvas.drawText("Some Text", 100, 100, strokePaint);
canvas.drawText("Some Text", 100, 100, textPaint);

حاول استخدام الشيء نفسه مع المسار:

Path path = new Path();
String text = "Some Text";
tp.getTextPath(text, 0, text.length(), 0, 100, path);
canvas.drawPath(path, strokePaint);
canvas.drawPath(path, textPaint);

تبدو أفضل؟

الجواب نصف، الذي قد يكون أو لا يكون جيدا بما فيه الكفاية (كان في حالتي)، هو تعيين الظل:

textPaint.setShadowLayer(3, 0, 0, Color.BLACK);

يساعد الظل على أن النص يبرز كثيرا، لكنه ليس جيدا كما سيكون الحد الأسود. ما زلت فضوليا كيفية حل السؤال الأصلي.

هذه تسديدة كاملة في الظلام وقد تكون هناك طريقة أفضل، ولكن إذا قمت بإنشاء 4 نسخ من النص، فقم بتعيين لونها باللون الأسود، ثم قم بتشغيل كل طبقة بنسبة 1 بكسل قطريا، فسيخلق وهم حدود. لذلك إذا تم وضع نصك في [100،100]، فسوف تحتاج الظلال الأربعة إلى وضعها في [99،99]، [99،101]، [101،99] و [101،101]، مثل هذا:

canvas.drawText("Some Text", 99, 99, borderPaint);
canvas.drawText("Some Text", 99, 101, borderPaint);
canvas.drawText("Some Text", 101, 99, borderPaint);
canvas.drawText("Some Text", 101, 101, borderPaint);

canvas.drawText("Some Text", 100, 100, textPaint);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top