본문 바로가기

개발64

TimePicker, DatePicker, NumberPicker의 폰트 바꾸기 시간을 쉽게 선택할 수 있는 TimePicker, 날짜를 쉽게 선택할 수 있는 DatePicker 이것들은 NumberPicker로 이루어진 UI이다. 그래서 이 Picker들의 폰트를 바꾸기 위해서는 NumberPicker의 구조를 알아야 한다. NumberPicker는 현재 선택된 숫자를 보여주는 TextView와 그 주위의 숫자를 스크롤하며 보여주는 휠 뷰로 구성된다. (스타일을 Theme.Holo.Light 로 적용했을 경우) 즉, 폰트를 바꿔줄때 이 두가지를 모두 바꿔줘야 한다는 의미다. public void setTypeface(NumberPicker picker, Typeface typeface) { //주위의 숫자들을 보여주는 휠 뷰 try { //클래스의 휠 Paint 객체를 꺼내 폰트를.. 2016. 7. 18.
카메라 위에 스킨을 넣어 찍어보자~ 카메라 사진 위에 그림이나 글자를 넣어 찍고 싶다면?? 의외로 간단하다... 아래를 보시라~ 사진을 찍을려면 먼저 카메라를 연동해야 한다. 이부분은 비록 복잡해 보이지만 어차피 안드로이드 샘플 예제에 다 나오는 내용이다. 그런데 룰리팝 이후로 카메라 연동방법이 바뀌는 바람에 다시 삽질좀 하며 작성했다ㅎㅎ 이글의 주제는 카메라 연동이 아니니 참고만... 설명도 생략... private CameraManager mCameraManager; private CameraDevice mCameraDevice; private Camera mCamera; private Size mPreviewSize; private CaptureRequest.Builder mPreviewBuilder, mPictureBuilder; .. 2016. 5. 30.
초간단 꺽은선 그래프 만들기 그래프는 텍스트로 표현하기 복잡한 정보를 한결 보기좋게 만드는 매력이 있다. 그래서 간편함의 상징인 모바일에서는 빠질수 없는 요소이다. 특히 많이 쓰이는 것이 막대 그래프와 꺽은선 그래프 일것이다. 그런데 꺽은선 그래프는 선이 하나로 이어져 있기 때문에 만드는데 애를 먹을때가 있다 그때를 대비해 초간단 꺽은선 그래프뷰를 만들어 놓자~ 구미에 맞게 확장해서 쓰면 매우 유용하다 public class GraphView extends View { private ShapeDrawable mLineShape; private Paint mPointPaint; private float mThickness; private int[] mPoints, mPointX, mPointY; private int mPointSiz.. 2016. 4. 25.
버튼의 Selector 이미지를 간절히 가져오고 싶다면? 보통 Selector를 xml로 아래와 같이 만들어 놓는다. 그리고 버튼 background에 적용한다. 별로~ 그럴일은 없지만 만약 이 selector의 android:drawable 이미지를 자바 코드상으로 불려오고 싶다면?? private Drawable[] getPressImages(View v) { //Selector 이미지를 StateListDrawable 객체로 불러옴 StateListDrawable statedrawable = (StateListDrawable)v.getBackground(); if(statedrawable != null) { try { //Veiw의 현재 이미지 상태를 배열에 가져옴 int[] currentstate = v.getDrawableState(); //이미지를 .. 2016. 3. 28.
일반뷰를 맵뷰처럼 밀어서 스크롤 시키기 맵뷰나 스크롤뷰를 손가락으로 살짝 밀면 미끄러지듯이 스크롤이 되다가 서시히 멈춘다 이것을 일반뷰에서도 가능하게 해보자~ 기본적인 개념은 이렇다 손가락이 닿았을때 좌표와 시간을 저장하고 손가락이 떨어졌을때 저장된 좌표와 현재 좌표의 차를 계산해 거리와 방향을 구한다 그리고 시간의 차도 계산해 거리와 나눠 속도를 구한다 이것을 스레드로 속도를 서서히 줄이면서 계속 스크롤 해주면 된다. 소스로 보면 더 잘 이해될것이다. private View mView; private long mTime; private ScrollThread mThread; @Override public boolean onTouchEvent(MotionEvent event) { float touchx = event.getX(); float .. 2016. 2. 29.
사각형 말고 원형 충돌검사 게임상에서 가장 기본적인 충돌검사는 사각, 원, 선 검사라고 생각한다 왜냐하면 이 세가지의 개념을 조합하면 좀더 정밀한 다각형, 픽셀 검사를 할수 있기 때문이다 여기서는 단순하게 원형끼리의 검사를 살펴보겠다 원은 한점에서 일정거리 만큼의 영역을 가지는 도형이다 그래서 두 원의 영역이 겹치는 조건은 중심점끼리의 거리로 판단한다. 위와 같이 중심점 사이의 거리가 두 반지름의 합보다 크면 서로 떨어져 있는 것이다. 두점 사이의 거리는 중3때 배우는 공식을 사용하면 된다 (http://mathbang.net/138) 반대의 경우로 중심점 거리가 반지름의 합보다 작아지면 겹치게 된다. 즉, 이때가 충돌한 것이다. 충돌이긴 한데.. 완전히 겹치는, 다시 말해 한 원에 완전히 포함되는 경우는 반지름의 차로 계산한다... 2016. 1. 25.
알기 쉬운 안드로이드의 방위각 게임에서 케릭터를 이동시킬때 방위각이 필요하다. 이때 각도를 라디안으로 계산하면 편리하다. 시작점에서 끝점 방향으로 이동할때의 방위각을 구해보자. public float getRadian(float startx, float starty, float endx, float endy) { float x = endx - startx; float y = endy - starty; return (float)Math.atan2(y, x); } 거꾸로 방위각에서 방향벡터를 구해보자. public float[] getNormal(float radian) { return new float[] {(float)Math.cos(radian), (float)Math.sin(radian)}; } 케릭터 이미지를 방향별로 회전해야 .. 2015. 12. 28.
Bitmap 이미지를 byte로 바로 보낸다고? 그것도 소켓으로? 군대를 막 전역했을때 다시 완벽한 민간인이 되기 위해 책한권을 샀었다 바로 "TCP/IP 소켓 프로그래밍" 이었다 이때 처음 접한 네크워크 코딩술로 간단한 원도우용 채팅프로그램을 만들었고 졸업후에는 PC와 스마트폰간의 연결앱인 "키보드에디터"를 출시하였다. 물론 쫄닥 망했다ㅎㅎ 어쨌든 그후에도 가끔씩 소켓기반의 앱을 만들면서 자연스럽게 이미지 전송도 하게되었다 여기서는 비트맵이미지를 파일형태가 아닌 Byte단위의 원본으로 바로 보내는 것을 다뤄보겠다. 파일도 결국은 Byte로 보내는것이지만... 외부파일이 아닌 내부이미지를 불러와 바로 전송할때 유용할것이다~ -서버 public class Server implements Runnable { @Override public void run() { try { .. 2015. 11. 30.
이미지를 싹뚝 자를때 꼭 알아야 할 비밀 이미지를 전체가 아닌 일부분만 출력하고 싶을때 사용하는 기법이 Image Clipping 이다. 게임을 만들때는 없어서는 안되는 아주 고마운 녀석이다. 보통 Clipper 객체를 만들어 사용하는데... 어렸을때는 왜 굳이 객체까지 만들어서 이미지를 자르나.. 그냥 자르면 되지.. 라며 쓸데 없는것이라고 생각했었다. 하지만 어른이 되고 개발을 업으로 살다보니 조상님들의 지혜에 감탄하듯 그 이유를 깨닫게 되었다ㅎㅎ 아주 단순하고 지극히 당연하지만... 그래서 간과하기 쉬운 클리핑의 원리! 비밀 아닌 비밀같은 클리핑을 알아보자~ 위 그림처럼 클리핑은 이미지 원본크기와 출력크기가 다르다는 것이 문제이다. 또 원본좌표는 (0, 0)에서 시작되지만 출력좌료는 스크린좌표가 더해진다. 이것을 같은 크기와 좌표로 작업할.. 2015. 10. 26.
DialogFragment에 DismissListener를 쉽게 사용하는 방법 DialogFragment를 종료한 후 결과를 받아서 처리해야 할때가 있다. 당연히 이때는 DismissListener를 사용하면 된다. 하지만 그냥 사용하는것보다 약간의 튜닝을 하면 더 편하다. public abstract class DialogDismissListener implements DialogInterface.OnDismissListener { private HashMap mStrMap; private HashMap mIntMap; private HashMap mBoolMap; public void setValue(String key, String value) { if(mStrMap == null) mStrMap = new HashMap(); mStrMap.put(key, value); } .. 2015. 9. 21.