Android의 MapView에 테두리가있는 텍스트를 어떻게 그리나요?
-
19-09-2019 - |
문제
Android의 MapView에 텍스트를 그려 보려고합니다. 텍스트의 그림은 괜찮지 만 검은 테두리가없는 흰색이기 때문에 텍스트를 읽는 것은 매우 어렵습니다 (도시, 주 및 국가를 표시하기 위해 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]에 위치하면 4 개의 그림자는 [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);