2011-08-16 6 views
0

많은 png 이미지가있는 사용자 정의보기가 있습니다 (3 자마다 이미지). 그리기 및 스크롤하는 데 너무 느립니다.Android : 맞춤보기가 너무 느림?

그것은 사용자 정의보기에 대한 내 코드는 다음과 같습니다

public class Textview extends View 
{  
    private String m_szText; 
    Context ctx; 
    Paint mTextPaint; 
    private Canvas canva; 
    Bitmap b ; 

    public Textview(Context context) 
    { 
     super(context); 
     ctx = context;   
     mTextPaint= new Paint();    
     mTextPaint.setTypeface(m_tTypeface); 
     mTextPaint.setStyle(Paint.Style.FILL); 
    }   

    public void SetText(String newtext) { 
     m_szText = newtext; 
     text(newtext); 
     this.invalidate(); 
    } 
    @Override 
    protected void onDraw(Canvas canvas) 
    {    
     super.onDraw(text(canvas,m_szText)); 
    } 

    Canvas text(Canvas canvas,String txt) 
    {   
     int left = 400;   
     int top = 0;   
     try { 
      for(int i=0;i<txt.length();i=i+3) 
      { 
       String adres = "glyph/" + txt.substring(i, i+3) + ".png";    
       Bitmap btm = getBitmapFromAsset(adres); 
       if(left <= 5) 
        {left = 400;top += btm.getHeight();} 
       else 
        left = left - btm.getWidth(); 
       canvas.drawBitmap(btm, left ,top,mTextPaint); 
      } 
     } catch (IOException e) { 
      canvas.drawText(e.toString(), 50, 50, mTextPaint); 
     } 
     return canvas; 
    } 

    private Bitmap getBitmapFromAsset(String strName) throws IOException 
    { 
     AssetManager assetManager = ctx.getAssets(); 
     InputStream istr = assetManager.open(strName);   
     Bitmap bitmap = BitmapFactory.decodeStream(istr); 
     return bitmap; 
    } 

} 
내 사용자 지정보기 속도를 높일 수있는 방법

? 한 번 모든 이미지의 비트 맵을 만들어야한다고 생각합니다. 그러나 어떻게?

미리 감사드립니다.

+0

올바른 방향입니다. 모든 문자의 비트 맵을 한 번 만들고 ondraw에서 매 비트 맵을 그립니다. 또한 정적 멤버의 비트 맵을 사전로드하십시오. – Ronnie

+0

왜 슈퍼에서 드로잉할까요? 어떤 이유? – Ronnie

+0

감사합니다.하지만 어떻게 할 수 있습니까? 나는 안드로이드에서 초보자입니다. 어디에서 그리고 내가 어떻게 그려야하는지 말할 수 있니? –

답변

0

다음이 도움이됩니다. 할 수있는 일의 개요.

static HashMap<String, Bitmap> mBitmaps = new HashMap<String, Bitmap>(); 
public void SetText(String newtext) { 
    m_szText = newtext; 
    makeBitmap(); 
    this.invalidate(); 
} 

void makeBitmap() 
{   
    for(int i=0; i<m_szText.length(); i=i+3) 
     { 
      String adres = "glyph/" + m_szText.substring(i, i+3) + ".png"; 
      Bitmap btm = null; 
      if (!mBitmaps.containsKey(adres)) { 
       btm = getBitmapFromAsset(adres); 
       mBitmaps.add(adres , btm); 
      } else { 
       btm = (Bitmap)mBitmaps.get(adres); 
      }     
      length += btm.getWidth(); // considering only single line. 
     } 
    // create a new blank Bitmap of height and 'length' and assign to member. 
    mTextBitmap = Bitmap.createBitmap(length, height, Bitmap.Config.ARGB_8888); 

    // in for loop draw all the bitmaps on mTextBitmap just like you did on canvas in ur code. 
} 
+0

멍청한 질문에 대해 죄송합니다 !!. 이 해시 맵을 사용하여 비트 맵을 만드는 방법은 무엇입니까? 어떤 비트 맵에서 나는 onDraw를 그리어야합니까? 미안하지만, 초보자 야! –

+0

내 대답을 편집했습니다. 이보다 더 멀리 갈 수 없어. 수용 가능한 대답. – Ronnie

3
당신은 여러 비트 맵 모든 무승부를로드 및 디코딩된다

. 미리 비트 맵을로드해야합니다. 한 번 그려야합니다.

+0

고마워요,하지만 어떻게? –

1
You can use Thread to speed up process, and there are two way to use thread 
1)Implementing Runnable that override void run(){} 
2)or use Thread th=new Thread(new Runnable(){void run(){} 
}) 
+0

해답을 주셔서 감사하지만 스레드하기 전에 매번 비트 맵을 생성하려면 안드로이드를 피해야합니다. –

+0

예, 먼저해야합니까 – Sameer

관련 문제