JAVA ANDROID 07 (p) - Collages

JAVA ANDROID 07 (p) - Collages
ukryj menu
SPEC
aktualizacja: 2022-04-29 11:11:22

Na dziś edycja i tworzenie poniższych ekranów:

CollageActivity - statyczny xml, kilka rysunków różnych układów kolaży, przejście do CollageMakerActivity
CollageMakerActivity - wyświetlenie kolażu złożonego z kliku ImageView (dynamicznych), opcje w menu na dole

1. Konstrukcja klasy do przesyłu danych - interfejs Serializable

tworzymy klasę na dane np

class ImageData{}kopiuj

dodajemy 4 prywatne pola w tej klasie: x,y,w,h i konstruktor
tworzymy gettery do tych pól (Generate / Getters)
tworzymy listę na obiekty tej klasy

private ArrayList<ImageData> list = new ArrayList<>();kopiuj

implementujemy w klasie interfejs Serializable umożliwiający przesył pomiędzy Activities złożonych, a nie prostych danych

class ImageData implements Serializable{}kopiuj

dodajemy dane zdjęcia do listy jak poniżej

list.add(new ImageData(0,0,100,100));kopiuj

oczywiście dane jakie przekażemy do listy są uzależnione od przewidywanego później układu kolażu


2. Przesył i deserializacja danych

naszą listę przesyłamy w intencie do kolejnej Activity

intent.putExtra("list", list);kopiuj

przesłane dane czytamy w drugiej Activity:

ArrayList<ImageData> list = (ArrayList<ImageData>) getIntent().getExtras().getSerializable("list");kopiuj

lub

ArrayList<ImageData> list = (ArrayList<ImageData>) getIntent().getSerializableExtra("list");
Log.d("lista","rozmiar listy 1 "+list.get(1).getX());kopiuj


dynamicznie tworzymy i ustawiamy ImageView w odpowiedniej pozycji

iv.setX(100);
iv.setY(100);
iv.setLayoutParams(new LayoutParams(w,h));kopiuj


dynamicznie utworzone ImageView dodajemy do FrameLayout (w którym można pozycjonować absolutnie x,y)

<FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#ff0000" />kopiuj


3. wielkość ekranu

podczas określania wielkości może choć nie musi się przydać wielkość ekranu urządzenia

Display display = getWindowManager().getDefaultDisplay();kopiuj
Point size = new Point();
display.getSize(size);
Log.d("xxx","szerokość ekranu " + size.x);
Log.d("xxx","wysokość ekranu " +size.y);kopiuj



4. pobranie danych z galerii i aparatu

jak poprzednio w aplikacji

5. Obrót i flip bitmapy

a) obrót - to pobranie bitmapy z danego ImageView lub z jakiejś zmiennej w której jest trzymana, wykonanie obrotu i ponowne wstawienie do ImageView

Matrix matrix = new Matrix();
matrix.postRotate(90);

Bitmap oryginal = ((BitmapDrawable) anyImageView.getDrawable()).getBitmap();
Bitmap rotated = Bitmap.createBitmap(oryginal, 0, 0, oryginal.getWidth(), oryginal.getHeight(), matrix, true);

anyImageView.setImageBitmap(rotated);kopiuj


b) flip - to właściwie skalowanie w x lub y

matrix.postScale(-1.0f, 1.0f);kopiuj

6. Zapis zdjęcia w folderze "kolaże"

najprościej wykonać skrina, który przejmie dane z całego layoutu

a) zezwolenie na wykonanie screena z FrameLayoutu:


frameLayout.setDrawingCacheEnabled(true);kopiuj

b) pobranie bitmapy z frameLayoutu

Bitmap b = frameLayout.getDrawingCache(true);kopiuj

proszę o zapis w folderze "collages"
uwaga: trzeba zabezpieczyć aplikację na wypadek braku folderu "collages"


8. zachowanie danych po zmianie orientacji

zapis danych w zdarzeniu onSaveInstanceState

@Override
protected void onSaveInstanceState(@NonNull Bundle outState) {
   super.onSaveInstanceState(outState);
   outState.putSerializable("list", list);
}kopiuj

odczyt danych w zdarzeniu onRestoreInstanceState

@Override
protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) {
   super.onRestoreInstanceState(savedInstanceState);
   Log.d("aaa", "onRestoreInstanceState: " + savedInstanceState.getSerializable("list"));
}kopiuj

więcej

https://www.journaldev.com/22621/android-onsaveinstancestate-onrestoreinstancestate


Uwaga: w powyżej opisanej sytuacji trzeba się najpierw zastanowić co przesyłamy w obiekcie klasy ImageData


9. ułatwienie pracy

a) dopisanie listenera do wielu buttonów na ekranie wyboru kolaży

bt1.setOnClickListener(listener);
bt2.setOnClickListener(listener);kopiuj

        
listener

private OnClickListener listener = new OnClickListener() {
     @Override
     public void onClick(View v) {
     switch(v.getId()){
          case R.id.bt1:                     
             break;
           case R.id.bt2:                 
             break;             
     }
}kopiuj



b) z użyciem lambd

klik

bt1.setOnClickListener( v -> function (v));
bt2.setOnClickListener( v -> function (v));kopiuj



funkcja

private void function (View v){
   switch(v.getId()){
      case R.id.startCameraBtn:
         break;
      case R.id.showCollageScreenBtn:
         break;
   }
};kopiuj



c) ikony

https://www.flaticon.com/premium-icon/layout_5666355?term=collages&page=1&position=82&page=1&position=82&related_id=5666355