- 권예진(Tab 2)
- 박근영(Tab 3)
- 오지환(Tab 1)
- OS: Android (minSdk: 24, targetSdk: 33)
- Language: Java
- IDE: Android Studio
- Target Device: Galaxy S10
- 상하좌우로 화면을 swipe하여 숫자 cell들을 밀고 합치며 점수를 높일 수 있습니다.
- 우측 상단에 위치한 Reset 버튼을 통해 게임을 초기화할 수 있습니다.
실행 화면
왼쪽부터 차례로 메인 페이지, 연락처 추가 페이지, 세부 정보 페이지입니다.
Major Features
-
연락처 추가
- 우측 상단의 "+" 버튼을 누르면 연락처 추가 페이지로 이동하게 됩니다.
- 이름, 전화번호를 누르면 수정 가능하게 창이 변경되며 값을 입력 후 가상 키보드의 완료를 눌러 값을 저장할 수 있습니다.
- 전화번호는 숫자만 입력해도 자동으로 "010-0000-0000" 형태로 표시됩니다.
- 이후 우측 상단의 "ADD" 를 누르면 연락처 추가가 완료됩니다.
-
연락처 검색
- 상단의 검색창을 눌러 검색을 진행할 수 있습니다.
-
연락처 세부 정보 페이지
- 세부 정보 페이지에서는 다음과 같은 기능들을 사용할 수 있습니다.
- 연락처 수정
- 연락처 삭제
- 전화 걸기
- 문자 보내기
- 영상통화 걸기
- 연락처 우측의 "i" 버튼을 누르면 세부 정보 페이지로 들어가게 됩니다.
연락처 수정
- 세부 정보 페이지에서 이름, 전화 번호를 누르면 수정 가능하게 변경되며, 값을 입력한 후에 가상 키보드의 완료를 누르면 자동으로 값이 수정됩니다.
- 전화번호는 숫자만 입력해도 자동으로 "010-0000-0000" 형태로 표시됩니다.
연락처 삭제
- 세부 정보 페이지에서 삭제 버튼을 누르면 값이 수정되며 기본 페이지로 이동됩니다.
전화 걸기
- 세부 정보 페이지에서 전화기 모양 버튼을 누르면 전화가 자동으로 걸립니다.
문자 보내기
- 세부 정보 페이지에서 우편 모양 버튼을 누르면 문자 보내기 창으로 이동됩니다.
영상통화 걸기
- 세부 정보 페이지에서 캠코더 모양 버튼을 누르면 영상통화가 걸립니다.
- 세부 정보 페이지에서는 다음과 같은 기능들을 사용할 수 있습니다.
기술 설명
- Recycler View 를 이용하여, 연락처 데이터들을 표현합니다.
- 연락처 탭 코드가 다른 탭에 영향을 주는 것을 막기 위해 모든 Logic이 Fragment 안 에 담기도록 구조를 디자인 하였습니다.
- Fragment Container만을 가지고 있는 Fragment를 하나 만들어서 탭 전환 시에는 Container를 가지고 있는 Fragment만을 띄웁니다.
- 실제 탭의 구현은 추가 Fragment들을 만들어 구현한 뒤, Container에 추가 Fragment를 넣어주는 형태로서 위의 목적을 달성하였습니다.
- 이름, 전화번호를 직접 눌러서 수정 가능하도록 만들기 위해서 TextView와 EditText를 겹쳐놓고 수정할 때와 아닐 때에 따라 번갈아가며 visible을 바꿔줌으로서 구현하였습니다.
- FragmentManager 사용
갤러리 초기 화면은GalleryListFragment
에서 GridView를 사용합니다 -> 이미지 선택 시GalleryImageFragment
로 이동하여 ViewPager과 RecyclerView를 이용하여 스와이프할 수 있습니다 - Menuhost와 initMenu()를 사용하여 상단바에 add와 delete 기능을 추가하였습니다.
private void initMenu(MenuHost menuhost){
menuhost.addMenuProvider(new MenuProvider() {
@Override
public void onCreateMenu(@NonNull Menu menu, @NonNull MenuInflater menuInflater) {
menuInflater.inflate(R.menu.menu_gallery, menu);
}
@Override
public boolean onMenuItemSelected(MenuItem menuItem){
if (menuItem.getItemId() == R.id.gallery_add){...}
else if (menuItem.getItemId() == R.id.gallery_del) {
if (editMode) {...}
else {}
}
}
}, getViewLifecycleOwner(), Lifecycle.State.RESUMED);
}
-
다중 삭제를 위한 editMode 변수 설정
DashboardAdapter
아이템 클릭 시 스와이프 창으로 이동 / 삭제할 이미지 선택 (SparseBooleanArray 이용) 중에 작업을 선택해 진행합니다.GalleryListFragment
휴지통 선택 시 편집 모드로 전환 / 선택한 이미지 삭제 중에 작업을 선택해 진행합니다. -
갤러리에서 스크롤 시 로딩 속도 향상을 위해 Glide()를 이용하여 저장, bitmap 압축 기능(Bitmap.createScaledBitmap)을 이용하여 GridView에서 나타날 썸네일을 따로 보여줍니다.
- 상하좌우로 스와이프하여 숫자 cell들을 밀고 합치며 점수를 높일 수 있습니다.
- 우측 상단에 위치한 Reset 버튼을 통해 게임을 초기화할 수 있습니다.
- 숫자 cell 생성
- GridView에 16개의 TextView를 4x4 형태로 배치하여 게임판을 구현하였습니다.
- 각 TextView가 나타낼 숫자 값은 cellValueMatrix라는 2차원 배열에 저장되어 있습니다.
- cell 값에 따른 TextView의 배경색은 HashMap에 저장되어 있습니다.
- swipe
- GestureDetector의 onFling() 메소드에 터치 좌표를 입력 받아 swipe 방향을 인식하는 기능을 추가하였습니다.
- swipe 방향에 따라 cellValueMatrix를 업데이트 하도록 구현하였습니다.
- 기록 저장
- 앱을 종료한 후 다시 실행해도 게임 정보를 유지할 수 있도록 SharedPreferences를 사용하여 게임 진행 상황, 현재 점수, 최고 점수 등 데이터를 파일로 저장하고 불러오도록 구현하였습니다.