안드로이드 개발 스킬을 향상시키는 오픈소스 앱 20가지

이 글은 20+ Awesome Open-Source Android Apps To Boost Your Development Skill의 핵심적인 부분을 이해하기 쉽도록 의역하였습니다.

읽는다는 것은 배움에 있어서 가장 좋은 방법입니다. 개발자에게도 마찬가지입니다. 더 발전하는 개발자가 되고 싶다면 많은 코드를 읽어야 합니다. 이것 만큼이나 간단한 방법은 없습니다.

책, 블로그, 커뮤니티에도 좋은 읽을거리가 많이 올라오지만 하나의 앱을 작동하는 전체 앱은 훨씬 더 완벽하게 배울 수 있습니다. 이 글을 통해 다양한 카테고리 및 장르 중 최고의 오픈소스 안드로이드 앱을 소개하고 학습에 필요한 부분에 대해 살펴보겠습니다. Play 스토어에서 직접 앱을 사용해 보고 구현된 코드를 직접 볼 수 있습니다. 각 앱에 첨부된 난이도를 통해 자신의 역량에 따라 선택하셔서 보시길 추천합니다.

LeafPic

(Github | Play 스토어 | 난이도: 초급)

안드로이드 기기에서 찾아볼 수 있는 가장 흔한 사진 및 동영상 갤러리 앱입니다. 오픈소스로 공개되어 있는 최고의 갤러리 앱 중 하나입니다. 아주 간단하며 이해하기 쉽기 때문에 초급 개발자에게 적합합니다. 또한 동적 테마를 구현 방식을 사용하기 때문에 이와 관련된 기능을 배울 수 있습니다.

Simple Calendar

(Github | Play 스토어 | 난이도: 초급)

Kotlin을 사용하여 작성된 간단하고 사용하기 쉬운 달력앱입니다. Kotlin을 배우고자 한다면 가장 좋은 방법 중 하나가 될것 입니다. 이 프로젝트에서 배울 수있는 점은 완전히 새로운 언어로 개발해 볼 수 있다는 것과 안드로이드 위젯을 만들수 있다는 것입니다.

Amaze File Manager

(Github | Play 스토어 | 난이도: 중급)

거의 모든 안드로이드 기기에서 볼 수 있는 파일 관리자 앱입니다. 파일 관리자 앱은 모든 안드로이드 플랫폼과 모든 기기에서 사용할 수 있는 멋진 호환성을 자랑합니다. 특히, 플랫폼 버전에 따라 SD카드 마운트를 처리하는 방법을 배울 수 있습니다. 그러나 이 프로젝트에서 사용된 코딩 표준을 따르지 않는 것이 좋습니다.

Easy Sound Recorder

(Github | Play 스토어 | 난이도: 초급)

간단하고 사용하기 쉬운 사운드 레코드 앱입니다. 안드로이드에서 오디오 녹음과 컨트롤에 대해 배우고 싶다면 처음으로 접하기 가장 좋은 프로젝트입니다.
매우 작은 규모의 프로젝트로 이해하기도 매우 쉽습니다. 덤으로 머티리얼 디자인의 기초를 배울 수도 있습니다.

MLManager

( Github | Play 스토어 | 난이도: 초급)

MLManager는 안드로이드 기기를 위한 앱 관리 기능을 가진 앱입니다. 기기에 설치 괸 앱에 대한 상세한 정보를 얻거나 APK를 추출하며, 제거 기능을 배울 수 있습니다. 코딩 표준을 잘따라 작성되었으며, 머티리얼 디자인 가이드라인을 적용하여 심플한 모습을 갖추었기 때문에 좀 더 좋은 아이디어를 얻을 수도 있습니다.

PhotoAffix

(Github | Play 스토어 | 난이도: 초급)

