2014-06-25 65 views
0

我試圖製作一個應用程序,它使用Eclipse在Java中每4秒從一組4種顏色中選取隨機顏色。我唯一真正的編程經驗是在flash中使用actionscript,並且在獲得我想要的結果時遇到了一些問題。 我跟隨了一些基礎知識的教程,並且足夠了解編碼,以便更改它足以接近我想要的內容,但目前它只能按照目前的方式循環。隨機顏色每4秒更換一組顏色 - Android應用程序

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> 

所以他們的方式我試圖使顏色的變化是隨機通過存儲用於狀態的顏色作爲變量,然後試圖使用該變量來創建當前代碼的一部分只是通過一組狀態動態喜歡的運行:

String[] colours = {"STATE_RED", "STATE_GREEN", "STATE_BLUE", "STATE_YELLOW"}; 
int idx = new Random().nextInt(colours.length); 
String random = (colors[idx]); 

,並以此來嘗試設置在ELSEIF

state = random; 

的狀態,但我只是不斷得到紅色X和錯誤在我的代碼和斜面弄清楚如何在java中隨機改變狀態。

任何幫助和/或建議將不勝感激。

感謝, 利亞姆

+0

也許你有一些其他的字符串數組命名爲「顏色」,它只有紅色的狀態.....什麼是錯誤? –

+0

對不起,我不是很清楚,現在問題解決了!無論如何感謝:D – user3773772

回答

0

您正在嘗試分配字符串值,以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; 
+0

真棒感謝的人這是我的頭,我會投票你的答案,但顯然你需要15代表做到這一點。 – user3773772