1

캔버스에 텍스트를 그려야합니다. 캔바스에 직사각형 상자를 이미 추가했습니다.이 텍스트를 상자 안에 넣는 것이 목표이지만, 시도해도 텍스트는 모든 화면 크기에 완벽하게 맞지 않습니다.캔버스에 사용자 정의 크기 텍스트 그리기

다른 하나는이 텍스트가 간단한 HTML이라는 것입니다.

TextView currDateLabel = new TextView(getContext()); 
currDateLabel.layout(0, 0, boxSize.x, boxSize.y); 
currDateLabel.setTextSize(TypedValue.COMPLEX_UNIT_PX, getResources().getDimensionPixelSize(R.dimen.label_date)); 
currDateLabel.setTextColor(Color.WHITE); 
currDateLabel.setText(Html.fromHtml("Dec 11<sup><small><small>TH</small></small></sup>")); 
currDateLabel.setDrawingCacheEnabled(true); 

Bitmap dateBitmap = currDateLabel.getDrawingCache(true); 
// I've also tried setting the width of this Bitmap but it doesn't seem to do anything 

this.canvas.drawBitmap(dateBitmap, boxPosition.x, boxPosition.y, null); 

그래서 여기에 일부 변수를 설명합니다 :

  • boxSize이 상자에 캔버스의 Point 저장 폭 것을 객체와 높이입니다. 이 값은 상자 밖으로 나가는 텍스트를 볼 수 있기 때문에 TextView의 크기에는 아무런 영향을주지 않습니다.

  • boxPosition 캔버스에 상자 xy과 위치를 저장하는 Point 목적이다.

  • R.dimen.label_datedimens.xml의 값입니다.

여러 개의 (등등 values/dimens.xml, values-hdpi/dimens.xml, values-xhdpi/dimens.xml 등) dimens.xml 파일 나는 화면 크기의 대부분을 테스트하고 각 화면의 범주에 대한 텍스트의 크기를 알아낼 수 생각

만든 . 그러나 그것은 내가 예상했던대로 작동하지 않습니다.

화면 폭 :

이 값은 삼성 갤럭시 S8위한 1440, 화면 높이 : 2768
화면 밀도 : 4.0
화면 밀도 DPI : 640
화면 스케일 밀도 : 4.0

이 값은 입니다. Samsung Galaxy S7 :

화면 폭 : 1440, 화면 높이 : 2560
화면 밀도 : 4.0
화면 밀도 DPI : 640
화면 스케일 밀도 : 4.0

그들은 그들이 가지고 있도록 XXXHDPI 카테고리 아래 모두 가을 같은 글꼴 크기이지만 Galaxy S8 텍스트는 상자에 들어 맞으며 Galaxy S7 텍스트는 너무 커서 상자 밖으로 나갑니다.

여기에 뭔가가 있습니까?

Canvas에 HTML 텍스트를 그릴 때 완전히 다른 방법이 있습니까?

============================================== ====

편집 :

더 자세한 내 사용 사례를 설명 :

내가 말하는거다 상자는 SVG/벡터 개체입니다.

label_down.xml

는 :
<?xml version="1.0" encoding="utf-8"?> 
<vector xmlns:android="http://schemas.android.com/apk/res/android" 
    android:width="90dp" 
    android:height="45dp" 
    android:viewportWidth="90" 
    android:viewportHeight="45"> 

    <path 
     android:fillColor="?attr/labelColor" 
     android:pathData="M 0 0 L 0 37.532 L 36.63 37.532 L 45 45 L 53.371 37.532 L 90 37.532 L 90 0 Z" /> 
</vector> 

그럼 그 벡터에서 Bitamp 개체를 만들고 캔버스에 Bitmap을 그립니다. 이런 일이 발생할 것이다 이렇게

VectorDrawableCompat vectorDrawableCompat = VectorDrawableCompat.create(getContext().getResources(), R.drawable.label_down, theme); 
Bitmap bitmap = Bitmap.createBitmap(vectorDrawableCompat.getIntrinsicWidth(), vectorDrawableCompat.getIntrinsicHeight(), Bitmap.Config.ARGB_8888); 
this.canvas.drawBitmap(bitmap, someXPos, someYPos, null); 

:

enter image description here

지금 내 목표는 상자 안에 텍스트를 만드는 것입니다.

희망 사항이 더 적합합니다. 당신이 볼 수있는

+0

나는 당신이 찾고있는 것을 달성하기 위해 주위에 다른 방법이 있어야한다고 생각한다. 상자를 만들고 그 상자에 HTML 텍스트를 그리는 것 외에 다른 것을 시도해야 할 수도있다. 당신이 그 상자에 텍스트를 넣는 것보다 사람들이 당신을 도울 수있는 것보다 훨씬 더 많은 일을 설명 할 수 있다면 ... –

+0

@AdeelTurk 자세한 내용으로 내 질문을 수정했습니다. 감사합니다 –

+0

내 채팅 응용 프로그램에 대해 동일한 UI를 만들었습니다. 나는 textview 배경으로 9.patch 이미지를 사용했고 모든 장치와 두 방향에서 모두 잘 작동했습니다. –

