레이블이 library인 게시물을 표시합니다. 모든 게시물 표시
레이블이 library인 게시물을 표시합니다. 모든 게시물 표시

2015년 12월 7일 월요일

Picasso 파헤치기


What is Picasso?

안드로이드에서 여러 이미지가 화면에 나열 되는 UI는 자주 쓰이고 있습니다. 많은 개발자가 이것을 편리하게 하려고 라이브러리를 제작하여 공개했습니다. Picasso는 그 중에 하나로써 Square 사의 Jake Wharton이 개발한 라이브러리입니다.

Why Picasso?

직접 수많은 라이브러리를 비교해보지는 못했고 대신 Hello World 블로그의 Android의 이미지 로딩 라이브러리를 참고했습니다. Picasso를 선택한 이유는 다음과 같습니다.
  1. 모듈화가 잘 되어있어서 확장에 용이하다
  2. API가 간결하다
  3. Jake Wharton이 개발했다

Dive into Picasso

Picasso가 작동하는 방식과 중요한 클래스들을 살펴보도록 하겠습니다. (소스는 v2.2.0을 기준으로 합니다.)

1. 이미지 불러오기 요청

이미지를 불러오기 위해 Picasso를 사용합니다. 간단한 용례는 다음과 같습니다.
Picasso.with(context)
       .load(placeImageUrl)
       .error(R.drawable.error)
       .placeholder(R.drawable.placeholder)
       .transform(myTransformer)
       .into(placeImageView);

2. 캐시 검사

Picasso는 Cache 인터페이스를 통해 캐시를 저장하고 가져옵니다. 만약 캐시에 요청한 이미지가 존재하면 캐시를 사용합니다.

3–4. 백그라운드로 스레드에서 이미지 불러오기

Cache에 캐시된 이미지가 없다면 Dispatcher를 통해 백그라운드 스레드에서 BitmapHunter가 이미지를 불러올 수 있도록 합니다.

5. 캐시 검사 및 이미지 불러오기

다시 한 번 캐시를 검사합니다. 이때 캐시된 이미지가 있으면 그걸 사용합니다. 없다면 BitmapHunter인터페이스는 실제 구현에 따라 이미지 불러오게 됩니다. BitmapHunter의 구현체가 NetworkBitmapHunter인 경우 Downloader 인터페이스를 통해 이미지를 내려받습니다.

6. 이미지 후처리

BitmapHunter가 이미지를 불러오면 Transformer 인터페이스를 통해 이미지 후처리를 할 수 있도록 합니다.

7–8. 불러온 이미지 적용

이미지 불러오기를 마친 BitmapHunter는 다시 Dispatcher를 통해 UI 스레드로 비트맵을 전달합니다. Dispatcher는 비트맵을 Action 인터페이스로 구현된 방식으로 이미지를 처리합니다.
이렇게 Picasso는 단계별로 인터페이스를 두고 확장 가능하도록 구현되어 있습니다. 필요에 따라 캐시 방식을 바꾸고 싶다면 Cache 인터페이스를 구현하고 이미지 후처리 방식을 바꾸고 싶다면Transformer 인터페이스를 구현하면 됩니다. 별도로 구현하지 않으면 이미 정의된 구현체들이 각 단계별로 사용됩니다.

Appendix

com.squareup.picasso.Picasso(javadoc)

Picasso로 이미지를 불러올 때 사용하게되는 빌더입니다. RequestCreator와 함께 Method Chaining혹은 Builder Pattern로 불리는 방법으로 API를 간결하게 사용 할 수 있도록 합니다.

com.squareup.picasso.Dispatcher

백그라운드 스레드와 UI 스레드 간에 통신하게되는 통로입니다. Picasso에서 요청 데이터를 전달 받아 Background 에서 BitmapHunter가 비트맵을 불러올 수 있도록 합니다. 비트맵을 UI 스레드에 전달해서 처리할 수 있도록 합니다.

com.squareup.picasso.Cache(javadoc)

이미지 캐싱을 위한 모듈입니다. 기본 구현체로는 LRU 방식으로 캐시하는 LruCache가 사용됩니다.

com.squareup.picasso.BitmapHunter

비트맵을 불러오는 모듈입니다. 자주 사용되는 구현체로는 ResourceBitmapHunterNetworkBitmapHunter가 있습니다.
Picasso.load()메소드에 리소스 아이디를 넘겨주면 ResourceBitmapHunter가 사용되고 Uri를 넘겨주면 URI Scheme에 따라서 NetworkBitmapHunterContentProviderBitmapHunter,AssetBitmapHunber 등이 사용됩니다. (자세한 내용은 BitmapHunter.forRequest메소드에 구현되어 있습니다.)

com.squareup.picasso.Downloader(javadoc)

