Android

- Coil을 통해 서버로부터 수신받은 url로 webp를 렌더링 하고 있었는데, 원본에 비해 품질이 너무 떨어진다는 보고를 받았다. - 실제 파일을 업로드하는 웹 쪽에서는 품질 조정에 대한 문제는 없었다. 그렇다면 앱에서 조금 깨져보이는건데 대응 방안에는 두 가지 간단한 방법이 있었다. - 먼저 Coil을 통해 리소스를 불러올 때 디코딩 과정에서 품질 손실이 발생할 수 있고, Size 옵션에 따라 품질 손실이 발생할 수도 있다. - 아래가 기존 코일 관련 코드인데, Scale이 지정되지 않았고 ContentScale도 Crop으로 지정해놓았다. 이런 부분에서 변질이 발생하는 것으로 보인다.Image( painter = rememberAsyncImagePainter( ImageReque..
- 위젯에서는 알파 값 적용하는 방식이 제한되어 있다.- 이미지 같은 경우에는 setInt - "setAlpha"를 통해 적용하고, 텍스트의 경우에는 실제 알파 값이 적용된 컬러를 textColor로 지정해주어야 한다. remoteViews.setInt(R.id.widgetRootImg, "setAlpha", alpha)- 참고로 setAlpha에 들어가는 alpha 값의 범위는 0~255이다. - 원하는 투명도 %를 아래 공식을 통해 계산하여 반영해주어야 한다.val alpha = transparency * 255 / 100 - Int형 Color 값에 알파 값을 적용하려면 다음과 같이 처리한다. 예시로 30% 적용할 경우val colorWithAlpha = (textColor and 0x00FFFFF..
- API 호출을 통해 리스트 화면을 갱신하는 구조의 MainActivity가 있는데, 수동 동기화 버튼이 존재하지만 사용자에게 더 편리함을 주기 위해 다른 앱에 있다가 다시 해당 앱으로 복귀하면 자동으로 동기화해주는 기능이 필요했다. - 아래와 같은 Compose 기반의 화면으로 구성되어 있었고, 갱신 시 viewModel에서 새로운 값을 가져온다.@AndroidEntryPointclass MainActivity : ComponentActivity() { private val stationViewModel: StationViewModel by viewModels() private val subwayArrivalViewModel: SubwayArrivalDataViewModel by viewM..
https://gradle.org/whats-new/gradle-9/ Gradle | What's new in Gradle 9.0.0Gradle 9.0.0 is a new major release which incorporates many features since the version 8.0. It makes Gradle configuration cache the preferred execution mode, provides more clean and actionable error reporting, and also updates Gradle to Kotlin 2 and Groovygradle.org- Gradle 9.0.0이 출시되었길래 간단히 몇 가지 내용들을 정리해 본다.Gradle 9.0.0은 ..
- 디바이스를 재부팅했을 때, 특정 동작을 필요로 할 때가 있다. 데이터 동기화라던지 위젯 갱신이라던지.. - 이때 안드로이드에서 재부팅 시, android.intent.action.BOOT_COMPLETED를 브로드캐스트 한다. - 리시버는 아래와 같이 Manifest.xml에 등록한다. - 또한 권한도 추가해 준다. - BootReceiver를 구성해 준다.class BootReceiver : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { if (Intent.ACTION_BOOT_COMPLETED == intent.action) { //재부팅 ..
- 안드로이드에는 위젯 인스턴스 하나마다 고유한 ID를 가진다. 이게 AppWidgetId이다. - 바탕화면에 똑같은 위젯 두 개를 생성해도 개별 ID는 다르다. 이를 통해 서로 바라보는 데이터를 달리할 수 있다. - 예를 들어 A-1 위젯에서는 Key + A-1-AppWidgetId로 1번 데이터를, A-2 위젯에서는 Key + A-2-AppWidgetId로 2번 데이터를 저장하고 렌더링 할 수도 있는 것이다. - 기존 XML RemoteViews 방식 위젯에서는 아래와 같이 AppWidgetId 조회가 가능하다.override fun onUpdate( context: Context, appWidgetManager: AppWidgetManager, appWidgetIds: IntAr..
- 요즘 바이브 코딩이라는 말이 정말 많이 들린다. - 바이브 코딩(Vibe Coding)이란 개발자가 생성형 AI의 도움을 받아 코드를 작성하는 행위를 일컫는 신조어로 프로그래밍을 할 때 사전에 엄밀한 논리나 설계를 바탕으로 하지 않고 직감과 느낌에 의존한다는 의미로 ‘바이브’ 코딩이라는 이름이 붙었다. - Cursor, Windsurf 등등 종류가 많은데 안드로이드 스튜디오에서 실행하기 쉬운 WindSurf로 진행해 봤다.https://windsurf.com/editor Windsurf Editor | Windsurf (formerly Codeium)Tomorrow's editor, today. Windsurf Editor is the first AI agent-powered IDE that keep..
- 단색이 아닌 특정 이미지를 활용하여 View의 테두리를 붙여서 그려줘야 하는 경우가 있었다. - 이미 그려야하는 라인의 각 지점에 대한 좌표 값들이 프로젝트에 구성되어 있었기 때문에 그에 따라 비트맵을 붙여주기만 하면 되었다.val measure = PathMeasure(path, false)val length = measure.length - PathMeasure(path, forceClosed: Boolean)는 Android에서 Path의 길이와 경로 상의 점, 방향 등을 측정할 수 있게 해주는 클래스다. 이를 통해 그려야 하는 라인 상의 정확한 위치와 방향을 찾을 수 있다. - 그리기 전에 경로 길이를 측정해놓고, 이후 일정 거리마다 지점에 비트맵을 붙일 것이다. - forceClosed: B..
- Glance에서 Image 컴포저블 자체에 Alpha 값을 적용할 수는 없다. 그래서 애초에 ImageProvider에 리소스를 넘길 때 알파 값이 적용된 리소스여야 한다. - 알파값 적용된 비트맵은 아래 확장함수를 구현하여 기존 비트맵에서 알파를 적용한 비트맵을 다시 그리도록 했다.fun Bitmap.withAlpha(alpha: Float): Bitmap { val result = createBitmap(width, height) val canvas = Canvas(result) val paint = Paint().apply { this.alpha = (alpha * 255).toInt() } canvas.drawBitmap(this, 0f, 0f, paint) retu..
- 구글 플레이 스토어 업로드 심사 중에 아래와 같은 이슈 발생으로 거절당했다.Exception java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState at androidx.fragment.app.FragmentManager.checkStateLoss (FragmentManager.java:1852) at androidx.fragment.app.FragmentManager.enqueueAction (FragmentManager.java:1892) at androidx.fragment.app.BackStackRecord.commitInternal (BackStackRecord.java:341) at ..
SeungYong.Lee
'Android' 태그의 글 목록