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);