사진을 가로또는 세로로 회전하여 편집할 수 있는 매우 간단한 앱입니다. 안드로이드 개발의 기초를 배우기 위해 적합하며 코딩 표준을 잘 지키고 있습니다. 기초를 바탕으로 나중에 복잡한 사진 뷰어를 만들기 위해 유용한 방법은 많이 배울 수 있습니다.

MovieGuide

(Github | 난이도: 중급)

영화 예고편 및 리뷰로 인기 있는 영화를 보여주는 간한단 앱입니다. MVP모델을 도입하였으며 클린 아키텍처를 돕는 RxJava, Dagger2를 사용하였습니다. 매우 간단한 프로젝트이지만 최신 유행 중인 기술을 배울 수 있는 좋을 기회를 제공합니다.

AnExplorer

(Github | Play 스토어 | 난이도: Intermediate)

파일 관리자의 앱이며 태블릿 지원을 위해 필요한 사항들을 배울 수 있습니다. 파일 처리, Rooting 관리, Loader, 커스컴 View 등을 배울 수 있습니다.

Minimal ToDo

(Github | Play 스토어 | 난이도: 초급)

초보자에게 아주 적합한 프로젝트입니다. 안드로이드의 기본적인 부분을 대부분 배울수 있습니다. 단, 코딩 표준은 지켜지지 않았으며 패키지 구조 또한 배우지 말아야 합니다.

Timber

(Github | Play 스토어 | 난이도: Advanced)

아름답게 디자인된 안드로이드 음악 재생앱입니다. 로컬 음악을 보여주고 음악을 재생합니다. 이 프로젝트는 매우크며 초보자에게는 어려우며 중급자 이상이면 배울만할것 입니다.

AnotherMonitor

(Github | Play 스토어 | 난이도: 중급)

안드로이드 프로세스, 메모리 사용량, CPU사용량 및 이와 관련된 것들을 모아 모니터링 하는 프로젝트입니다. 이해하기 쉽고 작지만 코딩 표준, 아키텍처 및 전체 디자인은 배우지 말아야할 부분입니다.

InstaMaterial

(Github | 난이도: 초급)

머티리얼 디자인 가이드를 잘 적용하여 관련된 스킬을 배우기 좋은 프로젝트입니다. Instargram 앱의 일부를 동일하게 구현하려고 시도했으며, 머티리얼에 사용된 애니메이션, 트렌지션을 배울 수 있습니다. 이해하기 쉬우며 간단하며 설계 능력을 향상하기 위해 이상적입니다.

CoCoin

(Github | 난이도: 쉬움)

개인 금융및 회계솔루션 프로젝트입니다. 데이터 관리하는 방법과 그 데이터를 바탕으로 아름다운 차트를 커스컴 View를 통해 보여줍니다.

OmniNotes

(Github | Play 스토어 | 난이도: 중급)

Evernote와 같은 완벽한 기능을 가진 노트작성 앱입니다. 노트 공유및 검색, 이미지, 비디오, 오디오를 첨부 할 수 있으며, 스케치, 미리알림등 많은 기능이 구현되어 있는 상당히 큰 규모의 프로젝트입니다. 또한 Google Now와 완벽히 통합된다는 점에서 많은 것을 배울 수 있습니다.

Clip Stack

(Github | Play 스토어 | 난이도: 초급)

클립보드(복사) 관리자 앱입니다. 프로젝트는 아주 단순하며 작습니다. 프로젝트에 사용된 패키지 구조나 아키텍쳐 등은 표준이 아니기 때문에 배우지 않았으면 좋겠습니다. 이 프로젝트는 안드로이드의 기본 기능을 잘 활용한 좋은 아이디어를 바탕으로 매우 간단하게 만들어졌다는 점에서 배울만합니다.

Super Clean Master

(Github | 난이도: 고급)

클린 마스터는 안드로이드 유저라면 한 번씩 사용해본 경험이 있을 것입니다. 성능 향상을 위해 불필요한 데이터를 정리하는 앱입니다. 프로젝트 전반적으로 약간 복잡하고 코드를 이해하기 위해 약간의 시간이 필요합니다. 고급자에게 추천합니다.

