Vintage appMaker의 Tech Blog

Glide를 TextView에서 사용하기 본문

Source code or Tip/Android(Java, Kotlin)

Glide를 TextView에서 사용하기

VintageappMaker 2021. 9. 21. 10:39

 

Android에서 Image를 사용한다면 대부분 Glide를 통해 서버에서 이미지를 가져온다. 그런데, Glide를 TextView에서 사용하려면 조금 다른 방법을 사용해야 한다. 

1. 서버의 이미지를 BMP 형태로 가져온다(주로 백그라운드 형태로 실행).
2. 가져온 BMP를 BitMapDrawable으로 변환한다. 
3. UIThread에서 가져온 BitMapDrawable을 대입한다.

이런 식으로 코루틴을 백그라운드에서 실행하고 그 결과를 UIThread(runOnUiThread)에서 처리하면 TextView의 배경을 서버에서 가져와 구현할 수 있다. 

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:gravity="center"
        android:id="@+id/txtMessage"
        android:textColor="#FFFF00"
        android:textSize="11dp"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:text="Android"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />


</androidx.constraintlayout.widget.ConstraintLayout>

 

[activity_main.xml]

 

package com.psw.justtest

import android.content.Context
import android.content.res.Resources
import android.graphics.drawable.BitmapDrawable
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.widget.ImageView
import android.widget.TextView
import android.widget.Toast
import androidx.annotation.UiThread
import com.bumptech.glide.Glide
import com.bumptech.glide.request.RequestOptions
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Job
import kotlinx.coroutines.launch
import java.lang.Exception

class MainActivity : AppCompatActivity() {

    val txtMessage : TextView by lazy {
        findViewById<TextView>(R.id.txtMessage)
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        getNetworkDrawable(this, "https://avatars.githubusercontent.com/u/32689599?s=200&v=4", {
            img->
            runOnUiThread {
                txtMessage.background = img
            }
        })
    }

    fun getNetworkDrawable(ctx : Context, sUrl : String, fnSetting : (BitmapDrawable?) -> Unit = {} ){
        var job = Job()
        CoroutineScope(job).launch {
            try{
                val bmp = Glide
                    .with(ctx)
                    .asBitmap()
                    .apply(RequestOptions.circleCropTransform())
                    .load(sUrl)
                    .into(100, 100)
                    .get()
                val res: Resources = ctx.resources

                fnSetting(BitmapDrawable(res, bmp))
            } catch ( e: Exception){
                e.printStackTrace()
                job.cancel()
            }
        }
    }
}

MainActivity.kt

Comments