NetworkBitmapHunter가 이미지를 내려받을 때 사용하는 인터페이스입니다. 기본 구현체는OkHttp를 사용할 수 있는지 여부에 따라 다릅니다.
  1. 만약 OkHttp를 사용할 수 있다면 Http Client 를 OkHttp로 사용하는 OkHttpDownloader가 기본 구현체가 됩니다.
  2. 그렇지 않은 경우에는 Http Client 를 HttpURLConnection로 사용하는UrlConnectionDownloader가 기본 구현체가 됩니다.

com.squareup.picasso.Transformer

BitmapHunter가 비트맵을 만들면 후처리를 하는 모듈입니다. 불러온 이미지를 마스킹 한다던지 블러 효과를 주고싶다면 Transformer인터페이스를 구현하면 됩니다.

com.squareup.picasso.Action

BitmapHunter를 통해 불러오고 Transformer를 통해 후처리가 끝난 비트맵은 Action이 가져가서 처리를 하게됩니다. 불러온 비트맵을 어떻게 할지 결정하는 모듈이라고 볼 수 있습니다. 일반적으로 쓰게되는 Action의 구현체는 ImageViewAction 인데, 생성된 키트맵을 ImageView 에 설정합니다.
출처 : https://spoqa.github.io/2014/03/28/android-picasso.html

2015년 6월 21일 일요일

Android Studio에서 OpenCV for Android 사용하기

Android Studio에서 OpenCV를사용해 보기


1.. OpenCV For Android 다운로드

OpenCV 사이트에서 OpenCV-2.4.9-android-sdk.zip을 다운 받아 압축을 풀어 준다.
 얘 ) 
c:\Users\h.kaneda\AndroidStudioProjects\OpenCV-2.4.9-android-sdk\

2. Android Studio에 openCV SDK Import 하기

Android Studio를 열어 Import Project…를 선택OpenCV-2.4.9-android-sdk 폴더를 선택. OK 클릭한다.
Next  > 

Next  > 
 Next  > 

Next  > 

sdk를 체크 한다음 Next  > 

Next  > 

 Finish >

Import 위저드가 완료 되었다면 메뉴에서 빌드를 한다.Build > Rebuild Project

OpenCV SDK 프로젝트 생성을 완료 했다.
이제 프로젝트를 닫아 준다.
File > Close Project


3.. OpenCV를 프로젝트에 포함 시키기

신규 프로젝트를 만들거나, OpenCV를 추가하고 싶었던 기존의 프로젝트를 연다.
그리고 OpenCV 모듈을 추가한다.
File > Import Module…

이번에는 OpenCV-2.4.9-android-sdk/sdk/java/sdk.iml 를 선택한다.
Next >


전체 선택하고 Finish >

openCVLibrary249라는 이름의 라이브러리가 인포트 된것을 확인 할 수 잇다.

app/build.gradleのdependencies에 라이브러리를 추가 한다.compile project(':openCVLibrary249')
Gradle파일을 변경 하였기에 Tools > Android > Sync Project with Gradle Files를 해 주도록 한다.

소스 상에서 org..opencv.android가 자동완성 되는지 확인해 보자.

OpenCV 라이브러리는 동적링크, 정적링크가 가능하다. 동적링크를 하는 경우는 OpenCV를 별도로 인스톨 하라는 메시지가 표시된다. 
이번에는 정적링크를 하는 방법을 .소개하도록 하겠다.app/src/main를 우클릭하고 New > Directory 해서 jniLibs 폴더를 추가 한다.
 
jniLibs 폴더 생성
추가한 jinLIbs 폴더에 OpenCV-2.4.9-android-sdk/sdk/native/libs 의 내용을 복사한다.
jniLibs 생성 및 libs 추가 후 구조

이상으로 Android Studio에서의 OpenCV로 프로젝트를 개발 하는 것이 가능하다.


2014년 1월 21일 화요일

[Android] 안드로이드용 ZXing 소스를 다운 받아 Jar 파일 만들기.

ZXing ?
구글에서 제공하는 오픈소스로 Zebra Crossing의 약자. QR코드 스캔 어플리케이션의 대다수가 이 어플리케이션을 이용했다고 해도 과언이 아닐정도로 널리 쓰이고 있는 코드라고 합니다. 다양한 바코드를 인식할 수 있다고합니다. 무려. 인식할 수 있는 바코드 종류는 총 15 가지 정도라고 하네요.
※ 지원포맷
- 1D product : UPC-A, UPC-E, EAN-8, EAN-13
- 1D industrial : Code 39, Code 93, Code 128, Codabar, ITF, RSS-14, RSS-Expanded
- 2D : QR Code, Data Matrix, Aztec (beta), PDF 417 (beta)