Travel Mate

(Github | 난이도: 중급)

여행 기반의 앱으로 위치와 지도에 대해 많은 것을 배울 수 있는 프로젝트입니다. 디자인과 코드품질을 그렇게 좋지는 않지만 지도와 위치정보를 어떻게 다루는지에 대해 초보자와 중급자들에게는 많은 배움거리가 될 것 같습니다.

KISS

(Github | Play 스토어 | 난이도: 중급)

정말 가벼운 런처 응용 프로그램입니다. 런처를 만들고 싶다면 이것으로 시작하기좋습니다.

Turbo Editor

(Github | Play 스토어 | 난이도: 중급)

심플한 텍스트 편집 앱입니다. 프로그래밍 언어 구문에 대해 보기편한 뷰어를 지원합니다. 큰 텍스트 파일인경우 한번에 메모리에 올리지 않고 구간별로 잘라서 처리하는 섬세함까지 보여줍니다.

Wally

(Github | 난이도: 초급)

웰페이퍼(배경화면) 앱입니다. 매우 간단하지만 웰페이퍼앱을 만들고 싶은 초보 개발자들에게 매우 유용합니다.

Pedometer

(Github | 난이도: 초급)

하드웨어 센서를 이용하여 만보계의 기능을 구현한 앱입니다. 최적화를 통해 기기의 배터리 성능에 거의 영향을 주지 않습니다. 좋은 프로젝트이긴 하나 코딩 표준과 디자인면에서는 좋지 않습니다.

안드로이드의 기본적인 기능을 구현하기 위해 필요한 대부분의 장르의 오픈소스를 몇 가지 살펴보았습니다. 이 오픈소스를 통해 개발 스킬을 향상하는데 도움이 되었으면 합니다.

안드로이드 머티리얼 디자인 위젯 오픈소스 21가지

안드로이드 롤리팝이 발표되면서 머티리얼 디자인에 대한 관심과 함께 관련된 위젯이 오픈소스로 많이 공개되었다. 얼마 전까지만 해도 디자인적인 부분만을 고려해서 개발되어 었다면 이제는 성능도 함께 고려하여 성능이 우수한 위젯들이 속속 등장/업데이트되고 있는 추세다. 자신의 앱을 하위 호환성까지 유지해가며 머티리얼 디자인으로 바꿀 수 있는 유용한 위젯들을 몇 가지 소개한다.

 

1. MaterialDesignLibrary 머티리얼 관련된 위젯 모음
https://github.com/navasmdc/MaterialDesignLibrary#flat-button

 

2. MaterialEverywhere AppCompat 21 적용 예제 (블로그)
https://github.com/antoniolg/MaterialEverywhere

 

3. MaterialWidget Android 4.0 ~ 4.4에서 사용할 수 있는 머티리얼 관련 위젯 모음
https://github.com/keithellis/MaterialWidget

 

4. MaterialTabs 머티리얼 스타일의 탭바
https://github.com/neokree/MaterialTabs

 

5. material-ripple View에 Ripple 효과
https://github.com/balysv/material-ripple

 

6. RippleEffect View에 Ripple, Zoom 등 다양한 효과 (API 9+)
https://github.com/traex/RippleEffect

 

7. LDrawer Appcompat 21 툴바의 ArrowDrawable
https://github.com/ikimuhendis/LDrawer

 

8. material-design-icons 구글이 공개한 아이콘 모음
https://github.com/google/material-design-icons

 

9. AndroidMaterialDesignToolbar 머티리얼 디자인의 다양한 위젯을 적용한 예제
https://github.com/tekinarslan/AndroidMaterialDesignToolbar

 

10. MaterialEditText 머티리얼 디자인의 텍스트 입력 위젯
https://github.com/rengwuxian/MaterialEditText

 

11. material-menu Path Animation으로 툴바의 메뉴, 선택, 이전버튼
https://github.com/balysv/material-menu

 

