Nowy projekt: Kolory
Zadaniem aplikacji jest zmiana koloru panelu za pomocą trzech suwaków.
1. Nowy projekt dla API 15 o nazwie Kolory z aktywnością KolorActivity (tym razem należy wybrać Empty Activity)
(warto dbać o unikalność nazw aktywności w jednym pakiecie!)
2. W pliku res/layout/activity_kolory.xml (nie ma pliku content_main.xml) umieszczamy kod interfejsu
**
Ignorujemy ostrzeżenie związane z etykietą TextView.
TextView może mieć zmieniany kolor tła - będzie wobec tego
pełnił rolę panela zmieniającego kolor po ruchu suwaków.
3. W pliku src/../KoloryActivity.java umieszczamy kod:
import android.widget.*;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.graphics.Color;
public class KoloryActivity extends Activity {
//pola
private TextView etykieta_panel; //Label, pełni też rolę panela
private SeekBar seekBarR,seekBarG,seekBarB; //TrackBar
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_kolory);
etykieta_panel=(TextView)findViewById(R.id.etykieta_panel);
seekBarR=(SeekBar)findViewById(R.id.seekBarR);
seekBarG=(SeekBar)findViewById(R.id.seekBarG);
seekBarB=(SeekBar)findViewById(R.id.seekBarB);
seekBarR.setOnSeekBarChangeListener(seekBarChangeListener);
seekBarG.setOnSeekBarChangeListener(seekBarChangeListener);
seekBarB.setOnSeekBarChangeListener(seekBarChangeListener);
}
//nasluchiwacz dla seekbarow
private OnSeekBarChangeListener seekBarChangeListener = new OnSeekBarChangeListener()
{
public void onStopTrackingTouch(SeekBar seekBar) {
//nie używane
}
public void onStartTrackingTouch(SeekBar seekBar) {
//nie używane
}
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser)
{
int r=seekBarR.getProgress();
int g=seekBarG.getProgress();
int b=seekBarB.getProgress();
etykieta_panel.setBackgroundColor(Color.argb(255,r,g,b));
etykieta_panel.setText(
"Składowe koloru: "+
Integer.toHexString(r).toUpperCase()+" "+
Integer.toHexString(g).toUpperCase()+" "+
Integer.toHexString(b).toUpperCase());
int jasnosc=(r+g+b)/3;
if (jasnosc>127) etykieta_panel.setTextColor(Color.BLACK);
else etykieta_panel.setTextColor(Color.WHITE);
}
};
}
** Skompiluj, uruchom i przetestuj
4. Zmieńmy tło suwaków tak, żeby każdy miał kolor odpowiadający składowej którą zmienia.
Użyjemy do tego liniowego gradientu.
W metodzie KolorActivity.onCreate umieśćmy polecenia:
//konfigurowanie suwaków z poziomu kodu
float promien = 8;
float[] zewnetrznePromienie = new float[] { promien, promien, promien, promien, promien, promien, promien, promien };
RoundRectShape rrs = new RoundRectShape(zewnetrznePromienie,null,null);
ShapeDrawable sdR=new ShapeDrawable(rrs);
sdR.getPaint().setShader(new LinearGradient(0, 0, 200, 0, Color.BLACK, Color.RED, TileMode.CLAMP));
seekBarR.setProgressDrawable(sdR);
ShapeDrawable sdG=new ShapeDrawable(rrs);
sdG.getPaint().setShader(new LinearGradient(0, 0, 200, 0, Color.BLACK, Color.GREEN, TileMode.CLAMP));
seekBarG.setProgressDrawable(sdG);
ShapeDrawable sdB=new ShapeDrawable(rrs);
sdB.getPaint().setShader(new LinearGradient(0, 0, 200, 0, Color.BLACK, Color.BLUE, TileMode.CLAMP));
seekBarB.setProgressDrawable(sdB);
Powyższy kod wymaga importu:
import android.graphics.LinearGradient;
import android.graphics.drawable.ShapeDrawable;
import android.graphics.drawable.shapes.RoundRectShape;
import android.graphics.Shader.TileMode;
* Lepiej byłoby to zrobić z pliku activity_kolor.xml -> KONKURS NA NAJLEPSZY PROJEKT
** Skompiluj, uruchom i przetestuj
5. Ostatnim elementem będzie rozwijana lista (ComboBox, który tu nazywa się Spinner)
a. Do activity_kolory.xml dodajmy:
b. Jego własność prompt to łańcuch, który musi być zdefiniowany w pliku res/values/strings.xml:
Kolory
Ponadto tworzymy plik res/values/tablica_kolorow.xml, w którym umieszczamy tablicę łańcuchów:
- Wskazany przez suwaki
- Czarny
- Biały
- Czerwony
- Zielony
- Niebieski
- Turkusowy
- Purpurowy
- Żółty
- Szary
c. W pliku KoloryActivity.java, w klasie KoloryActivity zdefiniujmy pola
private Spinner spinner; //ComboBox
private boolean czyUstawicSpinnerNaSuwaki=true;
Drugie pole będzie regulowało uwaktualnianiem suwaków i rozwijanej listy. Poruszenie suwaków
spowoduje ustawienie listy na "Wskazany przez suwaki".
d. W metodzie KoloryActivity.onCreate dodajmy polecenia:
//rozwijana lista
spinner = (Spinner) findViewById(R.id.spinner);
ArrayAdapter> adapter = ArrayAdapter.createFromResource(
this, R.array.kolory, android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(adapter);
spinner.setOnItemSelectedListener(itemSelectedListener);
spinner.setSelection(9);
e. Nasłuchiwacz itemSelectedListener powinien mieć następującą postać (pole klasy KoloryActivity):
//nasłuchiwacz dla rozwijanej listy
private OnItemSelectedListener itemSelectedListener = new OnItemSelectedListener()
{
@Override
public void onItemSelected(AdapterView> parent, View view, int position, long id)
{
czyUstawicSpinnerNaSuwaki=false;
switch(position)
{
case 0:
break;
case 1: //czarny
seekBarR.setProgress(0);
seekBarG.setProgress(0);
seekBarB.setProgress(0);
break;
case 2: //biały
seekBarR.setProgress(255);
seekBarG.setProgress(255);
seekBarB.setProgress(255);
break;
case 3: //czerwony
seekBarR.setProgress(255);
seekBarG.setProgress(0);
seekBarB.setProgress(0);
break;
case 4: //zielony
seekBarR.setProgress(0);
seekBarG.setProgress(255);
seekBarB.setProgress(0);
break;
case 5: //niebieski
seekBarR.setProgress(0);
seekBarG.setProgress(0);
seekBarB.setProgress(255);
break;
case 6: //turkusowy
seekBarR.setProgress(0);
seekBarG.setProgress(255);
seekBarB.setProgress(255);
break;
case 7: //purpurowy
seekBarR.setProgress(255);
seekBarG.setProgress(0);
seekBarB.setProgress(255);
break;
case 8: //żółty
seekBarR.setProgress(255);
seekBarG.setProgress(255);
seekBarB.setProgress(0);
break;
case 9: //szary
seekBarR.setProgress(127);
seekBarG.setProgress(127);
seekBarB.setProgress(127);
break;
}
czyUstawicSpinnerNaSuwaki=true;
}
public void onNothingSelected(AdapterView> parent)
{
//nic nie rób
}
};
f. Wymaga importu pakietów:
import android.widget.AdapterView.*;
import android.view.View;
g. I wreszcie do nasłuchiwacza suwaków seekBarChangeListener, do jego metody onProgressChanged
dodajmy (na samym końcu) polecenie:
if(czyUstawicSpinnerNaSuwaki) spinner.setSelection(0);