제가 이 글을 쓰게된 이유는 ZXing 2.2 이전 버전까지는 Ant를 이용해서 쉽게 Jar를 만들어 사용했는데, 2.2 버전부터는 Ant를 사용할수 있는 build.xml 이 core 디렉토리에서 삭제되어 버린거 같네요.
build.xml를 직접 만들어 사용 하실 수도 있겠지만... 이왕이면 zxing의 메뉴얼을 따라 해 보려고 이렇게 글을 쓰게 되었네요. 참고가 되시길... (사실 내가 잊어버릴까 적어 두는거긴 하지만.... ㅋ~~~~)

1. 안드로이드용 ZXing 소스를 다운 받아 Jar 파일 만들기.
    1.1. 다운로드 : http://code.google.com/p/zxing/downloads/list (현재 버전 2.3.0)
    1.2. 컴파일 방법 : https://github.com/zxing/zxing/wiki/Getting-Started-Developing 참고 
       1.2.1. 컴파일을 메이븐(Maven)이용 함(다운로드 : http://maven.apache.org/download.html)
    ※ core-2.3.0.jar 획득(다운로드 : https://db.tt/PKzHLitQ)

위의 순서대로 하나씩 해 보도록 하겠습니다.
1.1 ZXING 다운로드 (http://code.google.com/p/zxing/downloads/list (현재 버전 2.3.0))
   - ZXing-2.3.0.zip 다운로드 합니다.
 [캡쳐 1] zxing 다운로드 페이지


1.2. 컴파일 방법
  1.2.1. 컴파일을 메이븐(Maven)이용 함(다운로드 : http://maven.apache.org/download.html)
     - 메이븐 다운로드 합니다.(apache-maven-3.1.1-bin.zip)
     - 메이븐 설치는 압축을 해지 하고, bin 디렉토리를 시스템 환경변수(PATH)에 추가해 주시면 끝납니다.
     - 다운받은 메이븐을 C:\Program Files\Apache Software Foundation\apache-maven-3.1.1 압축을 해지 합니다.
     - 환경변수 PATH에 아래 경로를 추가해 줍니다.
         ;C:\Program Files\Apache Software Foundation\apache-maven-3.1.1\bin
  1.2.2. 컴파일 하기
     - 위에서 다운 받은 ZXing-2.3.0.zip 을 임의 디렉토리에 압축을 풀어 주세요. 
        (예시 ==> D:\Android\Workspace\zxing-2.3.0)
     - cmd 창을 열어서 Maven을 이용해 컴파일을 합니다.
      ㄱ. 윈도우 > 실행 > cmd
      ㄴ. zxing 압축을 해지한 디렉토리로 이동
           C:\Users\user>d:
           D:\>cd Android\Workspace\zxing-2.3.0\core
      ㄷ. 컴파일 명령 실행
           mvn -DskipTests -Dgpg.skip=true install
    ㄹ.JAR 생성 완료, 파일 확인.
      D:\Android\Workspace\zxing-2.3.0\core\target 
      core-2.3.0.jar 가 생성된 것을 확인 할 수 있습니다.
          

[캡쳐 2] 메이븐 다운로드 페이지


2014년 1월 20일 월요일

[Android] Listview 당겨서 새로고치기

Pull To Refresh for Android

This project aims to provide a reusable pull to refresh widget for Android.
Screenshot

Usage

Layout

<!--
  The PullToRefreshListView replaces a standard ListView widget.
-->
<com.markupartist.android.widget.PullToRefreshListView
    android:id="@+id/android:list"
    android:layout_height="fill_parent"
    android:layout_width="fill_parent"
    />

Activity

// Set a listener to be invoked when the list should be refreshed.
((PullToRefreshListView) getListView()).setOnRefreshListener(new OnRefreshListener() {
    @Override
    public void onRefresh() {
        // Do work to refresh the list here.
        new GetDataTask().execute();
    }
});

private class GetDataTask extends AsyncTask<Void, Void, String[]> {
    ...
    @Override
    protected void onPostExecute(String[] result) {
        mListItems.addFirst("Added after refresh...");
        // Call onRefreshComplete when the list has been refreshed.
        ((PullToRefreshListView) getListView()).onRefreshComplete();
        super.onPostExecute(result);
    }
}

Last Updated

It's possible to add a last updated time using the method setLastUpdated and onRefreshComplete. The text provided to these methods will be set below the Release to refresh text. Note that the time representation is not validated replaces the previous text, which means that it's possible and recommended to add a text similar to "Last Update: 15:23". This might be changed in future versions.

1.5 Support

To use the widget on 1.5 the necessary drawables needs to be copied to that projects drawable folder. The drawables needed by the widget can be found in the drawable-hdpi folder in the library project.

Contributors

Are you using this widget?

If you are using this widget please feel free to add your app to the wiki.

License

Copyright (c) 2011 Johan Nilsson
Licensed under the Apache License, Version 2.0