2012-11-28 3 views
1

나는 안드로이드를 더 배우기 위해 작은 게임을 작업 해왔다. 디지털 숫자를 그래픽으로 바꾸는 것에 관한 한 가지 질문이있다. Canvas.drawText를 사용하는 것에 지쳤습니다 ...캔버스에 그래픽 숫자로 디지털 숫자 바꾸기

PNG 이미지에 숫자가 인쇄되는 경우 쓸 프레임을 이해하는 함수를 만드는 방법은 무엇입니까?

좋아, 내가 1240 점을 가지고 있다고 가정 해 봅시다. 그 숫자를 캔버스의 그래픽 숫자로 대체하고 싶습니다.

나는 내 질문을 분명히했으면 좋겠다.

+0

"디지털 숫자"와 "그래픽 숫자"는 무엇을 의미합니까? – user1118321

+0

히야, score = Integer.toString (score); canvas.drawText (점수, 10, 10, 페인트); 텍스트 기반 숫자 인 drawText 대신 그래픽 점수 번호를 그립니다. 예 : 0-9의 숫자가 png 파일의 그래픽 형식으로 미리 그려지고 점수에 따라 캔버스에 그려야한다고 가정 해 봅시다. 점수가 521 일 때 정확한 프레임을 선택하여 캔버스에 그리는 방법은 무엇입니까? 전에는 해본 적이 없으며, 깨끗한 방법이 있다고 생각합니다. pls가 그 배후의 논리를 토론한다면, tnx. – GameBug

답변

1

그리 어렵지는 않지만 올바른 위치에 드로어 블을 놓아 두십시오. 그러나 강력한 위젯을 만들고 싶다면 더 많은 고려와 계산이 필요합니다.

public class MTextView extends View { 
    public MTextView(Context context) { 
     this(context, null); 
    } 

    public MTextView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     initDrawables(); 
    } 

    private Drawable[] mDigitDrawables = new Drawable[10]; 
    private String mText = "123"; 

    private void initDrawables() { 
     Resources res = getResources(); 
     mDigitDrawables[0] = res.getDrawable(R.drawable.digit_0); 
     mDigitDrawables[1] = res.getDrawable(R.drawable.digit_1); 
     mDigitDrawables[2] = res.getDrawable(R.drawable.digit_2); 
     mDigitDrawables[3] = res.getDrawable(R.drawable.digit_3); 
     mDigitDrawables[4] = res.getDrawable(R.drawable.digit_4); 
     mDigitDrawables[5] = res.getDrawable(R.drawable.digit_5); 
     mDigitDrawables[6] = res.getDrawable(R.drawable.digit_6); 
     mDigitDrawables[7] = res.getDrawable(R.drawable.digit_7); 
     mDigitDrawables[8] = res.getDrawable(R.drawable.digit_8); 
     mDigitDrawables[9] = res.getDrawable(R.drawable.digit_9); 

     for (int i = 0; i < 10; i++) { 
      boundToLeftTop(mDigitDrawables[i]); 
     } 
    } 

    private void boundToLeftTop(Drawable d) { 
     d.setBounds(0, 0, d.getIntrinsicWidth(), d.getIntrinsicHeight()); 
    } 

    @Override 
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
     int dw = mDigitDrawables[0].getIntrinsicWidth(); 
     int dh = mDigitDrawables[0].getIntrinsicHeight(); 
     int width = dw * mText.length() + getPaddingLeft() 
       + getPaddingRight(); 
     int height = dh + getPaddingTop() + getPaddingBottom(); 
     setMeasuredDimension(resolveSize(width, widthMeasureSpec), 
       resolveSize(height, heightMeasureSpec)); 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
     canvas.save(); 
     canvas.translate(getPaddingLeft(), getPaddingTop()); 
     for (int i = 0; i < mText.length(); i++) { 
      int number = Integer.valueOf(mText.charAt(i) - '0'); 
      Drawable d = mDigitDrawables[number]; 
      d.draw(canvas); 
      canvas.translate(d.getBounds().width(), 0); 
     } 
     canvas.restore(); 
    } 
} 
+0

안녕하세요 faylon, YOUR_DIGIT_IMAGE를 R.drawable.gui_numbers로 대체하려고 시도했지만 다음과 같은 오류가 발생합니다. 유형 불일치 : int에서 Drawable으로 변환 할 수 없습니다. 또한 다음 코드를 시도했지만 작동하지 않았습니다. gui_numbers = BitmapFactory.decodeResource (getResources(), R.drawable.gui_numbers); – GameBug

+0

omg ... getResources(). getDrawable (R.drawable.gui_numbers) ... – faylon

+0

답장을 보내 주셔서 감사합니다. faylon에게 오류가 발생했습니다. java.lang.ArrayIndexOutOfBoundsException. – GameBug

관련 문제