- 浏览: 237457 次
- 性别:
- 来自: 广州
最新评论
-
Janne:
你好 有源代码?可以发到我的邮箱里学学吗?2731049993 ...
achartengine画出动态折线图的效果 -
anbo724:
我的邮箱 anbo724@gmail.com谢谢@
achartengine画出动态折线图的效果 -
anbo724:
你好 请问有源码没《?谢谢
achartengine画出动态折线图的效果 -
weiday123:
额,觉得这个会不会占堆内存?
AdapterView、Adapter优化 -
wen742538485:
为什么没有呢?权限没加还是发创建了给你删了再想创建?是不允许重 ...
Android中为你的应用程序添加桌面快捷方式
今天偶然看到一个圆盘形的菜单,还可以转动,感觉挺有意思,然后想了想,做了个简单的效果。
思路是这样的,定一个原点和一个半径,圆的四周均匀分布每个菜单。为了方便计算,菜单的坐标用度数表示,然后转化为极坐标计算。
定某个点为起始点,根据总菜单数确定每个点增加的度数,然后依次确定每个点的度数,也就确定了坐标。
Java代码
package chroya.demo.roundspin;
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;
/**
* 圆盘式的view
* @author chroya
*
*/
public class RoundSpinView extends View {
private Paint mPaint = new Paint();
//stone列表
private BigStone[] mStones;
//数目
private static final int STONE_COUNT = 6;
//圆心坐标
private int mPointX=0, mPointY=0;
//半径
private int mRadius = 0;
//每两个点间隔的角度
private int mDegreeDelta;
public RoundSpinView(Context context, int px, int py, int radius) {
super(context);
mPaint.setColor(Color.RED);
mPaint.setStrokeWidth(2);
setBackgroundResource(R.drawable.menubkground);
mPointX = px;
mPointY = py;
mRadius = radius;
setupStones();
computeCoordinates();
}
/**
* 初始化每个点
*/
private void setupStones() {
mStones = new BigStone[STONE_COUNT];
BigStone stone;
int angle = 0;
mDegreeDelta = 360/STONE_COUNT;
for(int index=0; index<STONE_COUNT; index++) {
stone = new BigStone();
stone.angle = angle;
stone.bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.menu1+index);
angle += mDegreeDelta;
mStones[index] = stone;
}
}
/**
* 重新计算每个点的角度
*/
private void resetStonesAngle(float x, float y) {
int angle = computeCurrentAngle(x, y);
Log.d("RoundSpinView", "angle:"+angle);
for(int index=0; index<STONE_COUNT; index++) {
mStones[index].angle = angle;
angle += mDegreeDelta;
}
}
/**
* 计算每个点的坐标
*/
private void computeCoordinates() {
BigStone stone;
for(int index=0; index<STONE_COUNT; index++) {
stone = mStones[index];
stone.x = mPointX+ (float)(mRadius * Math.cos(stone.angle*Math.PI/180));
stone.y = mPointY+ (float)(mRadius * Math.sin(stone.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;
}
Log.d("RoundSpinView", "x:"+x+",y:"+y+",degree:"+degree);
return degree;
}
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
resetStonesAngle(event.getX(), event.getY());
computeCoordinates();
invalidate();
return true;
}
@Override
public void onDraw(Canvas canvas) {
canvas.drawPoint(mPointX, mPointY, mPaint);
for(int index=0; index<STONE_COUNT; index++) {
if(!mStones[index].isVisible) continue;
drawInCenter(canvas, mStones[index].bitmap, mStones[index].x, mStones[index].y);
//不想有红线,就注掉下面这句
// canvas.drawLine(mPointX, mPointY, mStones[index].x, mStones[index].y, mPaint);
}
}
/**
* 把中心点放到中心处
* @param canvas
* @param bitmap
* @param left
* @param top
*/
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);
}
class BigStone {
//图片
Bitmap bitmap;
//角度
int angle;
//x坐标
float x;
//y坐标
float y;
//是否可见
boolean isVisible = true;
}
}
代码里注释也很清楚。STONE_COUNT表示菜单的数目,可以设置为1到7,更大的数字需要图片支持,我只放了7张图片。
如果触摸的点不在圆周上,会自动计算出点到圆心的直线跟圆的交点,然后映射上去。
5个菜单的效果,画了线的:
思路是这样的,定一个原点和一个半径,圆的四周均匀分布每个菜单。为了方便计算,菜单的坐标用度数表示,然后转化为极坐标计算。
定某个点为起始点,根据总菜单数确定每个点增加的度数,然后依次确定每个点的度数,也就确定了坐标。
Java代码
package chroya.demo.roundspin;
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;
/**
* 圆盘式的view
* @author chroya
*
*/
public class RoundSpinView extends View {
private Paint mPaint = new Paint();
//stone列表
private BigStone[] mStones;
//数目
private static final int STONE_COUNT = 6;
//圆心坐标
private int mPointX=0, mPointY=0;
//半径
private int mRadius = 0;
//每两个点间隔的角度
private int mDegreeDelta;
public RoundSpinView(Context context, int px, int py, int radius) {
super(context);
mPaint.setColor(Color.RED);
mPaint.setStrokeWidth(2);
setBackgroundResource(R.drawable.menubkground);
mPointX = px;
mPointY = py;
mRadius = radius;
setupStones();
computeCoordinates();
}
/**
* 初始化每个点
*/
private void setupStones() {
mStones = new BigStone[STONE_COUNT];
BigStone stone;
int angle = 0;
mDegreeDelta = 360/STONE_COUNT;
for(int index=0; index<STONE_COUNT; index++) {
stone = new BigStone();
stone.angle = angle;
stone.bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.menu1+index);
angle += mDegreeDelta;
mStones[index] = stone;
}
}
/**
* 重新计算每个点的角度
*/
private void resetStonesAngle(float x, float y) {
int angle = computeCurrentAngle(x, y);
Log.d("RoundSpinView", "angle:"+angle);
for(int index=0; index<STONE_COUNT; index++) {
mStones[index].angle = angle;
angle += mDegreeDelta;
}
}
/**
* 计算每个点的坐标
*/
private void computeCoordinates() {
BigStone stone;
for(int index=0; index<STONE_COUNT; index++) {
stone = mStones[index];
stone.x = mPointX+ (float)(mRadius * Math.cos(stone.angle*Math.PI/180));
stone.y = mPointY+ (float)(mRadius * Math.sin(stone.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;
}
Log.d("RoundSpinView", "x:"+x+",y:"+y+",degree:"+degree);
return degree;
}
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
resetStonesAngle(event.getX(), event.getY());
computeCoordinates();
invalidate();
return true;
}
@Override
public void onDraw(Canvas canvas) {
canvas.drawPoint(mPointX, mPointY, mPaint);
for(int index=0; index<STONE_COUNT; index++) {
if(!mStones[index].isVisible) continue;
drawInCenter(canvas, mStones[index].bitmap, mStones[index].x, mStones[index].y);
//不想有红线,就注掉下面这句
// canvas.drawLine(mPointX, mPointY, mStones[index].x, mStones[index].y, mPaint);
}
}
/**
* 把中心点放到中心处
* @param canvas
* @param bitmap
* @param left
* @param top
*/
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);
}
class BigStone {
//图片
Bitmap bitmap;
//角度
int angle;
//x坐标
float x;
//y坐标
float y;
//是否可见
boolean isVisible = true;
}
}
代码里注释也很清楚。STONE_COUNT表示菜单的数目,可以设置为1到7,更大的数字需要图片支持,我只放了7张图片。
如果触摸的点不在圆周上,会自动计算出点到圆心的直线跟圆的交点,然后映射上去。
5个菜单的效果,画了线的:
发表评论
-
Android Tween动画之RotateAnimation实现图片不停旋转
2012-11-26 22:38 1093本文主要介绍Android中如何使用rotate实现图片不停旋 ... -
Android实现widget定时更新
2012-11-04 20:20 932在开发Android的widget时,第一个需要解决的问题就是 ... -
来自腾讯、谷歌、百度等名企的精选面试五十题
2012-10-07 23:08 942http://www.apkway.com/thread-90 ... -
Android 中Parcelable的作用
2012-09-24 09:53 884android提供了一种新的类型:Parcel。本类被用作封装 ... -
[Android算法] 【eoeAndroid索引】史上最牛最全android开发知识汇总
2012-09-13 09:33 1128http://www.eoeandroid.com/threa ... -
安卓航班推荐70个具有商业实战性的精品Android源码
2012-08-01 00:00 947http://www.apkway.com/thread-58 ... -
Android测试教程汇总
2012-08-02 14:51 1161http://www.apkway.com/thread-67 ... -
Service 与 Thread 的区别
2012-07-26 00:10 927Service 与 Thread 的区别 很多时候,你可能 ... -
android 使用百度地图画轨迹
2012-07-26 00:08 2649import android.content.Context ... -
android百度地图半径画圆
2012-07-26 00:07 2806Java代码 import android.content ... -
Android下获取开机时间
2012-07-26 00:05 1341我的思路是:程序里注册个广播接收器,接收开机启动的广播,当程序 ... -
android 高仿【优酷】圆盘旋转菜单 的实现
2012-07-26 00:03 1373MyAnimation.java Java代码 pack ... -
android 3D 转盘效果(附源码)
2012-07-25 23:41 1816一个仿3D的转盘效果,有倒影特效,旋转图标还可自动放大缩小。由 ... -
Android Thread
2012-07-23 10:47 1074创建新线程的常用方式: 1. 直接使用Thread创建 ... -
Android 通过手说tts中文语音包实现中文朗读
2012-07-22 17:09 1818Android 通过手说tts中文语音包实现中文朗读 ... -
Android 使用HTTPClient调用Web请求(查询手机号码区域)
2012-07-21 00:33 1268Android通过Apache HttpClient调用网上提 ... -
Android+struts2+JSON方式的手机开发
2012-07-21 00:14 1180http://topmanopensource.iteye.c ... -
android九宫格实现
2012-07-21 00:03 1018android九宫格实现,开始以为很复杂,其实只要知道了如何布 ... -
Android ListView圆角实现
2012-07-20 23:59 1229在android上开发项目,如 ... -
Android 将一个Activity转化为View显示出来
2012-07-19 10:27 2099最近看到好多opengl牛人写了些立方体,卷页之类的华丽的代码 ...
相关推荐
开发者可能使用了`Canvas`和`Paint`对象来绘制圆盘,并为每个菜单项设定特定的角度和半径。在Android中,可以利用`Path`对象来绘制复杂的形状,包括圆形和弧线,然后用`canvas.drawPath()`进行渲染。 3. 动画效果:...
【Android圆盘旋转菜单实例】是一个专为移动设备设计的创新UI组件,它提供了一种独特的方式来展示菜单选项。这个菜单的设计灵感来源于淘宝客户端的圆形菜单,用户可以通过手势或者点击触发菜单的旋转动画,从而优雅...
圆盘旋转菜单是一种独特且富有视觉效果的交互设计,它通常用于移动应用或者网页中,为用户提供一种新颖的导航方式。这种菜单以圆形布局呈现,用户点击或触摸中心点后,菜单项会像圆盘旋转一样展开,既美观又实用。 ...
Android-CircleMenu库正是这样一款工具,它提供了一个简单、优雅且具有圆形布局的菜单,使得开发者能够轻松地在应用程序中创建引人注目的交互元素。本文将深入探讨这一库的核心特点、使用方法以及其实现原理。 首先...
本教程将详细解析如何在Android平台上实现一个从底部滑出的半圆形菜单。这个菜单不仅能够提供一种新颖的用户体验,还可以帮助优化屏幕空间利用,使应用更具现代感。 首先,我们需要了解Android布局系统。在Android...
【标题】:一个简单的圆形菜单控件...综上所述,"一个简单的圆形菜单控件"是一个实用的Android开发工具,通过学习和使用这个开源项目,开发者不仅可以提升自己的UI设计能力,还能深入理解Android自定义View的开发流程。
"Android应用源码之圆盘菜单.zip"这个压缩包显然包含了实现这种圆盘菜单功能的源代码,对于开发者来说,它是一个宝贵的资源,可以用来学习和借鉴。 首先,我们要理解"源码"的重要性。在编程世界中,源码是程序的...
在Android开发中,自定义View是一项重要的技能,它允许开发者根据特定需求创建独特且功能丰富的用户界面。本篇文章将深入探讨如何打造一个圆形的遥控器菜单,为用户提供类似电视遥控器的操作体验。这个自定义View将...
【Android圆盘菜单】是一种独特的用户界面元素,常见于Android应用程序中,用于提供一种交互式的操作方式。在毕业设计或论文中,这种创新的UI设计可能会成为亮点,吸引用户的注意力并提升用户体验。圆盘菜单的设计...
在Android开发中,创建独特且吸引用户的交互式菜单是一项挑战,而“圆形旋转的android菜单源代码”就是针对这一需求的解决方案。这个源代码提供了一种创新的方式,通过圆形旋转的效果来展示菜单项,给用户带来新颖的...
圆形旋转菜单是一种特殊的导航模式,用户点击中心按钮后,菜单会像一个圆盘一样从中心点向外旋转展开,呈现出多个可选的选项。这种设计通常用于设置、功能选择或者主菜单等场景,因其动画效果和交互体验,能有效吸引...
在Android开发领域,"圆盘菜单"是一种独特的交互设计,它为用户提供了一种直观且吸引人的选择和操作方式。这个"圆盘菜单.zip"压缩包很可能是包含了一个实现这种菜单效果的Android源码示例。下面我们将深入探讨圆盘...
在Android开发中,创建一个圆形转盘的界面可以增加应用的互动性和趣味性,常见于游戏、抽奖或者个性化菜单的设计中。本示例代码着重于实现一个可触摸旋转的圆形转盘,通常会涉及到以下几个核心知识点: 1. **自定义...
此外,还可以使用第三方库如`CircleMenu`或`RoundMenu`来快速实现圆形菜单功能,这些库已经封装好了菜单的布局和动画逻辑,只需简单集成即可使用。在Android Studio中,可以通过添加依赖到`build.gradle`文件来引入...
"安卓圆盘菜单效果"是一个专为提升应用交互性设计的特效,它将传统的菜单以圆盘的形式展示,既美观又实用。这种设计模式通常用于导航或者在有限的空间内展示多个选项,例如在移动设备的小屏幕上。 首先,让我们深入...
在深入探讨Android源码圆盘菜单这个主题之前,我们首先要明确几个关键概念。"安卓源码"通常指的是Android操作系统的原始代码,它为开发者提供了系统级别的理解和定制能力。"圆盘菜单"则是一种常见的用户界面设计,其...
在Android应用开发中,"圆盘效果"是一种独特的视觉设计,通常用于创建吸引用户的交互界面。这个项目中的"名片项目"很可能使用了圆盘布局来展示信息,使其看起来既新颖又具有吸引力。圆盘效果可以是旋转菜单、圆形...