易网时代-编程资源站
Welcome
微信登录
编程资源
图片资源库
蚂蚁家优选
PDF转换器
软件资源
软件开发
、
小程序制作
、
系统集成与运维
、
空间租用
、
硬件开发
、
视频监控
、
技术咨询与支持
——联系电话:0311-88999002/88999003
首页
/
操作系统
/
Linux
/
Android 仿酷点圆形菜单
看见一个人写了一个圆形的可以转的菜单,当时看的还是挺模糊的,最后自己模仿的写了一遍,这是源代码
基本思想是这样的
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
;
//是否可见,当然可见,要不怎么看见
}
}
收藏该网址
版权所有©石家庄振强科技有限公司2024
冀ICP备08103738号-5
网站地图