2015-07-17 2 views
0

У меня есть 16 пустой квадрат, и я хочу отображать красный квадрат случайным образом каждые 1 с, поэтому я использовал обработчик, и это работает. Но когда пользователь нажимает на этот красный квадрат, счет увеличивается на 1. Я попытался добавить onclicklistener, чтобы назвать это, но это не то, что мне нужно, потому что, когда фон квадратов краснеет, увеличивается на 1, даже когда он возвращается к белый, поэтому я попытался добавить на клик-слушатель каждое изображение, начиная с первого, но ничего не происходит; когда я нажимаю на него сбои приложения, так что я должен сделать ## Heading ##Сравните фон ImageView с Drawable

код:

Drawable RedSquare; 

ImageView Image1; 
TextView res; 
Random random = new Random(); 
int score = 0; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    MediaPlayer mp =MediaPlayer.create(getApplicationContext(),R.raw.mp); 
    mp.start(); 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_reflex); 
    RedSquare = getResources().getDrawable(R.mipmap.redsquare); 
    Image1 = (ImageView) findViewById(R.id.imageView1); 
    ImageView Image2 = (ImageView) findViewById(R.id.imageView2); 
    ImageView Image3 = (ImageView) findViewById(R.id.imageView3); 
    ImageView Image4 = (ImageView) findViewById(R.id.imageView4); 
    ImageView Image5 = (ImageView) findViewById(R.id.imageView5); 
    ImageView Image6 = (ImageView) findViewById(R.id.imageView6); 
    ImageView Image7 = (ImageView) findViewById(R.id.imageView7); 
    ImageView Image8 = (ImageView) findViewById(R.id.imageView8); 
    ImageView Image9 = (ImageView) findViewById(R.id.imageView9); 
    ImageView Image10 = (ImageView) findViewById(R.id.imageView10); 
    ImageView Image11 = (ImageView) findViewById(R.id.imageView11); 
    ImageView Image12 = (ImageView) findViewById(R.id.imageView12); 
    ImageView Image13 = (ImageView) findViewById(R.id.imageView13); 
    ImageView Image14 = (ImageView) findViewById(R.id.imageView14); 
    ImageView Image15 = (ImageView) findViewById(R.id.imageView15); 
    ImageView Image16 = (ImageView) findViewById(R.id.imageView16); 
    res = (TextView) findViewById(R.id.reflexresult); 
    final ImageView[] Image = {Image1, Image2, Image3, Image4, Image5, Image6, 
      Image7, Image8, Image9, Image10, Image11, Image12, Image13, Image14, Image15, Image16}; 


    final Handler handler = new Handler(); 
    Runnable runnable = new Runnable() { 
     @Override 
     public void run() { 
      GeneratePosition(Image); 
      handler.postDelayed(this, 1000); 
     } 
    }; 
    handler.postDelayed(runnable, 1000); 
    addScore(); 
} 

public void GeneratePosition(ImageView[] Image) { 

    int index = random.nextInt(Image.length); 
    ImageView name = Image[index]; 
    for (ImageView imageView : Image) { 
     imageView.setImageDrawable(getResources().getDrawable(R.mipmap.blanksquare)); 
    } 

    name.setImageDrawable(getResources().getDrawable(R.mipmap.redsquare)); 
} 
public void addScore(){ 
    Image1.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 

      if(Image1.getBackground().equals(RedSquare)){ 
       score++; 
       res.setText(score+""); 
      } 
     } 
    }); 
} 

}

ответ

0

Почему вы хотите сравнить фон? Просто сохраните ссылку на ImageView в настоящее время, отображая красный фон как поле в методе GeneratePosition.

В прослушивателе кликов вы получаете ссылку на выбранное представление. Все, что вам нужно сделать, это сравнить это со ссылкой, которую вы сохранили ранее.

+0

Вы имеете в виду вот это? public void GeneratePosition (ImageView [] Image) { int index = random.nextInt (Image.length); ImageView name = Image [index]; name.setOnClickListener (новый View.OnClickListener() { @Override общественного недействительный OnClick (View Вид) { счет ++; res.setText (оценка + "");} }); для (ImageView imageView: изображение) { imageView.setImageDrawable (getResources(). GetDrawable (R.mipmap.blanksquare)); } – Anthoz

+0

Нет, но это также возможность. Но если вы это сделаете, вам нужно позаботиться о том, чтобы ваш слушатель удалялся щелчком или таймаутом. –

+0

Какой второй метод? – Anthoz

0

Вот пример реализации того, как я мог бы сэкономить эту проблему. Он добавляет слушателя в представление, которое нужно щелкнуть. Если пользователю требуется щелкнуть по выделенному ImageView, он выделит новый. Если пользователь нажимает выделенный элемент ImageView во время обновления точки, и следующий ImageView сразу выделяется.

private static final int TIMEOUT_IN_MILLIS = 1000; 
private static final int POINTS_PER_CORRECT_CLICK = 1; 

private static final Handler HANDLER = new Handler(); 
private static final Random RANDOM = new Random(); 

private final Runnable startRoundOnTimeoutRunnable = new StartRoundOnTimeoutRunnable(); 
private final View.OnClickListener correctImageViewClickListener = new CorrectImageViewClickListener(); 

private final List<ImageView> availableImageViews; 
private final TextView scoreDisplay; 

private final Drawable blackSquare; 
private final Drawable redSquare; 

private int score = 0; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    // initialization of all views 
    // and 
    // assembling of availableImageViews list 

    startNewRound(); 
} 

public void startNewRound() { 
    resetAllImageViews(); 
    initializeNextImageViewToClick(); 
    startTimeout(); 
} 

private void initializeNextImageViewToClick() { 
    ImageView imageViewToClick = getRandomImageView(); 
    imageViewToClick.setBackground(redSquare); 
    imageViewToClick.setOnClickListener(correctImageViewClickListener); 
} 

private void resetAllImageViews() { 
    for (ImageView imageView : availableImageViews) { 
     imageView.setImageDrawable(blackSquare); 
     imageView.setOnClickListener(null); 
    } 
} 

private ImageView getRandomImageView() { 
    int index = RANDOM.nextInt(availableImageViews.size()); 
    return availableImageViews.get(index); 
} 

private void incrementAndDisplayScore() { 
    score += POINTS_PER_CORRECT_CLICK; 
    scoreDisplay.setText("Score: " + score); 
} 

private void startTimeout() { 
    HANDLER.postDelayed(startRoundOnTimeoutRunnable, TIMEOUT_IN_MILLIS); 
} 

private void cancelTimeout() { 
    HANDLER.removeCallbacks(startRoundOnTimeoutRunnable); 
} 


private class CorrectImageViewClickListener implements View.OnClickListener { 

    @Override 
    public void onClick(View view) { 
     cancelTimeout(); 
     incrementAndDisplayScore(); 
     startNewRound(); 
    } 

} 

private class StartRoundOnTimeoutRunnable implements Runnable { 

    @Override 
    public void run() { 
     startNewRound(); 
    } 

} 
+0

Как использовать Список availableImageViews – Anthoz

+0

http://docs.oracle.com/javase/ 7/документы/API/Java/Util/list.html –

Смежные вопросы