본문 바로가기

안드로이드19

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.
사각형 말고 원형 충돌검사 게임상에서 가장 기본적인 충돌검사는 사각, 원, 선 검사라고 생각한다 왜냐하면 이 세가지의 개념을 조합하면 좀더 정밀한 다각형, 픽셀 검사를 할수 있기 때문이다 여기서는 단순하게 원형끼리의 검사를 살펴보겠다 원은 한점에서 일정거리 만큼의 영역을 가지는 도형이다 그래서 두 원의 영역이 겹치는 조건은 중심점끼리의 거리로 판단한다. 위와 같이 중심점 사이의 거리가 두 반지름의 합보다 크면 서로 떨어져 있는 것이다. 두점 사이의 거리는 중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.
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.
함수의 옵션을 블럭처럼 조합해서 사용해보자~ 소스를 짜다 보면 함수에 옵션을 넣어야 할 경우가 종종 있다 function(value1, value2, OPTION); 이런식으로 말이다. 그런데 비트연산자로 조합해서 쓰면 더 유용하다 function(value1, value2, OPTION1|OPTION2); 그렇다면 이 비트연산자 조합은 어떤식으로 적용되는 것일까? 먼저 "|"는 or로 두개중 하나만 참이면 참이 된다 예를 들면, 0 | 0 = 0 1 | 0 = 1 1 | 1 = 1 이것을 이용하면 두개의 조합이 가능하다 OPTION1 OPTION2 000 000 | 000 000 = 000 000 001 000 | 000 010 = 001 010 010 000 | 000 111 = 010 111 위와 같이 각각 한쪽을 000으로 비워두고 or을 .. 2015. 8. 24.
Surface View에서 간단한 이미지버튼 손수 만들기 앱을 제작할때에는 버튼 클래스가 기본적으로 제공된다.. 하지만 SurfaceView 기반의 게임을 만들때는 그렇지 않기 때문에 손수 만들어야 한다.. 빠른 이해를 위해 모든 군더더기는 다 빼고 이미지로만 이루어진 버튼 클래스를 만들어 보겠다.. 클래스 public class GraphicButton { public static final int IMAGE_UP = 0; public static final int IMAGE_DOWN = 1; private Bitmap[] mImage; private Rect mRect; public int mImageNum; public GraphicButton(Rect rect) { mRect = rect; mImage = new Bitmap[2]; mImageNum =.. 2014. 10. 19.
스레드에서 View 변경시 Only the original thread…. 에러 대처법 게임을 만들다 보면 스레드를 자주 이용하게 된다. 그러다보면 Only the original thread that created a view hierarchy can touch its views 라는 에러를 맞다들이게 되는 경우가 반드시 찾아온다... 이 에러는 말그래로 오리지널 스레드... 즉, 앱 실행시 자동으로 생성되는 메인 스레드외에 직접 만든 스레드로 뷰위젯등을 컨트롤할려고 할때 발생한다... 예를 들어 TextView의 setText()같은 것이다... 나도 처음 게임을 만들 당시 이것 때문에 몇일을 고민했던 적이 있었다... 그러다 찾아낸것이 View의 Post()였는데 이방법은 특정사항에서는 작동이 안되는 문제가 있었다... 결국, 우연한 기회에 Handler 방식을 알게되었는데 역시 다른.. 2013. 11. 25.
단말기 해상도에 관계없이 항상 같은 크기로 이미지를 보여주고 싶을때 안드로이드 앱을 만들다 보면 단말기마다 해상도가 달라 이미지 크기나 비율이 제멋대로 일때가 있다. 예를 들면 480x800 와 1080x1920에서 imageview를 100x80px로 잡으면 상대적으로 480x800보다 1080x1920에서 작게 나온다. 그래서 대부분 px 대신 dp로 하게 된다. dp로 하면 해상도에 따라 자동으로 크기를 보정해 주기 때문이다. 하지만 dp도 정확히 해상도에 비례해서 보정해 주지는 않는다.왜냐하면 dp는 Density(인치당 픽셀수) 에 영향을 받기 때문이다 그렇다면 만약 해상도와 Density에 관계없이 항상 같은 크기로 이미지를 보여주고 싶을때는 어떻게 해야 하는가? 내가 가장 많이 사용하는 방법은 이렇다. DisplayMetrics metrics = new Di.. 2013. 8. 29.