将 ImageView 的背景与 Drawable 进行比较

Compare an ImageView's Background to a Drawable

我有 16 个空白方块,我想每隔 1 秒随机显示一个红色方块,所以我使用了处理程序并且这有效。 但是当用户点击这个红色方块时,得分增加了 1。 我试图将 onclicklistener 添加到名称中,但这不是我需要的,因为一旦方块背景为红色,即使它 returns 变为白色,得分也会增加 1,所以我尝试将点击监听器添加到每个 imageView 开始与第一个但没有任何反应;当我点击它时,应用程序崩溃了,我该怎么办?## Heading ##

代码:

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+"");
            }
        }
    });
}

}

为什么要对比背景?只需将当前显示红色背景的 ImageView 的引用保存为 GeneratePosition 方法中的字段。

在点击监听器中,您可以获取被点击视图的引用。您所要做的就是将此与您之前保存的参考进行比较。

这是我如何解决这个问题的示例实现。它向应单击的视图添加一个侦听器。如果用户需要很长时间才能单击突出显示的 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();
    }

}