首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用drawBitmap()时的视觉缺陷

使用drawBitmap()时的视觉缺陷
EN

Stack Overflow用户
提问于 2012-04-11 02:59:50
回答 1查看 255关注 0票数 0

它看起来像,无论是在模拟器上还是在手机上。总是一个随机的正方形被打破了。

下面是来自SurfaceView类的代码,最相关的部分是prepareBackground():

代码开始:

公共类MenuBackgroundView扩展SurfaceView实现SurfaceHolder.Callback {

代码语言:javascript
复制
private Paint mPaint;
private Bitmap blocks12x12;
private boolean draw = false;
private Context ctx;
//private int begOffX;
private int offX;
private int offY;
private int mWidth = 1;
private int mHeight = 1;
private ViewThread mThread;
private int calcSizeXY;

public MenuBackgroundView(Context context, AttributeSet attrs) {
    super(context, attrs);
    getHolder().addCallback(this);
    mThread = new ViewThread(this);
    mPaint = new Paint();
    mPaint.setColor(Color.RED);
    ctx = context;
}




public void doDraw(long elapsed, Canvas canvas) {

    canvas.drawColor(Color.BLUE);

    if(draw)
    {
        canvas.drawBitmap(blocks12x12, offX, offY, mPaint);
    }
    canvas.drawText("FPS: " + Math.round(1000f / elapsed) + " Elements: ", 10, 10, mPaint);
}

public void animate(long elapsed)
{
    /*
    //elapsed = elapsed/10;
    offX = (offX+2);
    if(offX >= 0)
    {
        offX -= 2*calcSizeXY;
    }

    offY = (offY+3);
    if(offY >= 0)
    {
        offY -= 2*calcSizeXY;
    }
    //offY = (offY + (int)(elapsed/10f)) % calcSizeXY*2;//
     * 
     *///
}

public void prepareBackground()
{
    if(mWidth <= 1 || mHeight <= 1 )
        return;

    Log.d("Menu", "prepareBackground");

    if(mHeight > mWidth)
    {
        calcSizeXY = mHeight/10;
    }
    else
    {
        calcSizeXY = mWidth/10;     
    }

    offX = -2*calcSizeXY;

    Bitmap block = BitmapFactory.decodeResource(ctx.getResources(), R.drawable.block);
    block = Bitmap.createScaledBitmap(block, calcSizeXY, calcSizeXY, false);




    // Group together
    int sizeX = 12*calcSizeXY;
    int sizeY = 12*calcSizeXY;
    blocks12x12 = Bitmap.createBitmap(sizeX, sizeY, Bitmap.Config.ARGB_8888);
    Canvas blocks12x12Canvas = new Canvas(blocks12x12);

    for(int i = 0; i < 14; i+=2)
    {
        for(int j = 0; j < 14; j+=2)
        {
            blocks12x12Canvas.drawBitmap(block, (j*calcSizeXY), (i*calcSizeXY), mPaint);
        }
    }

    // "Memory leak"
    block.recycle();

    draw = true;
}




@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
    mWidth = width;
    mHeight = height;
    prepareBackground();
}

@Override
public void surfaceCreated(SurfaceHolder holder) {
    prepareBackground();
    if (!mThread.isAlive()) {
        mThread = new ViewThread(this);
        mThread.setRunning(true);
        mThread.start();
    }
}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
    if (mThread.isAlive()) {
        mThread.setRunning(false);
        freeMem();
    }
}




public void freeMem() {
    // TODO Auto-generated method stub
    draw = false;
    blocks12x12.recycle(); // "Memory leak"
}

}

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-04-23 21:19:36

好的,我想出来了,只要让线程睡1ms就行了:

代码语言:javascript
复制
blocks12x12 = Bitmap.createBitmap(sizeX, sizeY, Bitmap.Config.ARGB_8888);
    Canvas blocks12x12Canvas = new Canvas(blocks12x12);

    for(int i = 0; i < 14; i+=2)
    {
        for(int j = 0; j < 14; j+=2)
        {
            try {
                Thread.sleep(1);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            blocks12x12Canvas.drawBitmap(block, (j*calcSizeXY), (i*calcSizeXY), mPaint);
        }
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10099232

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档