본문 바로가기

분류 전체보기

(70)
[Android] 간단한 그리기 및 지우기 with S-Pen 스타일러스펜(SPen)으로 드로잉하는거 대충 테스트해보다가 기억할겸 정리한다. 설명은 간단히 주석으로 달았다. 팜리젝션을 위해 일반 터치 이벤트는 무시하고 SPen 만 인식하도록 구현했다. 터치 이벤트가 발생한 좌표에 그리기, 펜에 있는 버튼을 누른 채 문지르면 지워진다. (획단위 아님) 풀 코드 class DrawingView(context: Context, attributeSet: AttributeSet) : View(context) { init { // 아래와 같이 지정해주지 않으면 지우개모드에서 이상한 검정색 원이 생긴다. // 참고로 기본 동작은 LAYER_TYPE_SOFTWARE 인데 자세한 내용은 찾아봐야한다. setLayerType(FrameLayout.LAYER_TYPE_HARDWARE,..
[Android] TextView Typeface 관련 궁금증 - 미해결 Typeface 클래스에 대한 궁금증이 생겼다. 문제 해결은 했지만 이유를 아직 모르겠다. 달력 데이터를 표시하는 리사이클러뷰 하나가 있고, 오늘 날짜에는 bold 처리, 아닌 날짜에는 노말로 표시한다. 그래서 RecyclerViewAdapter.onBindViewHolder() 에서 아래와 같이 그려지도록 작성했다. tv_holder_day.setTypeface(tv_holder_day, getTextTypeface(data.date.time.isToday())) fun getTextTypeface(isToday): Typeface = if (isToday) Typeface.BOLD else Typeface.NORMAL 그런데 위와같이 설정하면 오늘 날짜는 제대로 볼드처리돼서 그려지는데, 오늘 날짜(2..
[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] Socket 통신 예제(New) 하나의 디바이스에서 간단한 서버 앱, 클라이언트 앱을 구성하여 소켓 통신을 수행할 수 있는 예제이다. 자세한 개념설명은 생략하였으며, 개념이해 전 간단한 예제 먼저 작성해보고싶을 경우 해당 포스팅을 읽는 것을 추천한다. 같이 알아두면 좋은 내용 Socket 의 개념 Android Permission Service 생명주기, ForegroundService Android 에서 Thread 를 다루는 방법 Notification 구현 순서 요약 서버 앱 구성 서버를 실행할 Service 클래스 작성 서버 역할을 하는 ServerThread 클래스 작성 메인 액티비티에서 구현한 Service 실행(Foreground) 클라이언트 앱 구성 화면 구성 서버에 연결할 ClientThread 클래스 작성 서버 앱 구..
[Android Studio] xcrun: error: invalid active developer path xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun 원인 : Max os 를 업데이트하고나서 자주 발생하는 오류라고한다. 안드로이드 스튜디오에서 git 을 사용할 수 없었고(Annotate 나 브랜치 관련 작업 등), 검색해보면 주로 XCode에서도 발생하는 오류라고한다. 해결방법 : Git 을 새로 설치하고 version controll - git configuration 에서 git 이 설치된 경로를 적어주면 된다. /usr/local/git/bin/git 참고 : https://sta..
[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)..