【问题标题】:Android: custom view is too slow?Android:自定义视图太慢?
【发布时间】:2011-08-16 14:40:00
【问题描述】:

我有一个自定义视图,上面有很多 png 图像(每三个字符一个图像)。但是绘图和滚动太慢了。

这是我的自定义视图代码:

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

}

如何加快我的自定义视图?我想我必须为所有图像创建一次位图。但是怎么做呢?

提前致谢!

【问题讨论】:

  • 你的方向是正确的。一次创建所有字符的位图,然后每次在 ondraw 中绘制该位图。还要在静态成员中预加载位图。
  • 为什么在super之前画图?有什么原因吗?
  • 谢谢,但我该怎么做呢?我是android的初学者。你能说我必须在哪里以及如何画吗?

标签: android custom-view


【解决方案1】:

您在每次绘制时加载和解码几个位图。您需要提前加载位图,一次然后绘制它们。

【讨论】:

    【解决方案2】:
    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(){}
     })
    

    【讨论】:

    • 感谢您的回答,但在线程之前我必须避免 android 每次都创建位图。
    【解决方案3】:

    以下内容应该会有所帮助。只是概述可以做什么。

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

    【讨论】:

    • 对不起菜鸟问题!!。如何使用此哈希图创建位图?我必须在 onDraw 中绘制哪个位图?对不起,我是初学者!
    • 编辑了我的答案。不能比这更进一步。可接受的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-22
    • 1970-01-01
    相关资源
    最近更新 更多