마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

다음 앱처럼 원으로 되고 시간표처럼 나뉘어진 버튼을 만들려면 어떻게 해야 하나요?

+4 추천

 

다음 앱에 나오는 저 원형 버튼들.

 

이런 형태의 버튼을 만들고 싶은데, 어떻게 해야 할까요??

 

버튼 커스텀으로 해도 안될거 같은데..

 

감도 잘 안오네요. ^^; 어떤식으로 구현해야할지 간단히 설명 부탁드려요!

gusdn9 (1,560 포인트) 님이 2013년 4월 17일 질문

1개의 답변

+5 추천
 
채택된 답변

1. 버튼 클릭시 WindowManager를 이용하여 원형이미지를 첨부한 View를 팝업.

2. View에 onTouchListener 추가

3. onTouch()

@Override
public boolean onTouch(View v, MotionEvent event) {
			
	float touchX = event.getX();
	float touchY = event.getY();
						
	int action = event.getAction();
			
	if (action == MotionEvent.ACTION_OUTSIDE){
     	        이미지뷰.setVisibility(View.INVISIBLE);
		팝업윈도우.dismiss();
		return false;
	} else if (action == MotionEvent.ACTION_DOWN || action == MotionEvent.ACTION_MOVE){
		int degree = getDegree(touchX, touchY);
		int area = getArea(degree);

		이미지뷰.setVisibility(View.VISIBLE);
				
		selectMenu(area);
				
	} else if (action == MotionEvent.ACTION_UP){

		이미지뷰.setVisibility(View.INVISIBLE);
				
		** 메뉴를 선택하고 touch를 떼었을때 이벤트 실행 **
				
		return false;
	}
			
	return true;
}

4. 유져가 touch한 x,y좌표로 각도를 계산

private int getDegree(float x, float y){
		int centerX = 이미지뷰.getWidth() / 2;
		int centerY = 이미지뷰.getHeight() / 2;
			
		float calcX = x - centerX;
		float calcY = y - centerY;
			
		double tan = Math.atan2(calcY, calcX);
			
		double result = 180 * tan / Math.PI;
		int degree = - ((int) Math.round(result));
			
		if (degree < 0){
			degree = 360 + degree;
		}
			
		return degree;
	}

5. 각도를 기반으로 터치한 부분의 구역번호를 구함

private int getArea(int degree){
	if (degree >= 0 && degree < 60){
		return 3;
	} else if (degree >= 60 && degree < 120){
		return 2;
	} else if (degree >= 120 && degree < 180){
		return 1;
	} else if (degree >= 180 && degree < 240){
		return 6;
	} else if (degree >= 240 && degree < 300){
		return 5;
	} else if (degree >= 300 && degree < 360){
		return 4;
	} else {
		return 0;
	}
}

6. 구역번호를 바탕으로 이벤트 실행

private void selectMenu(int areaCode){

    switch(areaCode){

        case 0:
              이미지변환, 텍스트색상 변경 등등
              break;

        이하 생략
    }
}

너무 대충 써놔서 도움이 되셨는지 모르겠네요..;;

 

ignition (560 포인트) 님이 2013년 5월 7일 답변
gusdn9님이 2013년 5월 9일 채택됨
자세한 답변 감사드립니다. ^_^
...