적고가지 않기에는 아쉬운 것들

CmplxN·2020년 10월 31일
0

오픈소스와 의존성 충돌 해결하기

개발을 하다보면 시간의 제약 때문에 여러가지 선택의 순간들이 온다.

예를 들면 복잡한 커스텀 뷰를 만들어야 한다.
모든 기능을 직접 개발한다면 유지보수가 용이할 것이다. 또한 커스터마이징의 제약도 없을 것이다.
하지만 현실로 돌아오면 귀찮고 이걸 직접 개발한다면 도저히 데드라인을 맞추기 어려워보인다.
결국 그런그런 이유로 오픈소스를 이용하는 자신의 모습을 발견할 수 있다.

문제점

운 좋게 마음에 드는 오픈소스를 골랐다!
그래서 gradle에 dependency를 추가하고 손쉽게 구현을 완료했다.
자, 이제 결과를 확인하기 위해 실행해본다.
아무 문제 없이 실행되면 참 좋겠지만 그렇지 않은 경우가 생기곤 한다.
어딘가 예상치 못한 충돌이 생겨 아예 컴파일이 안되거나 앱이 죽곤 한다.
manifest 충돌 등 여러가지 충돌의 원인이 있지만, 의존성 충돌을 해결하는 방법을 알아보자.

의존성 충돌 해결

오픈소스 사용시의 의존성 충돌은 같은 라이브러리를 다른 버전으로 사용할 때 발생하곤 한다.
예를 들면 나는 material을 버전 1.0.0을 사용하는데 도입할 오픈소스는 material 버전 1.1.0을 쓴다. 물론 어떻게 호환성이 뛰어나서 아무 문제 없이 작동할 수도 있지만, 이러한 원인으로 결국 문제가 생긴다.

그러면 이런 경우 충돌나는 의존성을 어떻게 해결할지 살펴보자.

  1. app.gradle에서 자신이 원하는 버전을 force 옵션으로 강제하기
implementation ("com.google.android.material:material:1.0.0") {
    force = true
}
  1. 오픈소스의 implementaion 절에서 exclude로 해당 라이브러리 제외하기
implementation("오픈소스 경로") {
    exclude group: "com.google.android.material", module: "material"
}

이외에도 여러 방법이 있으니 링크를 참조하자.

참조

Fresco에서 webp 또는 gif 보여주기

현재 안드로이드에서 주로 사용하는 이미지 로딩 라이브러리는 Glide다.
그외에도 Fresco, Coil, Picasso 등의 이미지 로딩 라이브러리가 있다.
최근 Fresco를 이용해 이미지 로딩을 했던걸 의식의 흐름대로 적어본다.

구현하고자 한 것

Fresco를 이용해 평범하게 이미지를 보여주고 디자인을 위해 둥근 사각형 모양으로 이미지를 나타내고 싶었다.
사실 Fresco에서 둥근 사각형 형태로 이미지 로딩하는 것은 타 라이브러리처럼 매우 쉽다.
그냥 xml에 다음과 같이 적어주면 된다. (wrap_content가 뜻대로 안되는건 함정)

<com.facebook.drawee.view.SimpleDraweeView
    android:id="@+id/simple_draweeview"
    android:layout_width="100dp"
    android:layout_height="100dp"
    fresco:actualImageUri="@{uri}"
    fresco:roundedCornerRadius="20dp" />

databinding을 이용해 actualImageUri 속성을 주고, roundedCornerRadius속성에서 깎아줄(?) dp 값을 넘겨주면 된다.

움직이는 이미지 표현

움직이는 이미지로는 gif와 webp type을 사용한다.
분명 이미지 타입으로 검색하면 gif와 webp도 검색된다.
그래서 희망회로를 돌리면 gif와 webp도 알아서 움직일 것 같았다.
하지만 webp와 gif는 별도 설정을 하지 않으면 재생되지 않는다.
(만약 gif와 webp가 정지 화면으로라도 안나오면 링크의 dependency를 추가한다.)
아래의 코드를 추가해서 움짤에게 생명을 주자.

val uri = "https://res.cloudinary.com/demo/image/upload/fl_awebp,q_40/bored_animation.webp"
val controller = Fresco.newDraweeControllerBuilder()
    .setUri(uri)
    .setAutoPlayAnimations(true) // 필요한 부분
    .build()
simple_draweeview.controller = controller

하품하고 있는 아저씨를 확인할 수 있다.

그런데..

png와 같은 일반 이미지파일에서는 잘 적용되던 roundedCornerRaidus가 적용되지 않는다.
이것을 해결할 가장 간단한 방법은 SimpleDraweeViewCardView에 집어넣거나 FrameLayout에 둘러씌우는 것이다.
xml 파일을 다음과 같이 바꾸면 둥근 사각형에서 하품하고 있는 아저씨를 발견할 수 있다.

<androidx.cardview.widget.CardView
    android:layout_width="50dp"
    android:layout_height="50dp"
    app:cardCornerRadius="10dp"
    app:cardElevation="0dp">
    <com.facebook.drawee.view.SimpleDraweeView
        android:id="@+id/simple_draweeview"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</androidx.cardview.widget.CardView>

좀더 정공법으로 해결할 수도 있지만 길어지게 되므로 링크를 참조하자.

profile
Android Developer

0개의 댓글