본문 바로가기

Android/지식저장소

(7)
[Android] ExoPlayer2 현재 재생위치 가져오기 ExoPlayer2 에서 currentPosition(현재 재생위치) 가져오는 방법에 대한 포스팅이다. 본문 요약 - ExoPlayer 에서 재생위치를 실시간으로 가져오려면 폴링 방식으로 플레이어에 직접 요청해서 체크해야한다. (주기적으로 상태 체크해서 exoPlayer.getCurrentPosition()) 회사 프로젝트 내 기능중 동영상플레이어 구현을 위해 ExoPlayer2 라이브러리를 사용하고있는데, 현재 재생위치 콜백을 받아야하는 니즈가 생겼다. 당연히 관련 리스너를 등록하면 바로 가져올 수 있을 줄 알았는데 player 에서는 제공하고있는 리스너는 재생상태 뿐이었다. 더보기 더보기 interface EventListener { /** * Called when the timeline and/or..
[Android] 간단한 그리기 및 지우기 with S-Pen 스타일러스펜(SPen)으로 드로잉하는거 대충 테스트해보다가 기억할겸 정리한다. 설명은 간단히 주석으로 달았다. 팜리젝션을 위해 일반 터치 이벤트는 무시하고 SPen 만 인식하도록 구현했다. 터치 이벤트가 발생한 좌표에 그리기, 펜에 있는 버튼을 누른 채 문지르면 지워진다. (획단위 아님) 풀 코드 class DrawingView(context: Context, attributeSet: AttributeSet) : View(context) { init { // 아래와 같이 지정해주지 않으면 지우개모드에서 이상한 검정색 원이 생긴다. // 참고로 기본 동작은 LAYER_TYPE_SOFTWARE 인데 자세한 내용은 찾아봐야한다. setLayerType(FrameLayout.LAYER_TYPE_HARDWARE,..
[Android] ConstraintLayout Helper - Group group 은 ConstraintLayout 에서 제공하는 helper 중의 하나로, 여러 뷰들의 visibility 를 그룹으로 묶어 편리하게 관리할 수 있게 해준다. ConstraintLayout 으로 뷰를 구성하다보면 모든 뷰들이 flat하게 존재하기 때문에, visibility 를 한 묶음으로 변경해야할 때 보일러플레이트 코드가 많아질 수 밖에 없다. iv_remote.visibility = visibility tv_remote_count.visibility = visibility iv_vacation.visibility = visibility tv_vacation_count.visibility = visibility another_view1.visibility = visibility anothe..
[Android] 점선 그리기(Dotted line) 앱에서 점선을 나타내고 싶을 때 아래와 같은 shape.xml 리소스를 만들고 * 참고로 shape - line 을 정의할 때에는 stroke 속성이 꼭 정의되어야한다고 문서에 나와있다. 그리고자 하는 뷰를 추가하고 위에서 정의한 xml 리소스를 background 로 설정해주면 끝! 그런데 android:layerType 속성을 software 을 설정하지 않을 경우, 아래처럼 제대로 보이지 않는 경우가 있다. (첫번째 뷰에만 android:layerType="software" 적용) 다른 디바이스에서는 따로 설정해주지 않아도 제대로 보인다. android:layerType 속성은 은 뷰를 렌더링하는 연산을 CPU(software)에 맡길지, GPU(hardware)에 맡길지 결정하는 속성이다. 앱 전..
[Android] BaseSavedState 를 이용하여 View 에 상태 저장하기 안드로이드는 화면을 회전시키는 것과 같이 configuration change 가 발생하면 액티비티가 재생성된다. (onDestroy() 후에 onCreate() 부터 라이프사이클이 다시 시작되기 때문) 따라서 뷰에 어떤 정보를 저장하고있었다면 모두 잃게 될 것이다. 이를 해결하기 위해 다양한 방법이 공식문서에 소개되어 있지만, 여기에 자세히 설명되어있지 않은 방법이 있다. 내가 영어를 못해서그렇지, 이미 있을 수도 있음 그 방법은 바로 View 클래스의 static inner class 로 BaseSavedState에 내가 저장하고 싶은 정보를 담아 복원하면 된다. Configuration change 가 일어나도 정보가 저장될 뿐더러 메모리 부족으로 프로세스가 kill 당하더라도 데이터를 유지할 수 ..
[Android] RxJava2 + Retrofit2 에서 언제 call 이 cancel 되는가 고찰 너무 피곤해서 코드만 보고 의식의 흐름대로 작성해본 것. 주관이 많이 들어갔기때문에 100% 신뢰해서는 안된다. 전제 : retrofit 이 리턴해주는 Single 을 옵저버블로 변환해 사용중(우리 프로젝트 구조의 특성상 이렇게 했다) 1. Retrofit 은 인터페이스로 정의한 API 를 기반으로, 어노테이션 프로세서를 이용해? 뚝딱뚝딱 어떤 클래스 를 만들어낸다. // Retrofit.class // 여기서 T 는 클래스 (Something::class.java) public T create(final Class service) { Utils.validateServiceInterface(service); if (validateEagerly) { eagerlyValidateMethods(service)..
[Android] RecyclerView 에서 엣지 스크롤 이펙트 숨기기 리사이클러뷰의 맨 첫번째 또는 마지막 요소에서 스크롤(오버스크롤)할 경우 발생하는 이펙트를 숨겨야하는 요구사항이 있었다. 그래서 검색해보면, 대부분 리사이클러뷰에 android:overScrollMode="never" 속성을 적용하면 해결할 수 있다고 나와있다. 실제로 이 속성만 추가해주면 해당 이펙트는 사라진다. 하지만 이 속성을 적용할 경우 오버스크롤 모드가 비활성화 되기 때문에, 오버스크롤이 필요한 경우에는 적용하면 안되는 방법이다. 그래서 오버스크롤 모드가 필요한 경우에 아래와 같은 방법으로 해주면 된다. (이것저것 해보다가 발견한 것이고, 잘 알려진 방법이 아니기때문에 다른 사이드이펙트가 발생할 수 있으니 주의!!) recyclerView.edgeEffectFactory = object : Re..