12. material-dialogs Dialog를 상속받아 커스텀 레이아웃으로 구현한 머티리얼 디자인의 다이얼로그
https://github.com/afollestad/material-dialogs

 

13. MaterialNavigationDrawer Navigation Drawer를 쉽게 사용 할 수 있도록 Activity를 구현. 또한 Drawer 내 구현해 놓은 섹션을 쉽게 추가 가능.
https://github.com/neokree/MaterialNavigationDrawer

 

14. MaterialDialog 머티리얼 디자인의 다이얼로그로 일반 텍스트, 리스트, 입력 텍스트등 다양한 형태 지원(API 8+)
https://github.com/drakeet/MaterialDialog

 

15. materialish-progress 머티리얼 디자인의 로딩 프로그래스(API 9+)
https://github.com/pnikosis/materialish-progress

 

16. MaterialList CardView를 머티리얼 디자인 가이드라인에 맞는 다양한 형태를 지원
https://github.com/dexafree/MaterialList

 

17. android-floating-action-button 머티리얼 디자인 가이드의 화면에 떠 있는 원형의 액션 버튼으로 리스트뷰와 리사이클러뷰의 스크롤에 따른 액션 지원액션
https://github.com/futuresimple/android-floating-action-button

 

18. Android-Material-circular-button 원형의 버튼으로 컬러값의 변경시 애니메이션 지원
https://github.com/glomadrian/Android-Material-circular-button

 

19. material-drawer DrawerLayout의 컨텐츠 뷰를 머티리얼 디자인 가이드에 맞게 쉽게 사용가능.
https://github.com/HeinrichReimer/material-drawer

 

20. snackbar 머티리얼 디자인 가이드에서 소개한 스낵바를 사용 할 수 있도록 지원. 토스트와 비슷하며 지속적으로 메시지를 노출 하거나 사용자의 액션을 받을 수 있음.
https://github.com/nispok/snackbar

 

21. material-range-bar 범위를 선택 할 수 있는 SeekBar
https://github.com/oli107/material-range-bar

 

 

더 많은 UI는 아래 사이트 참고:
https://kmshack.github.io/AndroidUICollection

안드로이드 PullToRefresh 오픈소스 2가지의 구현방식

안드로이드의 새로고침 View중 가장 흔하게 쓰이는 것은 Chris Banes가 오픈소스로 공개한 PullToRefresh이다. 현재 지원이중단된 Android-PullToRefresh와 새롭게 만든 ActionBar-PullToRefresh 2가지의 종류로 구분된다.



Android-PullToRefresh의 구현 방식

ListView에 Layout을 한번더 감싸서 터치이벤트에 대한 처리를 통해 새로고침 콜백을 처리 하는 방식으로 각각의 스크롤되는 View에 대해 새로고침 View를 구현했다.

 


ActionBar-PullToRefresh의 구현방식

Layout의 터치이벤트에 대한 새로고침 상태를 콜백(delegate) 해주는 방식이다. PullToRefreshLayout을 통해 내부에 스크롤되는 뷰가 있다면 새로고침에 대한 콜백을 제공해주어 개발자는 다양한 형태 새로고침 상태에 대한 View를 만들 수 있다.

 

<uk.co.senab.actionbarpulltorefresh.extras.actionbarsherlock.PullToRefreshLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/ptr_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">


    <GridView
        android:id="@+id/ptr_gridview"
        android:layout_height="fill_parent"
        android:layout_width="fill_parent"
        android:numColumns="auto_fit"
        android:verticalSpacing="1dp"
        android:horizontalSpacing="1dp"
        android:columnWidth="100dp"
        android:stretchMode="columnWidth"
        android:gravity="fill" />


</uk.co.senab.actionbarpulltorefresh.extras.actionbarsherlock.PullToRefreshLayout>

 

