Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/226.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
Java 每4秒钟从一组颜色中随机更改颜色-Android应用程序_Java_Android_Random - Fatal编程技术网

Java 每4秒钟从一组颜色中随机更改颜色-Android应用程序

Java 每4秒钟从一组颜色中随机更改颜色-Android应用程序,java,android,random,Java,Android,Random,我正在尝试使用Eclipse在Java中每4秒钟从一组4种颜色中选择一种随机颜色。我唯一真正的编程经验是在flash中使用actionscript,我在获得想要的结果时遇到了一些困难。 我学习了一些基础知识,并且对编码有足够的了解,已经对它进行了足够的修改,以接近我想要的内容,但目前我只能让它按照我目前的方式循环 MainActivity.java package com.example.androidcountdowntimer; import com.example.androidcoun

我正在尝试使用Eclipse在Java中每4秒钟从一组4种颜色中选择一种随机颜色。我唯一真正的编程经验是在flash中使用actionscript,我在获得想要的结果时遇到了一些困难。 我学习了一些基础知识,并且对编码有足够的了解,已经对它进行了足够的修改,以接近我想要的内容,但目前我只能让它按照我目前的方式循环

MainActivity.java

package com.example.androidcountdowntimer;

import com.example.androidcountdowntimer.SpotView.SpotCallBack;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends Activity 
  implements SpotCallBack{

 TextView myState, myCounter;
 Button btnStart;

 SpotView mySpotView;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);

  mySpotView = (SpotView)findViewById(R.id.myspotview);
  mySpotView.setCallback(this);

  myState = (TextView) findViewById(R.id.mystate);

  myCounter = (TextView) findViewById(R.id.mycounter);
  btnStart = (Button) findViewById(R.id.start);
  btnStart.setOnClickListener(new OnClickListener() {

   @Override
   public void onClick(View v) {
    mySpotView.startRun();
   }
  });

 }

 @Override
 public void cb_onTick(String msg) {
  myCounter.setText("Milliseconds: " + msg);
 }

 @Override
 public void cb_onFinish(String msg) {
  myState.setText(msg);
 }

}
SpotView.java

package com.example.androidcountdowntimer;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.CountDownTimer;
import android.util.AttributeSet;
import android.view.View;

public class SpotView extends View{

 //used to pass back something to MainActivity
 interface SpotCallBack {
  void cb_onTick(String msg);
  void cb_onFinish(String msg); 
 }

 SpotCallBack spotCallback;

 CountDownTimer countDownTimer;

 int state;
 final static int STATE_IDLE = 0;
 final static int STATE_RED = 1;
 final static int STATE_GREEN = 2;
 final static int STATE_BLUE = 3;
 final static int STATE_YELLOW = 4;

 Paint paintRed, paintGreen, paintBlue, paintYellow;

 public SpotView(Context context) {
  super(context);
  init();
 }

 public SpotView(Context context, AttributeSet attrs) {
  super(context, attrs);
  init();
 }

 public SpotView(Context context, AttributeSet attrs, int defStyleAttr) {
  super(context, attrs, defStyleAttr);
  init();
 }

 private void init(){
  state = STATE_IDLE;

  paintRed = new Paint();
  paintRed.setColor(Color.RED);
  paintRed.setStrokeWidth(1);
  paintRed.setStyle(Paint.Style.FILL);

  paintGreen = new Paint();
  paintGreen.setColor(Color.GREEN);
  paintGreen.setStrokeWidth(1);
  paintGreen.setStyle(Paint.Style.FILL);

  paintBlue = new Paint();
  paintBlue.setColor(Color.BLUE);
  paintBlue.setStrokeWidth(1);
  paintBlue.setStyle(Paint.Style.FILL);

  paintYellow = new Paint();
  paintYellow.setColor(Color.YELLOW);
  paintYellow.setStrokeWidth(1);
  paintYellow.setStyle(Paint.Style.FILL);
 }

 public void setCallback(SpotCallBack cb){
  spotCallback = cb;
 }

 public void startRun(){
  state = STATE_RED;

  if(countDownTimer!=null){
   countDownTimer.cancel();
  }

  countDownTimer = new CountDownTimer(4000, 500) {

   @Override
   public void onTick(long millisUntilFinished) {
    spotCallback.cb_onTick(String.valueOf(millisUntilFinished));
   }

   @Override
   public void onFinish() {
    if(state == STATE_RED){
     state = STATE_GREEN;
     spotCallback.cb_onFinish("GREEN");
    }else if(state == STATE_GREEN){
     state = STATE_BLUE;
     spotCallback.cb_onFinish("BLUE");
    }else if(state == STATE_BLUE){
     state = STATE_YELLOW;
     spotCallback.cb_onFinish("YELLOW");
    }else if(state == STATE_YELLOW){
        state = STATE_RED;
        spotCallback.cb_onFinish("RED");
    }
    countDownTimer.start();
    invalidate();
   }
  };

  countDownTimer.start();
  spotCallback.cb_onFinish("RED");
  invalidate();
 }

 @Override
 protected void onDraw(Canvas canvas) {

  float w = getWidth();
  float h = getHeight();

  if(state == STATE_RED){
   canvas.drawCircle(w/2, h/2, 400, paintRed);
  }else if(state == STATE_GREEN){
   canvas.drawCircle(w/2, h/2, 400, paintGreen);
  }else if(state == STATE_BLUE){
   canvas.drawCircle(w/2, h/2, 400, paintBlue);
  }else if(state == STATE_YELLOW){
      canvas.drawCircle(w/2, h/2, 400, paintYellow);
  }
 }

}
activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:orientation="vertical"
    tools:context="com.example.androidcountdowntimer.MainActivity" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:autoLink="web"
        android:text="Tynes Timer Thing"
        android:textStyle="bold"
        android:textSize="24sp" />

    <Button
        android:id="@+id/start"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="Start CountDownTimer" />

    <TextView
        android:id="@+id/mystate"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:textSize="24sp" />

    <TextView
        android:id="@+id/mycounter"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:textSize="24sp" />

    <com.example.androidcountdowntimer.SpotView 
        android:id="@+id/myspotview"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" />

</LinearLayout>
并使用它尝试在elseif中设置状态

state = random;
但是,我的代码中不断出现红色的X和错误,无法理解如何在java中随机更改状态

如有任何帮助和/或建议,将不胜感激

谢谢,
Liam

您正在尝试将字符串值分配给int变量:

state = random;
取而代之的是获取随机int值并在代码中使用:

int random = new Random().nextInt(STATE_YELLOW) + 1;
state = random;
对于清洁代码,定义颜色的最小和最大常量,并使用它们:

private static final int MIN_STATE_COLOR = STATE_RED;
private static final int MAX_STATE_COLOR = STATE_YELLOW;

int random = new Random().nextInt(MAX_STATE_COLOR - MIN_STATE_COLOR + 1) + MIN_STATE_COLOR;

可能是您有一些其他名为colors的字符串数组,它只有红色状态…错误是什么?是的,对不起,我不是很清楚,但问题现在解决了!无论如何谢谢:道谢,伙计,这让我头疼,我会投票给你的答案,但显然你需要15次代表才能做到。
private static final int MIN_STATE_COLOR = STATE_RED;
private static final int MAX_STATE_COLOR = STATE_YELLOW;

int random = new Random().nextInt(MAX_STATE_COLOR - MIN_STATE_COLOR + 1) + MIN_STATE_COLOR;