如何匹配两个按钮的背景

时间:2013-05-29 15:06:32

标签: java android button background

嗨,我是编程的新手,我知道可能有一些简单的答案,但不能到达那里。

所以基本上我想知道两个按钮的背景图像是否匹配,以及它们是否禁用它们(或其他一些功能)。继承了我的代码,目前我专注于Button1和Button2。

看看结束方法,我知道如果不能工作,但那就是我想要做的事情。感谢。

package com.example.pairsgame;

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

public class MainActivity extends Activity implements OnClickListener {

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


    public final static int Button_Count = 12;

    private Button[] Buttons = new Button[Button_Count];
    {

        Buttons[0] = (Button) findViewById(R.id.Button1);
        Buttons[1] = (Button) findViewById(R.id.Button2);
        Buttons[2] = (Button) findViewById(R.id.Button3);
        Buttons[3] = (Button) findViewById(R.id.Button4);
        Buttons[4] = (Button) findViewById(R.id.Button5);
        Buttons[5] = (Button) findViewById(R.id.Button6);
        Buttons[6] = (Button) findViewById(R.id.Button7);
        Buttons[7] = (Button) findViewById(R.id.Button8);
        Buttons[8] = (Button) findViewById(R.id.Button9);
        Buttons[9] = (Button) findViewById(R.id.Button10);
        Buttons[10] = (Button) findViewById(R.id.Button11);
        Buttons[11] = (Button) findViewById(R.id.Button12);

        Buttons[0].setOnClickListener(this);
        Buttons[1].setOnClickListener(this);
        Buttons[2].setOnClickListener(this);
        Buttons[3].setOnClickListener(this);
        Buttons[4].setOnClickListener(this);
        Buttons[5].setOnClickListener(this);
        Buttons[6].setOnClickListener(this);
        Buttons[7].setOnClickListener(this);
        Buttons[8].setOnClickListener(this);
        Buttons[9].setOnClickListener(this);
        Buttons[10].setOnClickListener(this);
        Buttons[11].setOnClickListener(this);

    }

    public static int Background_Total = 8;

    public final static int[] Backgrounds = { R.drawable.ic_launcher };

    public final static int[] Game_Board = {

    0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5 };

    @Override
    public void onClick(View v) {

        for (final int but = 0; but < Button_Count; but++) {
            if (v == Buttons[but]) {
                new CountDownTimer(1000, 500) {

                    public void onTick(long millisUntilFinished) {
                        Buttons[but].setBackgroundResource(Backgrounds[Game_Board[but]]);
                    }

                    public void onFinish() {
                        Buttons[but].setBackgroundResource(android.R.drawable.btn_default);
                    }
                }.start();
                if (Game_Board[0] == Game_Board[2])
                    Buttons[0].setEnabled(false);
                Buttons[2].setEnabled(false);
            }
        }

    }
}

2 个答案:

答案 0 :(得分:2)

您通常希望将数据与其表示分开。这有许多明显的好处,其中一个是简单的数据测试,而不必关心数据的可视化表示。

首先,您需要将按钮存储在数组中,如下所示:

public final static int BUTTON_COUNT = 12; 

private Button[] buttons = new Button[BUTTON_COUNT];

Button[0] = (Button)findViewById( R.id.Button1 );           // Button 1
Button[1] = (Button)findViewById( R.id.Button2 );           // Button 2
Button[2] = (Button)findViewById( R.id.Button3 );           // Button 3
Button[3] = (Button)findViewById( R.id.Button4 );           // Button 4
Button[4] = (Button)findViewById( R.id.Button5 );           // Button 5
Button[5] = (Button)findViewById( R.id.Button6 );           // Button 6
Button[6] = (Button)findViewById( R.id.Button7 );           // Button 7
Button[7] = (Button)findViewById( R.id.Button8 );           // Button 8
Button[8] = (Button)findViewById( R.id.Button9 );           // Button 9
Button[9] = (Button)findViewById( R.id.Button10 );          // Button 10
Button[10] = (Button)findViewById( R.id.Button11 );         // Button 11
Button[11] = (Button)findViewById( R.id.Button12 );         // Button 12

