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 dole1. 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
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
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
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
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
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