将 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();
}
}
我有 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();
}
}