这将大大增强您使用它们的方式,正如您将在onClick()中看到的那样。

接下来,您需要定义所需的独特背景数量,以及代表每个背景的图像:

public final static int BACKGROUND_TOTAL = 8;

public final static int[] BACKGROUNDS = {
   R.drawable.ic_launcher,                           // Image 0
   R.drawable.ic_launcher2,                          // Image 1
   R.drawable.ic_launcher3,                          // Image 2
   R.drawable.ic_launcher4,                          // Image 3
   R.drawable.ic_launcher5,                          // Image 4
   R.drawable.ic_launcher6,                          // Image 5
   R.drawable.ic_launcher7,                          // Image 6
   R.drawable.ic_launcher8                           // Image 7
};

您还需要定义“游戏板”的外观。这将是一个图像与每个按钮“关联”。这可以通过百万种不同的方式完成,但作为一个例子,让我们使用一个固定的数组。请注意,每个条目都与您的一个按钮匹配:

 public final static int[] GAME_BOARD = {
    0,                                         // Button 1
    0,                                         // Button 2
    1,                                         // Button 3
    1,                                         // Button 4        
    2,                                         // Button 5
    2,                                         // Button 6        
    3,                                         // Button 7
    3,                                         // Button 8        
    4,                                         // Button 9
    4,                                         // Button 10       
    5,                                         // Button 11
    5,                                         // Button 12       
 };

这里的每个值都是BACKGROUNDS数组中的“索引”。因此所有值必须介于0和(BACKGROUND_TOTAL-1)之间。请注意,我刚刚添加了连续对,但显然对于真实游戏,您需要在此处生成随机值。在上面的例子中,按钮3将使用图像1,按钮9将使用图像4,依此类推。

有了所有这些信息,这就是你的onClick的样子:

