Java Android如何在SurfaceView的draw中调用的方法中添加延迟

Java Android如何在SurfaceView的draw中调用的方法中添加延迟,java,android,Java,Android,你好,我想能够添加一个方法,减少我的精灵大小,例如每1s 10px,直到它达到小尺寸,但应用程序冻结。我试着这样做: public class GameSurface extends SurfaceView implements SurfaceHolder.Callback { public ChibiCharacter chibi1; private final Handler handlerReduceSizeOfChibi = new Handler(); (...) @Overr

你好,我想能够添加一个方法,减少我的精灵大小,例如每1s 10px,直到它达到小尺寸,但应用程序冻结。我试着这样做:

public class GameSurface extends SurfaceView implements SurfaceHolder.Callback {

public ChibiCharacter chibi1;
private final Handler handlerReduceSizeOfChibi = new Handler();

(...) 

@Override
public void draw(Canvas canvas) {
    super.draw(canvas);
    this.canvas = canvas;

    (...)

    if(chibiNode==17)
        reduceSizeOfChibi();
}

public void reduceSizeOfChibi() {
    int defaultChibiWidth = chibi1.getWidth();
    int defaultChibiHeight = chibi1.getHeight();
    int chibiXWhenCall  = chibi1.getX();
    int chibiYWhenCall  = chibi1.getY();
    Bitmap defaultChibiBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.chibi1);
    Runnable runnable = new Runnable() {
        public void run() {
            for(int i=0; i<50; i=i+10) {
                chibiBitmap = Bitmap.createScaledBitmap(defaultChibiBitmap, defaultChibiWidth-i,defaultChibiHeight, false);
                chibi1 = null;
                chibi1 = new ChibiCharacter(GameSurface.this, chibiBitmap, chibiXWhenCall, chibiYWhenCall);
                handlerReduceSizeOfChibi.postDelayed(this, 1000);
            }
        }
    };
    runnable.run();
}
}
公共类GameSurface扩展SurfaceView实现SurfaceHolder.Callback{
公共ChibiCharacter chibi1;
私有最终处理程序handlerReduceSizeOfChibi=新处理程序();
(...) 
@凌驾
公共空白绘制(画布){
超级绘画(画布);
this.canvas=画布;
(...)
如果(chibiNode==17)
chibi()的还原作用;
}
公共空间缩减CHBI(){
int defaultChibiWidth=chibi1.getWidth();
int defaultChibiHeight=chibi1.getHeight();
int chibiXWhenCall=chibi1.getX();
int chibiYWhenCall=chibi1.getY();
位图defaultChibiBitmap=BitmapFactory.decodeResource(getResources(),R.drawable.chibi1);
Runnable Runnable=新的Runnable(){
公开募捐{

对于(int i=0;i首先,尝试更改

private final Handler handlerReduceSizeOfChibi = new Handler();

第二,您使用处理程序的方式是错误的。该处理程序基本上会每隔~1秒调用您的
Runnable
,持续5次,这会导致
无限循环。
这可能是你想要的

public void reduceSizeOfChibi() {
    int defaultChibiWidth = chibi1.getWidth();
    int defaultChibiHeight = chibi1.getHeight();
    int chibiXWhenCall  = chibi1.getX();
    int chibiYWhenCall  = chibi1.getY();
    Bitmap defaultChibiBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.chibi1);
   for(int i=0; i<50; i+=10) {
    handlerReduceSizeOfChibi.postDelayed(new Runnable() {
        public void run() {
            chibiBitmap = Bitmap.createScaledBitmap(defaultChibiBitmap, defaultChibiWidth - i, defaultChibiHeight, false);
            chibi1 = new ChibiCharacter(GameSurface.this, chibiBitmap, chibiXWhenCall, chibiYWhenCall);
            GameSurface.this.invalidate(); //Update ChibiCharacter every 1 second.
        }
    }, 1000);
    }
}
public void reduceSizeOfChibi(){
int defaultChibiWidth=chibi1.getWidth();
int defaultChibiHeight=chibi1.getHeight();
int chibiXWhenCall=chibi1.getX();
int chibiYWhenCall=chibi1.getY();
位图defaultChibiBitmap=BitmapFactory.decodeResource(getResources(),R.drawable.chibi1);

对于(int i=0;i出现了两个问题。查看探查器,我发现内存泄漏。其次,我的sprite立即从最大大小更改为最小大小,例如从100px100px直接更改为50px50px,而不使用90px90px、80px80px等等。当然,这对任何自定义视图应用程序都不是一种有效的方法。正如您在
for
循环中看到的那样,您将
chibiBitmap
重新缩放了5次,创建了一个新的
ChibiCharacter
,如果多次调用此方法,情况会更糟。您应该缓存这些内容并在不同的方法(如构造函数)中进行操作。甚至需要
ChibiCharacter
类吗?如果不知道如何使用
ChibiCharacter,我无法帮助您
的结构如下所示。
public void reduceSizeOfChibi() {
    int defaultChibiWidth = chibi1.getWidth();
    int defaultChibiHeight = chibi1.getHeight();
    int chibiXWhenCall  = chibi1.getX();
    int chibiYWhenCall  = chibi1.getY();
    Bitmap defaultChibiBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.chibi1);
   for(int i=0; i<50; i+=10) {
    handlerReduceSizeOfChibi.postDelayed(new Runnable() {
        public void run() {
            chibiBitmap = Bitmap.createScaledBitmap(defaultChibiBitmap, defaultChibiWidth - i, defaultChibiHeight, false);
            chibi1 = new ChibiCharacter(GameSurface.this, chibiBitmap, chibiXWhenCall, chibiYWhenCall);
            GameSurface.this.invalidate(); //Update ChibiCharacter every 1 second.
        }
    }, 1000);
    }
}