본문 바로가기

[안드로이드] 여러 페이지를 담은 PDF 파일 생성하기 기존 프로젝트를 수행하면서 1개 페이지의 PDF를 만들어 본 적은 있었는데, 여러 페이지를 담은 PDF파일을 만들 수 있는지는 바로 쉽게 확신이 가지는 않았다. 초반에 자료검색을 하면서 이런 저런 사례들을 보았지만, 어쨌든 가능하다는 점을 확인하고 나서는 기존 코드를 사용해보기로 했다. 그랬는데 결과가 생각보다 순조롭게 나온 탓에 어깨춤을 출 뻔 했다. 우선 내가 원하고자 한 목표와 과정은 다음과 같다. GOAL? fragment로 존재하는 다수 페이지의 레이아웃을 캡처해 1개의 PDF 파일로 생성한다 HOW? 1. 레이아웃의 맨 바탕에 해당하는 어미 View를 id를 달아 참조해 View[] 배열에 담는다. 2. 저장한 View를 비트맵화 하여 Bitmap[] 배열에 담는다. 비트맵배열[k] = Bit..
[안드로이드] 각도 표시를 위한 간단한 호 그리기 데이터에 따른 각도 값을 하이라이트 해서 시각화하기 위해 채워진 호를 그리고자 하였다. Stack Overflow에서 아주 어렵지 않게 결과물을 얻을 수 있는 예제를 발견했고, 거의 원큐에 가깝게 목표를 달성해버렸다; 원본 내용은 가운데가 빈 도넛 형태의 도형을 그리고자 작성된 코드가 들어가있는데, 이는 중앙에 지우고자 하는 작은 원을 추가로 캔버스에 그려준 것이라, 가운데 원을 그리지만 않으면 원하는 호 모양을 그릴 수 있게 된다. -- 순서 -- 1. Bitmap 객체를 만들고 2. 캔버스 객체를 만든 Bitmap 객체로 생성 3. 지름과 startAngle, sweepAngle 설정. startAngle은 0f로 설정할 경우 수평방향에서 시작하며, 음수값을 주는 만큼 반시계 방향에서 시작.sweep..
[안드로이드] 사용자 정의 matrix를 사용해 ImageView의 Bitmap 조정하기 기존 안드로이드 Imageview 내에 png 파일이나 비트맵 파일을 집어넣을 때 scaleType 옵션을 사용해 꽉 차게, 혹은 중앙에 위치하는 등의 오토 스케일링이 가능한데, 사용자가 좀 더 세밀하게, 그리고 다양한 옵션을 주고 싶을 때는 이 scaleType 옵션만으로는 성에 차지 않을 수 있다. 본인도 똑같은 이유로 자료를 좀 찾아보았는데, scaleType의 옵션 중 matrix라는 것이 있는데, 이를 사용하면 이미지 회전, 이미지 확대 축소와 이동까지 다양한 옵션을 달아 적용할 수 있는 것이었다. 사용법은 단순하다. 레이아웃의 ImageView의 scaleType의 옵션을 matrix (scaleType="matrix")로 두고 매트릭스 객체를 하나 생성한 뒤에 이를 ImageView에 이미지..
[안드로이드] List나 Arraylist를 다룰 때의 사소한 주의점 MPAndroidChart 라이브러리르 사용하면서 Entry List (List)를 사용해야되는 경우가 생겼는데 다양한 라인을 그려야되다 보니 Entry List의 List (List) 라는 다소 복잡해 보이는 리스트를 쓰게 되었다. 문제는 List에 데이터들을 집어넣는데에는 문제가 없었는데 (ArrayList와 마찬가지로 .add() 사용) add가 끝난 List를 다시 List에 넣고 까보니 자료가 없는 것이었다. 중첩된 List를 쓰는게 문제였을까 싶었는데 해답은 간단했다. List에 한 List를 넣고 나면 이를 clear()등을 써 재활용하는것이 아닌 완전히 new ArrayList(); 를 써 새 ArrayList를 만들어 더해준 뒤 다시 List에 넣어주어야 독립적인 객체로 할당이 되는 것이..
[안드로이드] canvas에 선을 따라 원 그리기 기존에 선을 드로잉 하는 중에 분기점마다 원을 그려줘야 했는데 단순히 선을 드로잉하던 방법처럼은 잘 수행이 안되는 걸 알 수 있었다. 우선 선의 경우 Path 클래스가 따로 있어 드로잉 할 전체 선의 위치들을 moveTo, lineTo 등으로 지정해 줄 수 있었는데 원의 경우 물론 선이 아니었기에 다른 방법이 필요했다. 자료를 참조하던 중에 배열을 쓰던 사용자가 있었는데 이를 참조하여 x,y 좌표값을 저장하는 ArrayList를 사용하기로 했다. 순서로는 1. 선의 path를 세팅하는 곳에서 최초 시작점인 moveTo나 lineTo로 이어지는 곳의 좌표를 2차원 배열에 저장 2. 2차원 배열을 ArrayList에 add 3. 마지막으로 onDraw에서 ArrayList의 사이즈 만큼 canvas.draw..
[안드로이드] 뷰 객체의 좌표값 얻을 때의 간단한 팁 말할것도 없는 팁이지만 애니메이션 등 뷰의 좌표값이 필요할 때 더미로 쓰지 않는 뷰 등을 만들어 좌표값을 얻어오곤 했는데 OnCreateView 내부에서 좌표값을 얻어오려 하면 뷰가 생성되기 이전이라 값이 나오지 않기 때문에 핸들러에 넣거나 애니메이션 리스너에 넣어서 텀을 두고 불러오고는 했다. 여기서 차이점을 하나 발견한 게 있다면 같은 뷰라도 뷰의 종류에 따라 좌표값이 잘 얻어지지 않는 점이 있다는 것이다. 예를 들면 이미지뷰와 그냥 View 로부터 같은 코드, 같은 위치, 같은 타이밍에 좌표값을 얻어와도 View에서는 좌표값을 얻을 수 있던 반면, 이미지뷰에서는 얻을 수 없었다는 정도의 사소한 차이. 그런고로 향후 좌표값을 얻어 애니메이션 적용에 사용하려 할 때엔 더미 뷰를 그냥 View로만 생성하..
[안드로이드] 간단한 직렬화, 역직렬화 쓰기(Serialize, Deserialize) 1. 직렬화를 사용할 액티비티 클래스에 Serializable implement public class MyActivity extends Activity implements Serializable { ... 2. FileOutputStream으로 직렬화한 파일을 저장할 경로와 이름, 확장자를 지정하고 ObjectOutputStream에 직렬화하고자 하는 Object를 writeObject로 추가 try{ FileOutputStream fos= new FileOutputStream(Environment.getExternalStorageDirectory().toString() + "파일경로와 파일 이름.확장자"); ObjectOutputStream oos= new ObjectOutputStream(new B..
[안드로이드] handler 내부에서 Thread 사용시 앱 freezing 발생 개발을 하던 중에 특정 조건이 성립 되었을 때 handler로 메세지를 보내 handleMessage 함수 내에 선언된 Thread를 돌리게 하였다. 헌데 이후에 조건을 충족하고 Thread가 시작되고 나면 지정한 다른 동작들도 먹통이 되고, 전체적으로 앱이 freeze되는 현상이 생겼다. 처음엔 단순히 layout에 접근 못하거나 제어 못하는 것 때문에 생기는 것으로 생각했는데 돌고 돌아 handler 의 handleMessage 함수 안의 Thread 때문인 것을 확인했다. private void handleMessage(Message msg) { switch (msg.what){ case START_WRITE : // Thread 부분 break; } } handler의 handleMessage는 ..