2011-08-16 39 views
0

我有一個自定義視圖上有很多png圖像(每三個字符一個圖像)。但在繪圖和滾動時速度太慢。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

你的方向是正確的。創建一次所有字符的位圖,並在每次繪製時繪製該位圖。還預載了靜態成員中的位圖。 – Ronnie

+0

爲什麼你在超級之前畫畫?任何原因? – Ronnie

+0

謝謝,但我該怎麼辦?我是Android的初學者。你能說出我在哪裏以及如何畫畫嗎? –

回答

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

對於noob問題感到抱歉!!我怎樣才能使用這個hashmap來創建位圖?我必須在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

感謝您的回答,但在線程之前,我必須避免android每次創建位圖。 –

+0

是的,你必須先做它 – Sameer