2012-09-27 9 views
6

enter image description heresetBackgroundColor w android

W tej prostej grze Chcę zmienić kolor tła przycisku że nacisnąć. Ale otrzymuję następujący wynik, wygląd przycisków nie jest dobry (kształt się zmienia):

pressedButton.setBackgroundColor(Color.RED); 

Czy jest lepszy sposób na zrobienie tego? Dzięki.

[Edit: mój pełny kod]

package com.example.xo_game; 

import android.os.Bundle; 
import android.app.Activity; 
import android.graphics.Color; 
import android.view.Menu; 
import android.view.View; 
import android.widget.Button; 

public class MainActivity extends Activity { 

    Button[] btns; 
    char[][] gameState = new char[3][3]; 
    char turn = 'X'; 

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

     Button[] btns = new Button[9]; 

     btns[0] = (Button) findViewById(R.id.btn1); 
     btns[1] = (Button) findViewById(R.id.btn2); 
     btns[2] = (Button) findViewById(R.id.btn3); 

     btns[3] = (Button) findViewById(R.id.btn4); 
     btns[4] = (Button) findViewById(R.id.btn5); 
     btns[5] = (Button) findViewById(R.id.btn6); 

     btns[6] = (Button) findViewById(R.id.btn7); 
     btns[7] = (Button) findViewById(R.id.btn8); 
     btns[8] = (Button) findViewById(R.id.btn9); 

     for (int i = 0; i < 9; i++) { 
      btns[i].setTag(i); 
      btns[i].setOnClickListener(clickListener); 
      gameState[i/3][i % 3] = 'E'; 
     } 
    } 

    View.OnClickListener clickListener = new View.OnClickListener() { 

     public void onClick(View v) { 
      Button pressedButton = (Button) v; 

      int indexOfPressedButton = Integer.parseInt(pressedButton.getTag() 
        .toString()); 

      int row = indexOfPressedButton/3; 
      int col = indexOfPressedButton % 3; 

      if (gameState[row][col] != 'E') 
       return; 

      gameState[row][col] = turn; 

      String turnAsString = String.valueOf(turn); 

      pressedButton.setText(turnAsString); 

      if (turn == 'X') { 
       pressedButton.setBackgroundColor(Color.RED); 
       turn = 'O'; 
      } else { 
       pressedButton.setBackgroundColor(Color.GREEN); 
       turn = 'X'; 
      } 
     } 
    }; 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.activity_main, menu); 
     return true; 
    } 
} 
+1

dodaj swój kod! – Shrikant

+0

wpis edytowany, dodałem pełny kod. –

+0

dzięki za pytanie - to było dokładnie moje pytanie! –

Odpowiedz

17
pressedButton.getBackground().setColorFilter(Color.RED, PorterDuff.Mode.MULTIPLY); 
+1

Klasa PorterDuff nie jest zdefiniowana. Czy mam coś importować? –

+2

import android.graphics.PorterDuff; –

+1

miło, teraz działa. –

0

spróbuj tego:

trzeba tworzyć tak w xml ImageButton

utworzyć plik xml za pomocą przycisku obraz takiego

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
<item 
android:state_pressed="true" 
android:drawable="@drawable/backbutton" /> 
<item 
android:drawable="@drawable/closebutton" /> 
</selector> 

dodać ten plik xml jako tło dla ImageButton

<ImageButton     
android:layout_height="50px" 
android:layout_width="50px" 
android:id="@+id/settings" 
android:background="@drawable/settings_button" //setting_button in 
                the xml file    
android:text="Settings"/> 
6

utworzyć plik selektor dowolną nazwę jak button_selector.xml w rozciągliwej folderze

redakcją gradientem

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android" > 
    <item android:state_pressed="true"> 
     <shape android:shape="rectangle"> 
      <corners android:radius="5dp"/> 
      <gradient android:startColor="#ad1c1c" android:endColor="#cc3737" android:angle="90"/> 
      <padding android:left="10.0dip" android:top="10.0dip" 
       android:right="10.0dip" android:bottom="10.0dip"/> 
      <stroke android:width="1.0dip" android:color="#7d0000"/> 
     </shape> 
    </item> 
    <item android:state_pressed="false"> 
     <shape android:shape="rectangle"> 
      <corners android:radius="5dp"/> 
      <gradient android:startColor="#cfcfcf" android:endColor="#ebebeb" android:angle="90"/> 
      <padding android:left="10.0dip" android:top="10.0dip" 
       android:right="10.0dip" android:bottom="10.0dip"/> 
      <stroke android:width="1.0dip" android:color="#8f8f8f"/> 
     </shape> 
    </item> 
</selector> 

następnie ustawić w przycisk tle

<Button 
    android:background="@drawable/button_selector" 
/> 
+0

Dziękuję za odpowiedź, ale tak naprawdę uzyskałem prawie poprzedni wynik. –

+0

Jeśli jest poprawna, musisz zaakceptować jedną z odpowiedzi, która jest najbliższa Twojemu rozwiązaniu. – Pratik

+0

Próbuję wszystkich odpowiedzi jeden po drugim. Jak dotąd wszystkie z nich zmieniają kształt przycisku na kwadrat. –

1

Jak @pratik powiedział zapisać button.xml w rozciągliwej folderze

button.xml

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android" > 
    <item android:state_pressed="true"> 
     <shape android:shape="rectangle"> 
      <corners android:radius="5dp"/> 
      <solid android:color="#f00"/> 
      <padding android:left="10.0dip" android:top="10.0dip" 
       android:right="10.0dip" android:bottom="10.0dip"/> 
      <stroke android:width="1.0dip" android:color="#222"/> 
     </shape> 
    </item> 
    <item android:state_pressed="false"> 
     <shape android:shape="rectangle"> 
      <corners android:radius="5dp"/> 
      <solid android:color="#f1f1f1"/> 
      <padding android:left="10.0dip" android:top="10.0dip" 
       android:right="10.0dip" android:bottom="10.0dip"/> 
      <stroke android:width="1.0dip" android:color="#222"/> 
     </shape> 
    </item> 
</selector> 

Zastosuj ten przycisk jako tło

<Button 
    android:background="@drawable/button"/> 

i w pliku klasy nie podoba to

, aby czerwony kolor był stabilny

+1

hmmm skopiuj odpowiedź, ale potrzebujesz luki do usunięcia przez użytkownika źródłowego, zmieniając skopiowaną odpowiedź z inną wartością – Pratik