0

たくさんのpng画像を含むカスタムビューがあります(3文字ごとに画像)。しかし、描画とスクロールには遅すぎます。

これはカスタムビューの私のコードです:

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;
    }

}

カスタムビューを高速化するにはどうすればよいですか?すべての画像のビットマップを一度作成する必要があると思います。しかし、どのように?

前もって感謝します!

4

3 に答える 3

3

描画ごとにいくつかのビットマップをロードおよびデコードしています。事前にビットマップをロードしてから描画する必要があります

于 2011-08-16T05:34:15.203 に答える
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(){}
 })
于 2011-08-16T05:39:52.037 に答える
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.
}
于 2011-08-16T06:12:29.117 に答える