답변

1

나는이 "SP"와 "DP"단위 사이의 차이를 지적 생각에 객체를 추천, 제대로 렌더링되지 않습니다. 당신은 label_date의 값이 크기의 파일에 어떤 질문에 문서화하지 않습니다. 그것이 텍스트 크기 단위이기 때문에 "sp"단위를 사용하고 있다고 가정합니다.

"xxsp"를 "xxdp"로 변경하여 차이가 있는지 확인하십시오. 난 그냥 넥서스 5 배 API (26) 에뮬레이터에서이 시도하고 갤럭시 S7 안드로이드 7.0을 실행하고 "DP"단위는 HTML 텍스트로 문제를 해결했습니다. 업데이트

enter image description here

넥서스 5 배 API (26) 에뮬레이터

enter image description here

갤럭시 S7 장치 API 안드로이드 7.0

: 여기에 내가 본 무엇을 궁금
했다 정확히 무슨 일이 벌어지고 있는지에 대해서. 크기 조정 가능 픽셀 (SP)의 배율 인수가 S7 설정에서 1보다 큰 것처럼 보입니다. "Settings-> Display-> Screen zoom and font"로 가서 "FONT SIZE"를 세 번째 해시 표시로 설정하십시오. 이제 텍스트 소리가 올바르게 표시됩니다.

그래픽과 독립적으로 텍스트의 크기를 조정하고 싶지 않으므로 IMO에서 텍스트 단위로 밀도 독립적 픽셀 (DP)을 사용하면 그래픽과 텍스트의 일관성을 유지하는 것이 옳습니다. .

2 업데이트 : 주어진 화면 크기/밀도를 들어, 한 그래픽의 크기가 고정되어 있으며 장치의 설정에 따라 변경할 수있는 글꼴의 표시 크기, 당신의 가능성을 계속으로 텍스트가 적합하지 않습니다.밀도 독립적 픽셀을 글꼴의 단위로 지정한다고 생각하지 않는다면 확장 가능한 픽셀을 사용하고 코드에서 사용되는 글꼴 크기를 조정할 수 있습니다. 다음과 같은 내용 :

float fontScale = getResources().getConfiguration().fontScale; 
textview.setTextSize(TypedValue.COMPLEX_UNIT_PX, getResources() 
    .getDimensionPixelSize(R.dimen.label_date_sp)/fontScale); 

이렇게하면 글꼴의 유효 배율 인수가 1.0으로 다시 조정됩니다. 여기서 단점은 글꼴 크기가 14sp이라고 가정 해 보겠습니다. 실제로 표시된 크기는 다른 요소보다 작을 것이며 14sp입니다. 이것은 "DP"를 지정하는 것과 같은 효과가 있지만 더 표준 "SP"단위를 사용합니다.

+0

더 자세히 살펴 보겠습니다. 그러나 나는 DP를 시도했다. DP의 문제점은 해상도 크기가 커질수록 글꼴 크기가 커지지 않는다는 점입니다. SP의 전체적인 점입니다. 예 : OnePlus 3 휴대 전화의 "글꼴 크기"및 "표시 크기"가 "작음"으로 변경되었습니다. 이것은 폰트가 커지지 않기 때문에'16dp' 폰트 크기가 박스 내부에서 아주 작다는 것을 의미합니다. 이는 솔루션보다 해결 방법처럼 느껴질 수도 있습니다. –

+0

@ th3pat3l Android 8.0에서 사용할 수있는 [auto sizing] (https://developer.android.com/guide/topics/ui/look-and-feel/autosizing-textview.html)을 살펴볼 수 있습니다. 및 지원 라이브러리에 있습니다. dp로 측정 된 위젯에 국한된 sp 위젯의 문제점은 sp와 dp가 서로 독립적으로 바뀔 수 있다는 것입니다. dp로 측정 된 글꼴은 그래픽 위젯처럼 큰 화면에서 확장해야합니다. – Cheticamp

+0

좋은 아이디어가 있었고 두 번째 업데이트로 인해 다른 방향으로 이끌었습니다. 문제를 해결할 수있었습니다. 상자와'TextView'를 커스텀'View'로 만들었습니다. 예를 들어 상자 높이를 3으로 나눈 값입니다. 그리고 그 글꼴 크기를'COMPLEX_UNIT_PX' (픽셀)로 받았습니다. 감사 –

0

HTML 텍스트 내가 그리기 DOM은 캔버스

DOM Elements on Canvas

+0

HTML 텍스트가 완벽하게 렌더링됩니다. 문제는'TextView'의 크기가 너무 크다는 것입니다. 그러나 나는 그 링크를 살펴볼 것이다. 감사합니다 –

+0

이 링크가 질문에 대답 할 수 있지만 여기에 답변의 핵심 부분을 포함시키고 참조 용 링크를 제공하는 것이 좋습니다. 링크 된 페이지가 변경되면 링크 전용 답변이 유효하지 않게 될 수 있습니다. - [리뷰에서] (리뷰/저품절 게시물/18270352) – Graham