package com.test.iunote.rotate_v1;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.RectF;
import android.os.Bundle;
import android.os.Handler;
import android.support.v7.app.ActionBarActivity;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.RotateAnimation;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;
public class MainActivity extends ActionBarActivity {
CircleManager mCircleManager; //원을 그리는 도구
Context context;
//private String[] STRINGS = { "1" ,"2","3","4","5","6","7","8"}; // 값
// private float values[] = { 1, 1, 10, 20, 68}; // 원의 비율 값이 클수록 커진다.
private String[] STRINGS = { "1" ,"2"};
private float rate[] = {30,70};
private float rate2[] ={30,70};
private float values[] = getArray(rate2);
private String title;
List<Vo> interfaceDate = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 원 유틸리티를 초기화한다.
mCircleManager = new CircleManager(this);
// 레이아웃을 불러온다.
LinearLayout linear = (LinearLayout) findViewById(R.id.rotate_circle);
// 버튼 이벤트를 지정한다.
Button btn = (Button) findViewById(R.id.btn_rotate);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 회전할 각도를 지정한다.
int degree = getResult();
Log.e("nnn", degree + "");
Button btn = (Button) findViewById(R.id.btn_rotate);
btn.setEnabled(false);
mCircleManager.onRotateCircle(3600 + degree); //회전하는각도 값 보냄
// onDraw를 호출한다.
mCircleManager.invalidate();
mCircleManager.getText();
}
});
linear.addView(mCircleManager);
}
//List 갯수만큼 룰렛 1값으로 갯수생성
public float[] getArray(float[] values){
for(int i=0;i<values.length;i++){
values[i] = 1;
}
return values ;
}
public int getResult(){
Log.d("getRserulrt", "1");
// API 값을 가져온다.
//List<Vo> interfaceDate = new ArrayList<>();
for(int i = 0 ; i < STRINGS.length; i++) {
interfaceDate.add(new Vo(STRINGS[i], (int) rate[i]));
Log.d("getValue", interfaceDate.get(i).getValue() + "getTitile" +interfaceDate.get(i).getTitile());
}
return getItemOne(interfaceDate);
}
//난수
public int selectRandom(){
Random rand = new Random();
int n = rand.nextInt(100) + 1;
return n;
}
/**
* 난수값에 해당하는 각도구하기
*/
public int getRotate(int num){
int i=1;
int rotate=0;
for(int n=values.length;n>0;n--){
if(num >= interfaceDate.get(n-1).getMinV() && num <= interfaceDate.get(n-1).getMaxV()){
title = interfaceDate.get(n-1).getTitile();
int a= 360/values.length;
rotate = (a*i)+250;
Log.d("aaaaaaaaa", a+ "");
Log.d("title", title + "");
Log.d("rotate", rotate + "");
break;
}
i++;
}
return rotate;
}
public int getItemOne(List<Vo> list) {
Log.d("getRserulrt", "getItemOne");
String value = "";
// setValue
int b = 0;
int initValue = 0;
//minvalue , maxvalue setting
for(int i = 0; i < list.size(); i++) {
list.get(i).setMinV(initValue);
list.get(i).setMaxV(initValue + list.get(i).getValue());
initValue += list.get(i).getValue();
Log.d("TAG",list.get(i).getTitile()+" min : " + list.get(i).getMinV() + "/ max : " + list.get(i).getMaxV());
}
int number = selectRandom();
//난수값이 (if 문) minvalue 보다 같거나 크고 / maxvalue 같거나 작고
Log.e("number",number+"");
int rotate = getRotate(number);
return rotate;
}
public class CircleManager extends View {
private Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); // 페인트
private float[] value_degree;
private int[] COLORS = { Color.YELLOW, Color.GREEN, Color.WHITE, Color.CYAN, Color.RED ,Color.GRAY,Color.MAGENTA,Color.GRAY };
private Button button = (Button)findViewById(R.id.btn_rotate);
private TextView textView = (TextView)findViewById(R.id.result);
int temp = 0;
int rotate = 0;
boolean isRotate = false; //제어변수
private Animation anim;
private Handler handler;
private Runnable runnable;
// 기본 생성자
public CircleManager(Context context) {
super(context);
value_degree = calculateData(values);
}
// 비율을 계산해서 원을 그린다.
private float[] calculateData(float[] data) {
float total = 0;
for (int i = 0; i < data.length; i++) {
total += data[i];
}
for (int i = 0; i < data.length; i++) {
data[i] = 360 * (data[i] / total);
}
return data;
}
/**
*
* 회전에 대한 옵션을 지정한다.
* @param degree 각도
*/
private void onRotateCircle(int degree) {
// 각도를 지정한다.
this.rotate = degree;
Toast.makeText(getContext(), "회전을 시킨다.", Toast.LENGTH_SHORT).show();
// 회전을 제어한다.
this.isRotate = true;
}
/**
*
* 에니메이션을 만든다.
*
*/
private void createAnimation() {
// anim = new RotateAnimation(0, rotate, getWidth()/2, getHeight()/2);
Log.e("torate nn", rotate + "/");
anim = new RotateAnimation(0, rotate, Animation.RELATIVE_TO_SELF, 0.5f,Animation.RELATIVE_TO_SELF, 0.5f);
anim.setDuration(3000); //
anim.setFillEnabled(true);
anim.setFillAfter(true);
startAnimation(anim);
}
//버튼 활성화 , 결과값
private void getText(){
runnable = new Runnable() {
@Override
public void run() {
// textView.setText(title);
button.setEnabled(true);
};
};
handler = new Handler();
handler.postDelayed(runnable,3000);
};
/**
*
* 이미지를 그릴때 호출된다.
* @param canvas
*/
@Override
protected void onDraw(Canvas canvas)
{
super.onDraw(canvas);
Log.d("test", "onDraw 호출 !!!!!! ");
// 도형의 크기를 지정한다. 원을 그리기위해 view의 크기를 layout에서 지정해야 한다.
final int width = getWidth();
final int height = getHeight();
temp = 0;
// float 형 사각형 클레스 - 도형을 그리기 위해 쓰임
RectF rectf = new RectF(10, 10, width, height);
// 정수형 사각형 클래스 - 글자를 쓰기위해 쓰임
Rect rect = new Rect(10, 10, width, height);
int centerX = (rect.left + rect.right) / 2;
int centerY = (rect.top + rect.bottom) / 2;
int radius = (rect.right - rect.left) / 2;
radius *= 0.5; // 1 will put the text in the border, 0 will put the text in the center. Play with this to set the distance of your text.
for (int i = 0; i < value_degree.length; i++)
{
if (i > 0)
temp += (int) value_degree[i - 1]; // rewrote your code here a bit, to avoid duplicate code.
// 부채골을 그린다.
paint.setColor(COLORS[i]); // 칼리저정
paint.setAntiAlias(true); // 화면 부드럽게
paint.setTextAlign(Paint.Align.CENTER); // 텍스트를 가운데 정렬한다.
canvas.drawArc(rectf, temp, value_degree[i], true, paint); // 캔버스에 paint를 입힌다.
// text를 입힌다.
float medianAngle = (temp + (value_degree[i] / 2f)) * (float)Math.PI / 180f; // this angle will place the text in the center of the arc.
paint.setColor(Color.BLACK);
paint.setTextSize(64); // 텍스트의 크기를 지정한다. DP
paint.setStyle(Paint.Style.STROKE);
canvas.drawText(STRINGS[i], (float) (centerX + (radius * Math.cos(medianAngle))), (float) (centerY + (radius * Math.sin(medianAngle))), paint);
Log.d("TEMP", temp + " STINGS[i] " + STRINGS[i]);
// 회전 버튼을 클릭하면 회전 이벤트를 호출한다.
if (isRotate) {
createAnimation();
canvas.drawCircle(width, height, 0, paint); // 넓이, 높이, 반지름, 그릴 페인트
isRotate = false;
}
}
}
}
}