开发者

Android: custom view is too slow?

I have a custom view with a lot of png images on it(For every three characters an image). but it is too slow on drawing and scrolling.

It is my code for custom view:

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;         
        in开发者_JS百科t 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;
    }

}

How can I speed up my custom view? I think I must to create bitmap of all images once. but how to?

thanks in advance!


You are loading and decoding several bitmaps on every draw. You need to load the bitmaps ahead of time, once and then draw them.


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(){}
 })


The following should help. just outline of what can be done.

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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