Android-PullToRefresh에서 ActionBar-PullToRefresh의 코드가 상당량 줄었으며, 스크롤되는 뷰와 의존적이지 않기 때문에 확장성이 높다. 예전에 ListView를 커스텀 하는 경우 PullToRefresh코드를 일부 수정해야 했었는데, 현재 버전에서는 그럴일이 전혀 없어졌다.

 

레이아웃 내부의 스크롤되는 View를 찾아서 HeaderTransformer를 통해 새로고침에 대한 상태를 콜백 해준다. 새로고침 중, 시작, 보이기, 숨기기등에 대한 상태를 알려주며 여기에 맞게 개발자는 View상태를 구현하면 된다.

 

 

 

Android View 관련된 오픈소스 정리

Android View와 관련된 오픈소스들이 많이 공개 되고 있다. 그래서 많이 쓰이고 유용한 오픈소스를 정리 해보았다.  아직 국내에서는 오픈소스가 인색한지 모두 외국에서 만든것들이다. 나도 View관련 오픈소스를 하나준비 하겠다고 준비중인데.. 준비중이기만 하다.

 

참고로, 잘 알려지고 검증된 오픈소스라도 코드를 하나하나씩 보고 어떻게 구현되어 있는지 꼭 살펴보고 썼으면 좋겠다. 그리고 이제 개발을 시작한지 얼마 안된 분들이라면 이런 오픈소스를 사용함으로 자기 실력을 죽일 수도 있으니 한번씩 구현해보는 것도 좋을듯 하다.

 

그리고 국내 개발 커뮤니티에 보면 자기가 개발할 것에 대해 오픈소스를 찾음으로써 개발해서 삽질 하기전에 찾아서 다행이다라는 글들을 보면 씁쓸하다. 오픈소스는 좋은점도 있지만 그에 반하는 양면성을 가지고 있다는 것에 조심했으면 좋겠다.

 

 

아무튼 아래것들은 이미 유명하고 잘만들어진 오픈소스들이다.

 

 

 

 

1. ActionbarSherlock

허니컴부터 적용된 액션바를 이전버전에도 사용할 수 있게 해준다.

 

http://www.actionbarsherlock.com/
https://github.com/JakeWharton/ActionBarSherlock

 

ActionBarSherlock is an standalone library designed to facilitate the use of the action bar design pattern across all versions of Android through a single API.

The library will automatically use the native ActionBar implementation on Android 4.0 or later. For previous versions which do not include ActionBar, a custom action bar implementation based on the sources of Ice Cream Sandwich will automatically be wrapped around the layout. This allows you to easily develop an application with an action bar for every version of Android from 2.x and up.

 

 

 

2. Android-PullToRefresh

ListView, ScrollView, Viewpager, WebView 등 새로고침 기능의 View를 만들어 준다.

 

https://github.com/chrisbanes/Android-PullToRefresh

 

This project aims to provide a reusable Pull to Refresh widget for Android. It was originally based on Johan Nilsson’s library (mainly for graphics, strings and animations), but these have been replaced since.

 

 

 

 

3. StickyListHeaders

ListView의 Section Header 정보를 넣을 수 있다.

 

https://github.com/emilsjolander/StickyListHeaders

 

StickyListHeaders is an Android library that makes it easy to integrate section headers in your ListView. These section headers stick to the top like in the new People app of Android 4.0 Ice Cream Sandwich. This behavior is also found in lists with sections on iOS devices. This library can also be used for without the sticky functionality if you just want section headers.

StickyListHeaders actively supports android versions 2.3 (gingerbread) and above That said, it should be compatible with much older versions of android as well but these are not actively tested.

Here is a short gif showing the functionality you get with this library:

 

 

4. MenuDrawer
좌측 또는 우측의 슬라이드 메뉴를 구성 할 수 있다.

https://github.com/SimonVT/android-menudrawer

 

A slide-out menu implementation, which allows users to navigate between views in your app. Most commonly the menu is revealed by either dragging the edge of the screen, or clicking the ‘up’ button in the action bar.

 

 

5. SlidingMenu
MenuDrawer와 같다.

 

