2013-07-20 3 views
4

내 위젯에 사용자 정의 글꼴을 배치하려면 글꼴이있는 비트 맵을 만든 다음 RemoteViews에 배치해야합니다. 그러나 비트 맵에있는 텍스트는 꽤 흐릿 해 보이며 실제로는 액티비티 내에 투명하게 표시되는 것과 비교해 볼 때 픽셀 화되어 있습니다.비트 맵을 사용하면 RemoteViews (위젯)에 텍스트가 흐릿합니다.

이미 위젯에서 맞춤 글꼴을 사용하는 앱이 많이 있습니다. 나는 아직 이것을 할 수있는 확실한 방법을 찾지 못했습니다. 누구든지이 문제에 대한 더 나은 해결책을 가지고 있다면 나는 그것을 듣고 싶습니다!

오른쪽 지금이 내가 비트 맵을 생성하고 위젯에 배치하기 위해 사용하고 무엇을 :

RemoteViews widgetView = new RemoteViews(this.getPackageName(), R.layout.widget); 
widgetView.setImageViewBitmap(R.id.widgetImage, buildBitmap()); 

public Bitmap buildBitmap() { 
     Bitmap bitmap = Bitmap.createBitmap(160, 84, Bitmap.Config.ARGB_8888); 
     Canvas canvas = new Canvas(bitmap); 

     TextPaint textPaint = new TextPaint(TextPaint.LINEAR_TEXT_FLAG | TextPaint.ANTI_ALIAS_FLAG); 
     textPaint.setTypeface(getFont()); 
     textPaint.setStyle(Style.FILL); 
     textPaint.setColor(fontColor); 
     textPaint.setTextSize(fontSize); 

     StaticLayout staticLayout = new StaticLayout(textString, textPaint, bitmap.getWidth(), Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false); 
     staticLayout.draw(canvas); 

     return bitmap; 
    } 

범인 위젯을

와 함께! 맨 위에있는 글꼴은 사용자 지정 글꼴로, 중간 이미지는 비트 맵에 기본 Sans 글꼴로 사용되어 어떤 글꼴이 사용 되더라도 텍스트가 흐릿하다는 것을 나타냅니다.

마지막 이미지는 비트 맵 대신 기본값 인 remoteView.setTextViewText("Text");을 사용할 때의 텍스트입니다.

이 문제에 대한 도움을 주시면 대단히 감사하겠습니다.

enter image description here enter image description here enter image description here

+2

160x84 크기가 너무 작아 보입니다. 화면 밀도를 조정하면 안됩니까? – Delyan

+0

맞춤형 서체가있는 텍스트 뷰를 가질 수없는 이유를 상기시켜주십시오. – Tom

+3

위젯이므로 @Tom. 'RemoteViews'는 그렇게하지 않습니다. – kabuko

답변

2

당신은 160x84을지지 않습니다. 아주 작은 크기입니다. 크기가 조정되면 볼 수있는 것처럼 퍼지 어질 수 있습니다. 대신 실제로 주어진 sp에서 텍스트의 측정을 기반으로 비트 맵 크기를 측정하려고합니다. Paint.measureText은 이러한 종류의 것들을 너비로 가져 오는 데 유용 할 수 있지만 높이를 지정해야 올바르게 적용될 수 있으므로 getTextBounds이 더 유용 할 수 있습니다. 패딩을 추가해야 할 수도 있지만 시작해야합니다. 사진에서 볼 수 있듯이 선명도 만이 처리해야하는 유일한 문제는 아닙니다. 단어 줄 바꿈도 알아야합니다 (여기 아마도 Paint.measureText이 유용 할 것입니다).

+0

160x84를 300x400과 같은 것으로 변경하면 확실히 달라집니다! 그러나 아직 위젯의 실제 크기가 아닙니다. 나는 measureText와 getTextBounds를 모두 시도했다. 그들은 Paint.measureText()가 7375를 반환하는 것과 같이 실제로 많은 수를 반환합니다. – Gatekeeper

+0

페인트 객체에서 'setTextSize'및 'setTextScale'을 적절한 값으로 호출 했습니까? – kabuko

+0

지금은'setTextSize'에 18을 전달하고 있지만'setTextScaleX'에서는 아무 것도하지 않습니다. 'setTextScaleX'를 변경하면 텍스트가 왼쪽이나 오른쪽으로 늘어나서 비뚤어집니다. – Gatekeeper

0

ImageView에는 android:scaleType="matrix" 속성을 추가해야합니다. 위젯 레이아웃 xml을 편집하고 필요한 경우 해당 속성을 추가하십시오. 그런 다음 ImageView는보기에 맞게 이미지의 크기를 조정하지 않습니다.

이전 게시물에 나와있는 것처럼 픽셀 크기가 잘못되었습니다. 나중에 비트 맵을 만들 때 사용할 수 있도록 각 위젯의 크기에 대한 기록을 유지해야합니다.

이 비트 작업을 돕고 싶다면 몇 가지 코드를 게시 할 수 있습니다. 이 대답을 수락하고 그 질문에 대해 다른 질문을 구체적으로 게시하면 해당 코드와 함께 답변 해 드리겠습니다.

+3

답변을 수락하거나 새로운 일종의 관련 질문을 게시하도록 사용자를 강요하지 마십시오. 도움이된다면 도와주세요. 그렇지 않다면하지 마십시오. – Delyan

+0

나는 누군가를 강탈하지 않는다. 나는 실제로 그의 질문에 대한 대답을 게시했다. 내 답장을 다시 읽은 후에 나는 그것이 어떻게 다른 빛으로 왔는지 그리고 어떻게 내 말씨가 더 좋았는지를 볼 수 있습니다. 나는 그저 다른 문제가 근본적으로 관련이 없다고 말하고 있었는데, 그가 그 질문에 대답하기를 원한다면 그는 또 다른 질문을 게시해야했다. – Simon