Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android循环问题_Android_Loops_Icons - Fatal编程技术网

Android循环问题

Android循环问题,android,loops,icons,Android,Loops,Icons,我不熟悉android,但不熟悉编程。下面的代码使android中默认可用的icon.png在屏幕上显示,或者至少应该显示出来。这不管用。有人能帮忙吗 > package com.android.test; import > android.app.Activity; import > android.content.Context; import > android.graphics.Bitmap; import > android.graphics.Bitmap

我不熟悉android,但不熟悉编程。下面的代码使android中默认可用的icon.png在屏幕上显示,或者至少应该显示出来。这不管用。有人能帮忙吗

> package com.android.test; import
> android.app.Activity; import
> android.content.Context; import
> android.graphics.Bitmap; import
> android.graphics.BitmapFactory; import
> android.graphics.Canvas; import
> android.graphics.Color; import
> android.os.Bundle;
> 
> 
> import android.view.View; import
> android.view.Window;
> 
> public class Android extends Activity
> { int x,y=10;
> 
> @Override public void onCreate(Bundle
> savedInstanceState) {
> super.onCreate(savedInstanceState);
> requestWindowFeature(Window.FEATURE_NO_TITLE);
> setContentView(new Panel(this)); }
> 
> class Panel extends View { public
> Panel(Context context) {
> super(context); }
> 
> @Override public void onDraw(Canvas
> canvas) { Bitmap _scratch =
> BitmapFactory.decodeResource(getResources(),
> R.drawable.icon);
> canvas.drawColor(Color.BLACK); int
> n=1;  while (n==1){ try {
> Thread.sleep(30);  } catch
> (InterruptedException e) { }
> canvas.drawBitmap(_scratch, x, y,
> null);  x+=2; y+=2;
> 
> canvas.drawBitmap(_scratch, x, y,
> null);  } } } }

我也是一名业余的Android开发人员,我想我记得读到过这样一篇文章,称Thread.Sleep()为解决方法是一个坏习惯。但是我可能错了。

您的onDraw()方法永远不会返回。需要这样做。你的应用程序会在几秒钟后强制关闭吗?您必须在30毫秒后向UI线程发布一条消息以重新绘制,而不是在onDraw()中循环。在我的脑海里,试试这个:

class Panel extends View {
  public Panel(Context context) {
    super(context);
  }

  int x = 0;
  int y = 0;
  Bitmap _scratch = BitmapFactory.decodeResource(getResources(), R.drawable.icon);

  @Override public void onDraw(Canvas canvas) {
    canvas.drawColor(Color.BLACK);
    canvas.drawBitmap(_scratch, x, y, null);
    x+=2; y+=2;
    this.postInvalidateDelayed(30);
  }
}

当然,您需要添加一些代码,以在图标离开边缘后停止循环。

onDraw用于渲染显示-一次。尝试在onDraw中执行此循环可能不是一个好主意


您可能希望尝试使用动画,而不是使用循环。在谷歌上搜索“安卓动画教程”或类似内容。

你能去掉“>”字符并正确设置代码格式吗?哦,伙计。。。。。。非常感谢你。它起作用了。但是,请您解释一下“this.postInvalidateDelayed(30);”的作用是什么?活动是由一个主线程(也称为UI线程)运行的,该线程在消息队列中循环以选择要做的事情。postInvalidateDelayed()向队列中添加一条消息,表示在30毫秒后,需要重新绘制此视图。30毫秒后,主线程接收此消息并调用onDraw()方法。这也是应用程序不响应错误的来源。如果主线程处理消息的时间超过5秒,Android会认为这是个问题。这就是为什么不能在onDraw()内部循环。