package kaven;
import java.util.ArrayList;
import chroya.demo.roundspin.R;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.FloatMath;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Toast;
/**
* 可以转动的View
* @author kaven
*
*/
public class RoundPlateView extends View {
private Paint mPaint = new Paint();
//stone列表
private BigStone[] mStones;
//数目
private int STONE_COUNT = 6;
private int sum;
//圆心坐标
private int mPointX=0, mPointY=0;
//半径
private int mRadius = 0;
//每两个点间隔的角度差
private int mDegreeDelta;
//点击了哪一个按钮
private int downIndex;
//是否是点击
private boolean isDown;
private float firstX;
private float firstY;
public RoundPlateView(Context context, int px, int py, int radius) {
super(context);
mPaint.setColor(Color.RED);
mPaint.setStrokeWidth(2);
setBackgroundResource(R.drawable.bg);
myBtnArrayList = new ArrayList<RoundPlateView.MyButton>();
mPointX = px;
mPointY = py;
mRadius = radius;
}
public void setBitmap(ArrayList<Bitmap> arrayList){
//my
if(arrayList!=null&&arrayList.size()>0){
sum=arrayList.size();
int angle=0;
mDegreeDelta=360/sum;
for(int i=0;i<sum;i++){
MyButton myButton=new MyButton();
myButton.angle=angle;
myButton.bitmap=arrayList.get(i);
angle += mDegreeDelta;
myBtnArrayList.add(myButton);
}
computeCoordinates();
}
}
/**
* 重新计算每个点的角度
*/
private void resetStonesAngle(float x, float y) {
//my
int angle = computeCurrentAngle(x, y);
myBtnArrayList.get(downIndex).angle=angle;
angle+=mDegreeDelta;
int i=downIndex+1;
for(;i<sum;i++){
myBtnArrayList.get(i).angle=angle;
angle+=mDegreeDelta;
}
i=0;
for(;i<downIndex;i++){
myBtnArrayList.get(i).angle=angle;
angle+=mDegreeDelta;
}
}
/**
* 计算每个点的坐标
*/
private void computeCoordinates() {
//my
for(int i=0;i<sum;i++){
MyButton myButton = myBtnArrayList.get(i);
myButton.x=mPointX+ (float)(mRadius * Math.cos(myButton.angle*Math.PI/180));
myButton.y=mPointY+ (float)(mRadius * Math.sin(myButton.angle*Math.PI/180));
}
}
/**
* 计算第一个点的角度
* @param x
* @param y
* @return
*/
private int computeCurrentAngle(float x, float y) {
float distance = (float)Math.sqrt(((x-mPointX)*(x-mPointX) + (y-mPointY)*(y-mPointY)));
int degree = (int)(Math.acos((x-mPointX)/distance)*180/Math.PI);
if(y < mPointY) {
degree = -degree;
}
return degree;
}
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
float x = event.getX();
float y = event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
//my
isDown=true;
firstX=x;
firstY=y;
for(int i=0;i<sum;i++){
float x2 = myBtnArrayList.get(i).x;
float y2 = myBtnArrayList.get(i).y;
float ddx=x-x2;
float ddy=y-y2;
float dis = FloatMath.sqrt(ddx*ddx+ddy*ddy);
Log.d("tag","dis:"+dis);
if(dis<(mRadius/2)){
downIndex=i;
break;
}
}
break;
case MotionEvent.ACTION_UP:
//my
for(int i=0;i<sum;i++){
float x2 = myBtnArrayList.get(i).x;
float y2 = myBtnArrayList.get(i).y;
float ddx=x-x2;
float ddy=y-y2;
float dis = FloatMath.sqrt(ddx*ddx+ddy*ddy);
if(dis<(mRadius/2)){
if(isDown){
if(onClickListener!=null){
onClickListener.onCustomClick(i);
}
}
break;
}
}
break;
case MotionEvent.ACTION_MOVE:
float x2 = event.getX();
float y2 = event.getY();
float x3=x2-firstX;
float y3=y2-firstY;
if(FloatMath.sqrt(x3*x3+y3*y3)>4.0){
resetStonesAngle(event.getX(), event.getY());
computeCoordinates();
invalidate();
firstX=x2;
firstY=y2;
isDown=false;
}
break;
default:
break;
}
return true;
}
@Override
public void onDraw(Canvas canvas) {
canvas.drawPoint(mPointX, mPointY, mPaint);
//my
for(int i=0;i<sum;i++){
drawInCenter(canvas,myBtnArrayList.get(i).bitmap,myBtnArrayList.get(i).x,myBtnArrayList.get(i).y);
}
}
/**
* 把中心点放到中心处
* @param canvas
* @param bitmap
* @param left
* @param top
*/
private void drawInCenter(Canvas canvas, Bitmap bitmap, float left, float top) {
canvas.drawPoint(left, top, mPaint);
canvas.drawBitmap(bitmap, left-bitmap.getWidth()/2, top-bitmap.getHeight()/2, null);
}
private class MyButton{
Bitmap bitmap;
int angle;
float x;
float y;
}
class BigStone {
Bitmap bitmap;
int angle;
float x;
float y;
}
//点击的事件
public interface CustomOnClickListener{
void onCustomClick(int item);
}
private CustomOnClickListener onClickListener;
private ArrayList<MyButton> myBtnArrayList;
public void setCustomOnClickListener(CustomOnClickListener clickListener){
this.onClickListener=clickListener;
}
}
- 1
- 2
- 3
- 4
- 5
- 6
前往页