https://github.com/jfeinstein10/SlidingMenu

SlidingMenu is an Open Source Android library that allows developers to easily create applications with sliding menus like those made popular in the Google+, YouTube, and Facebook apps. Feel free to use it all you want in your Android apps provided that you cite this project and include the license in your app.]

 

 

6. FadingActionBar

리스트뷰 스크롤시 헤더 컨텐츠에 따라 액션바의 알파값이 변한다. 구글 음악플레이어의 아티스트정보 페이지

 

https://github.com/ManuelPeinado/FadingActionBar

 

FadingActionBar is a library which implements the cool fading action bar effect that can be seen in the new Play Music app.

 

7. DragSortListView

리스트 소팅

 

https://github.com/bauerca/drag-sort-listview

 

DragSortListView (DSLV) is an extension of the Android ListView that enables drag-and-drop reordering of list items.

 

 

8. IndexableListView

리스트뷰의 알파벳 인덱스 기능

 

https://github.com/woozzu/IndexableListView

 

 

9. ListViewAnimations

ListView 스크롤시 애니메이션(구글 플러스)

 

https://github.com/nhaarman/ListViewAnimations

 

ListViewAnimations is an Open Source Android library that allows developers to easily create ListViews with animations. Feel free to use it all you want in your Android apps provided that you cite this project and include the license in your app.

 

 

10. ViewPagerIndicator

ViewPager 인디케이터

 

https://github.com/JakeWharton/Android-ViewPagerIndicator

 

Android-ViewPagerIndicator is presented as an Android library project. A standalone JAR is not possible due to the theming capabilities offered by the indicator widgets.

 

11. PagerSlidingTabStrip

ViewPager 인디케이터

 

https://github.com/astuetz/PagerSlidingTabStrip

 

Interactive paging indicator widget, compatible with the ViewPager from the Android Support Library.

 

 

12. JazzyViewPager

ViewPager 스크롤시 애니메이션

 

https://github.com/jfeinstein10/JazzyViewPager

 

An easy to use ViewPager that adds an awesome set of custom swiping animations. Just change your ViewPagers to JazzyViewPagers and you’re good to go!

 

 

14. ViewPager3D

ViewPager 스크롤시 3D 효과

 

https://github.com/inovex/ViewPager3D

 

 

15. DirectionalViewPager

ViewPager 좌우, 아래위 스크롤

 

https://github.com/JakeWharton/Android-DirectionalViewPager

 

Implementation of the compatibility library ViewPager class that supports paging both vertically and horizontally as well as changing between the two at runtime.

 

 

 

16. VerticalSeekBarAndroid
수직 SeekBar

 

https://github.com/AndroSelva/Vertical-SeekBar-Android

 

This project is all about Customizing the normal SeekBar to Vertical Seekbar.

 

 

17. HoloCircleSeekBar
원형으로 생긴 SeekBar

 

https://github.com/JesusM/HoloCircleSeekBar

 

A Circle SeekBar inspired by Android Holo ColorPicker designed by Marie Schweiz and developed by Lars Werkman.

 

 

18. MultiChoiceAdapter
ListView, GridView에서 다중선택을 쉽게 할 수 있도록 도와준다.

 

https://github.com/ManuelPeinado/MultiChoiceAdapter

 

MultiChoiceAdapter is an implementation of ListAdapter which adds support for modal multiple choice selection as in the native Gmail app.

 

 

19. TwoWayGridView
GridView를 가로, 세로방향으로 스크롤 되도록 한다.

 

https://github.com/jess-anders/two-way-gridview

 

An Android GridView that can be configured to scroll horizontally or vertically.

 

 

20. ScrollBarPanel
스크롤바 옆에 View를 생성(Path 2.0에서 볼 수 있는 기능)

 

https://github.com/rno/Android-ScrollBarPanel

 

Android-ScrollBarPanel allows to attach a View to a scroll indicator like it’s done in Path 2.0.