看见一个人写了一个圆形的可以转的菜单,当时看的还是挺模糊的,最后自己模仿的写了一遍,这是源代码
基本思想是这样的
1,把每个图标显示的什么图标确定下来
2,计算每一个点的坐标,
3,在activity就可以正确显示出了
4,当我们移动图标的时候,计算出移动后的图标的角度,知道角度和半径就可以设置它的坐标啊,以它为起始图标,画出剩下的图标
5,实在很模糊,不理解的再议论
启动的Activity
import android.app.Activity;
import android.os.Bundle;
public class Main extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(new CircleMenuActivity(getApplicationContext(), 150, 150, 100));
}
}
菜单生成的类
package rw.circle;
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.Log;
import android.view.MotionEvent;
import android.view.View;
public class CircleMenuActivity extends View {
private Paint paint=new Paint();
private SeeView[] seeViews;
private static final int MenuCount=6;//桌面图标的个数
private int pointX=0,pointY=0;//圆心坐标
private static final int radius=150;//半径
private int DegreeOfPoint;//两个点之间的角度
public CircleMenuActivity(Context context, int x, int y,int radiu) {
super(context);
paint.setColor(Color.GREEN);
paint.setStrokeWidth(2);
setBackgroundResource(R.drawable.tt1);
pointX=x;
pointY=y;
radiu=radius;
SetPoint();
CalculateCoordinate();
// TODO Auto-generated constructor stub
}
/*
* 这个函数是设置每一个点
*/
private void SetPoint() {
// TODO Auto-generated method stub
seeViews=new SeeView[MenuCount];
//SeeView seeView;
int angle=0;
DegreeOfPoint=360/MenuCount;
for (int i = 0; i <MenuCount; i++) {
seeViews[i]=new SeeView();
seeViews[i].angle=angle;
seeViews[i].bitmap=BitmapFactory.decodeResource(getResources(),R.drawable.t1+i);
angle+=DegreeOfPoint;
}
}
private void resetPointAngle(float x,float y){
int angle=CalculateAngle(x, y);
for (int i = 0; i < MenuCount; i++) {
seeViews[i].angle=angle;
angle+=DegreeOfPoint;
}
}
//计算坐标
private void CalculateCoordinate(){
SeeView seeView;
for (int i = 0; i < MenuCount; i++) {
seeView=seeViews[i];
seeView.x=pointX+(float)(radius*Math.cos(seeView.angle*Math.PI/180));
seeView.y=pointY+(float)(radius*Math.sin(seeView.angle*Math.PI/180));
}
}
private int CalculateAngle(float x,float y) {
float distance=(float)Math.sqrt((x-pointX)*(x-pointX)+(y-pointY)*(y-pointY));
int degree=(int)(Math.acos((x-pointX)/distance)*180/Math.PI);
if (y<pointY) {
degree=-degree;
}
return degree;
}
public boolean dispatchTouchEvent(MotionEvent event) {
// TODO Auto-generated method stub
//Animation animation;
//animation=AnimationUtils.loadAnimation(getContext(), R.anim.scale);
resetPointAngle(event.getX(), event.getY());
CalculateCoordinate();
invalidate();
return true;
}
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
canvas.drawPoint(pointX, pointY, paint);
for (int i = 0; i < MenuCount; i++) {
if (!seeViews[i].isVisible)
continue;
drawIncenter(canvas, seeViews[i].bitmap, seeViews[i].x, seeViews[i].y);
}
super.onDraw(canvas);
}
private void drawIncenter(Canvas canvas,Bitmap bitmap,float left,float top)
{
canvas.drawPoint(left, top, paint);
Log.i("-------->", left+"");
Log.i("----------------->", bitmap.getWidth()/2+"");
Log.i("----------------------->", left-bitmap.getWidth()/2+"");
canvas.drawBitmap(bitmap, left+bitmap.getWidth()/2, top+bitmap.getHeight()/2,null);
}
private class SeeView{
Bitmap bitmap;//每个图标的图
float x,y;//每个图标的坐标
int angle;//角度
boolean isVisible=true;//是否可见,当然可见,要不怎么看见
}
}