2013-01-11 3 views
4

TextView의 글자를 조금 더 멀리 배치해야하는 요구 사항이 있습니다. 불행히도, 내가 아는 자원의 대부분은 이것이 할 수 없다고 말하는 것 같습니다 - 적어도 그렇게 쉬운 것은 아닙니다.TextView에서 텍스트 자간 또는 간격을 변경 하시겠습니까?

지금까지 명백한 솔루션은 다음과 같습니다

  1. 가 String-- "A B C를" "ABC"의 대신 에서 문자 사이에 공백을 추가합니다. 물론 더 작은 공간 인 만 필요한 경우에는 작동하지 않습니다.
  2. 변경 textScale,하지만 문자의 크기, 문자
  3. 사용 Font 클래스 사이뿐만 아니라 간격 영향을 미치지 만 그 (I 호환 뭔가 진저 브레드 필요) 벌집 때까지 사용할 수 없습니다하고있다 JellyBean에서 을 사용하지 마세요. 좋은 옵션이 아닙니다.
  4. 커닝이 다른 글꼴을 찾으십시오. 그러나 클라이언트가 동일한 글꼴을 사용하려는 것은 아닙니다.
  5. 뷰의 경우 onDraw를 재정의하고 한 번에 한 문자 씩 Canvas에 문자를 그려 넣고 각각 문자를 그려야하는 위치를 수동으로 지정합니다.

내가 빠진 것이 있습니까? 더 좋은 방법이 있어야하는 것 같습니다. TextAttribute.KERNING 및 TextAttribute.TRACKING ... 참조하십시오 쉽게 사용할 수 있어야합니다 것처럼 보이지만 방법을 알아낼 수 없습니다.

TextView에서 글자 사이의 간격을 변경하는 가장 좋은 방법은 무엇입니까?

+0

"내가 찾은 대부분의 리소스는이 작업을 수행 할 수 없다고 말하는 것처럼 보입니다 - 적어도 쉽지는 않습니다."AFAIK, 그 리소스는 정확합니다. "4. 커닝이 다른 글꼴을 찾으십시오. 그러나 클라이언트가 동일한 글꼴을 사용하려면 실용적이지 않습니다." - 글꼴에 대한 사용권을 부여 받았고 수정이 가능하다고 가정하고 글꼴 편집기에서 글꼴을로드하고 커닝을 맞게 조정합니다. – CommonsWare

답변

4

내가 찾은 해결책은 설명 된 솔루션 1과 2를 혼합하는 것입니다. 문자 사이에 공백을 추가하고 공백의 TextScaleX 만 변경하면 다른 문자도 동일하게 유지됩니다. TextView을 확장하고 사용자가 문자 간격을 정의 할 수있는 사용자 정의 클래스를 작성했습니다. 다른 모든

내가 도움이 다른 answer

희망에 클래스를 게시) = 자동으로 ^^

+0

복잡하지만 솔루션 일 수도 있습니다 - 감사합니다! 아직 시도하지는 않았지만 다음 번에 그 요구 사항을 염두에 두겠습니다. –

3

그것은 또한 텍스트 속성이 allready 설정하면 작동하므로이 대답은 페드로의 답변에 따라 만 편집 해있다 :

package nl.raakict.android.spc.widget; 
import android.content.Context; 
import android.text.Spannable; 
import android.text.SpannableString; 
import android.text.style.ScaleXSpan; 
import android.util.AttributeSet; 
import android.widget.TextView; 


public class LetterSpacingTextView extends TextView { 
    private float letterSpacing = LetterSpacing.BIGGEST; 
    private CharSequence originalText = ""; 


    public LetterSpacingTextView(Context context) { 
     super(context); 
    } 

    public LetterSpacingTextView(Context context, AttributeSet attrs){ 
     super(context, attrs); 
     originalText = super.getText(); 
     applyLetterSpacing(); 
     this.invalidate(); 
    } 

    public LetterSpacingTextView(Context context, AttributeSet attrs, int defStyle){ 
     super(context, attrs, defStyle); 
    } 

    public float getLetterSpacing() { 
     return letterSpacing; 
    } 

    public void setLetterSpacing(float letterSpacing) { 
     this.letterSpacing = letterSpacing; 
     applyLetterSpacing(); 
    } 

    @Override 
    public void setText(CharSequence text, BufferType type) { 
     originalText = text; 
     applyLetterSpacing(); 
    } 

    @Override 
    public CharSequence getText() { 
     return originalText; 
    } 

    private void applyLetterSpacing() { 
     StringBuilder builder = new StringBuilder(); 
     for(int i = 0; i < originalText.length(); i++) { 
      String c = ""+ originalText.charAt(i); 
      builder.append(c.toLowerCase()); 
      if(i+1 < originalText.length()) { 
       builder.append("\u00A0"); 
      } 
     } 
     SpannableString finalText = new SpannableString(builder.toString()); 
     if(builder.toString().length() > 1) { 
      for(int i = 1; i < builder.toString().length(); i+=2) { 
       finalText.setSpan(new ScaleXSpan((letterSpacing+1)/10), i, i+1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
      } 
     } 
     super.setText(finalText, BufferType.SPANNABLE); 
    } 

    public class LetterSpacing { 
     public final static float NORMAL = 0; 
     public final static float NORMALBIG = (float)0.025; 
     public final static float BIG = (float)0.05; 
     public final static float BIGGEST = (float)0.2; 
    } 
} 
관련 문제