@Override
public void onClick(View v) {    

   if ( v == buttons[0] )  {
      new CountDownTimer(1000, 500) {
         public void onTick(long millisUntilFinished) {
             buttons[0].setBackgroundResource( BACKGROUNDS[GAME_BOARD[0]] );
         }

         public void onFinish() {
             buttons[0].setBackgroundResource( android.R.drawable.btn_default );
         }
      }.start();       
   }
   if ( v == buttons[1] )  {
      new CountDownTimer(1000, 500) {
         public void onTick(long millisUntilFinished) {
             buttons[1].setBackgroundResource( BACKGROUNDS[GAME_BOARD[1]] );
         }

         public void onFinish() {
             buttons[1].setBackgroundResource( android.R.drawable.btn_default );
         }
      }.start();       
   }
   if ( v == buttons[2] )  {
      new CountDownTimer(1000, 500) {
         public void onTick(long millisUntilFinished) {
             buttons[2].setBackgroundResource( BACKGROUNDS[GAME_BOARD[2]] );
         }

         public void onFinish() {
             buttons[2].setBackgroundResource( android.R.drawable.btn_default );
         }
      }.start();       
   }
   if ( v == buttons[3] )  {
      new CountDownTimer(1000, 500) {
         public void onTick(long millisUntilFinished) {
             buttons[3].setBackgroundResource( BACKGROUNDS[GAME_BOARD[0]] );
         }

         public void onFinish() {
             buttons[3].setBackgroundResource( android.R.drawable.btn_default );
         }
      }.start();       
   }
   if ( v == buttons[4] )  {
      new CountDownTimer(1000, 500) {
         public void onTick(long millisUntilFinished) {
             buttons[4].setBackgroundResource( BACKGROUNDS[GAME_BOARD[4]] );
         }

         public void onFinish() {
             buttons[4].setBackgroundResource( android.R.drawable.btn_default );
         }
      }.start();       
   }
   if ( v == buttons[5] )  {
      new CountDownTimer(1000, 500) {
         public void onTick(long millisUntilFinished) {
             buttons[5].setBackgroundResource( BACKGROUNDS[GAME_BOARD[5]] );
         }

         public void onFinish() {
             buttons[5].setBackgroundResource( android.R.drawable.btn_default );
         }
      }.start();       
   }
   if ( v == buttons[6] )  {
      new CountDownTimer(1000, 500) {
         public void onTick(long millisUntilFinished) {
             buttons[6].setBackgroundResource( BACKGROUNDS[GAME_BOARD[6]] );
         }

         public void onFinish() {
             buttons[6].setBackgroundResource( android.R.drawable.btn_default );
         }
      }.start();       
   }
   if ( v == buttons[7] )  {
      new CountDownTimer(1000, 500) {
         public void onTick(long millisUntilFinished) {
             buttons[7].setBackgroundResource( BACKGROUNDS[GAME_BOARD[7]] );
         }

         public void onFinish() {
             buttons[7].setBackgroundResource( android.R.drawable.btn_default );
         }
      }.start();       
   }
   if ( v == buttons[8] )  {
      new CountDownTimer(1000, 500) {
         public void onTick(long millisUntilFinished) {
             buttons[8].setBackgroundResource( BACKGROUNDS[GAME_BOARD[8]] );
         }

         public void onFinish() {
             buttons[8].setBackgroundResource( android.R.drawable.btn_default );
         }
      }.start();       
   }
   if ( v == buttons[9] )  {
      new CountDownTimer(1000, 500) {
         public void onTick(long millisUntilFinished) {
             buttons[9].setBackgroundResource( BACKGROUNDS[GAME_BOARD[9]] );
         }

         public void onFinish() {
             buttons[9].setBackgroundResource( android.R.drawable.btn_default );
         }
      }.start();       
   }
   if ( v == buttons[10] )  {
      new CountDownTimer(1000, 500) {
         public void onTick(long millisUntilFinished) {
             buttons[10].setBackgroundResource( BACKGROUNDS[GAME_BOARD[10]] );
         }

         public void onFinish() {
             buttons[10].setBackgroundResource( android.R.drawable.btn_default );
         }
      }.start();       
   }
   if ( v == buttons[11] )  {
      new CountDownTimer(1000, 500) {
         public void onTick(long millisUntilFinished) {
             buttons[11].setBackgroundResource( BACKGROUNDS[GAME_BOARD[11]] );
         }

         public void onFinish() {
             buttons[11].setBackgroundResource( android.R.drawable.btn_default );
         }
      }.start();       
   }
   if ( v == buttons[12] )  {
      new CountDownTimer(1000, 500) {
         public void onTick(long millisUntilFinished) {
             buttons[12].setBackgroundResource( BACKGROUNDS[GAME_BOARD[12]] );
         }

         public void onFinish() {
             buttons[12].setBackgroundResource( android.R.drawable.btn_default );
         }
      }.start();       
   }
}

最后,您可以简单地使用以下内容来测试两个图像,而不是匹配图像 按钮具有相同的背景:

if ( GAME_BOARD[button1] == GAME_BOARD[button2] )
   // disable both buttons

在这种情况下,button1和button2应该是其数组中按钮的索引值。

虽然这是一个粗略的例子,但它应该让你以一种不同的,更恰当的方式思考问题。祝你好运!

答案 1 :(得分:0)

你的逻辑可能不应该依赖于按钮的背景图像,它们是UI元素,它们应该与游戏的逻辑分离(关注点分离)。

我要做的是保留在内存中(可能在Application中?)一个“知道”哪个图像被设置为每个按钮的背景的结构,并使用它来比较和驱动禁用链接按钮:您可以使用您编写的方法来比较两个图像对象(可能来自某种ID?),然后相应地设置按钮,而不是尝试比较两个UI元素,而不是尝试比较两个UI元素。

除了其他好处(关注点分离,更清晰的设计等),这将使您的逻辑可测试。