2011-08-16 13 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

正しい方向です。すべての文字のビットマップを1回作成し、そのビットマップを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

関連する問題