Java Android如何在SurfaceView的draw中调用的方法中添加延迟
你好,我想能够添加一个方法,减少我的精灵大小,例如每1s 10px,直到它达到小尺寸,但应用程序冻结。我试着这样做: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
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);
}
}