在好例子网,分享、交流、成长!
您当前所在位置:首页Java 开发实例Android平台开发 → android幸运大转盘源码及教程

android幸运大转盘源码及教程

Android平台开发

下载此实例
  • 开发语言:Java
  • 实例大小:0.32M
  • 下载次数:62
  • 浏览次数:5351
  • 发布时间:2014-04-18
  • 实例类别:Android平台开发
  • 发 布 人:lsht2love
  • 所需积分:2
 相关标签: Android 大转盘 转盘

实例介绍

【实例简介】最近在做大转盘的项目,网上大都是指针转,盘不转,今天上传一个盘转的。

【实例截图】


【核心代码】


package com.heimaketi.ty.wheel;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.RadialGradient;
import android.graphics.RectF;
import android.graphics.Shader.TileMode;
import android.util.AttributeSet;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

//自定义的转盘View
public class WheelView extends SurfaceView implements SurfaceHolder.Callback {

private float screenHight, screenWidth;// 屏幕的宽和高
private float radius;// 绘制圆的半径
private float circleRadius; // 半径
private float startAngle;// 开始角度
private float sweepAngle; // 扫过的角度
private float speed; // 速度
private float acceleration; // 加速度
private int itemCount;
private int[] itemColor;
private String[] titleString;
private double[] ratioArray;
private Paint mPaint;
private Canvas mCanvas;
private Path path;
private SurfaceViewThread myThread;
private SurfaceHolder holder;
private boolean done = false;
private boolean surfaceExist = false;
private boolean rotateEnabled = false;
private boolean clockwise = true;

public WheelView(Context context, AttributeSet attr) {
super(context, attr);
initial();
}

public void initial() {
// 创建一个新的SurfaceHolder, 并分配这个类作为它的回调(callback)
holder = getHolder();
holder.addCallback(this);

mPaint = new Paint();



itemColor = new int[] {
0xFFFFFFFF,// 白色
0xFFB0E0E6,// 粉蓝色 
0xFF444444,// 深灰色
0xFF008B8B,// 暗青色
0xFFFFA500,// 橙色
0xFF7FFF00,// 黄绿色
0xFFF08080,// 亮珊瑚色
0xFFB0C4DE // 亮钢兰色
};

//选项个数
itemCount = 5;
// 转盘选项的名称
titleString = new String[] { "美餐一顿", "一起购物", "运动", "唱歌", "看电影" };
// 所占百分比,这里平均分配
ratioArray = new double[] { 20, 20, 20, 20, 20};
// 半径
radius = 120;
circleRadius = 15;
startAngle = 0;
// 加速度
acceleration = 0;
speed = 0;
}

public void setDirection(boolean bool, float sp) {
clockwise = bool;
speed = sp;
acceleration = Math.abs(speed) / 100;
}

public void rotateEnable() {
rotateEnabled = true;
}

public void rotateDisable() {
rotateEnabled = false;
}

public void start() {
if (myThread == null) {
myThread = new SurfaceViewThread();
}
if (surfaceExist) {
myThread.start();
}
}

public void stopRotate() {
// 杀死渲染线程
if (myThread != null) {
myThread = null;
done = true;
}
}

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// TODO Auto-generated method stub
if (myThread != null) {
myThread.start();
}
}

@Override
public void surfaceCreated(SurfaceHolder holder) {
// TODO Auto-generated method stub
surfaceExist = true;
// 高度
screenHight = getHeight();
screenWidth = getWidth();
}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
surfaceExist = false;
myThread = null;
done = true;
}

class SurfaceViewThread extends Thread {

public SurfaceViewThread() {
// TODO Auto-generated constructor stub
}

public void updateView() {

SurfaceHolder surfaceHolder = holder;
mCanvas = surfaceHolder.lockCanvas();

float f1 = screenWidth / 2;
float f2 = (float) (screenHight / 2.5);
// 填充一下
mCanvas.drawColor(0xff969696);
mCanvas.save();

// *********************************画边上渐变的圆环出来*********************************
Paint localPaint = new Paint();
localPaint.setAntiAlias(true);
localPaint.setStyle(Paint.Style.STROKE);// 风格为圆环
localPaint.setStrokeWidth(circleRadius); // 圆环宽度
RadialGradient radialGradient = new RadialGradient(f1, f2, radius
circleRadius, new int[] { Color.GREEN, Color.GRAY,
Color.MAGENTA, Color.YELLOW, Color.BLACK }, null,
TileMode.MIRROR);// 环形渐变
localPaint.setShader(radialGradient);// 设置渐变
mCanvas.drawCircle(f1, f2, radius, localPaint);
mCanvas.save();

// 确定参考区域
float f3 = f1 - radius;
float f4 = f2 - radius;
float f5 = f1 radius;
float f6 = f2 radius;
RectF rectF = new RectF(f3, f4, f5, f6);

// *********************************画每个区域的颜色块*********************************
drawItem(rectF);

// *********************************画中间的黑色指示器*********************************
Paint localPaint2 = new Paint();
localPaint2.setAntiAlias(true);

localPaint2.setStrokeWidth(5);
localPaint2.setColor(Color.BLACK);
mCanvas.drawLine(f1, f2 radius / 5, f1, f2 - radius / 2,
localPaint2);
mCanvas.drawCircle(f1, f2, 6, localPaint2);
mCanvas.save();


// 使能转动
if (rotateEnabled) {
if (clockwise) {
startAngle = speed;
speed -= acceleration;
} else {
startAngle -= speed;
speed -= acceleration;
}
// 速度等于0则停下来
if (speed <= 0) {
rotateEnabled = false;
}
} else {
// 避免进入了以后不点开始startAngel太大,其实没有什么关系
startAngle -= 360;
}
// 解锁Canvas,并渲染当前图像
surfaceHolder.unlockCanvasAndPost(mCanvas);
}

// 画上各个Item的名称
public void drawText(RectF localRectf, float localStartAngle,
float localSweepAngle, String str) {
path = new Path();
// float pading = (sweepAngle-str.length())/2;

// 在这里注意了,这里path中的sweepAngle为正值,所以逆时针转的时候应该判断一下
if (localSweepAngle > 0) {
path.addArc(localRectf, localStartAngle, localSweepAngle);
}
path.addArc(localRectf, localStartAngle - localSweepAngle,
-localSweepAngle);
mCanvas.drawTextOnPath(str, path, 5, -10, mPaint);
mCanvas.save();
}

public void drawItem(RectF localRectf) {
for (int i = 0; i < itemCount; i ) {
mPaint.setColor(itemColor[i]);
sweepAngle = (float) (360 * ratioArray[i] / 100);
if (!clockwise) {
sweepAngle = 0 - sweepAngle;
}
mCanvas.drawArc(localRectf, startAngle, sweepAngle, true,
mPaint);
mCanvas.save();
drawText(localRectf, startAngle, sweepAngle, titleString[i]);
startAngle = sweepAngle;
}
}

@Override
public void run() {
// TODO Auto-generated method stub
super.run();
// 公共在这里处理
mPaint.setAntiAlias(true);
while (!done) {
updateView();
}
}
}
}


实例下载地址

android幸运大转盘源码及教程

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

第 1 楼 飞花梦影 发表于: 2014-12-05 10:29 52
我去 假的啊 尼玛

支持(0) 盖楼(回复)

第 2 楼 wohenpangma 发表于: 2014-12-22 13:37 18
我来说两句...厉害哦、、

支持(0) 盖楼(回复)

第 3 楼 zengjingbenben 发表于: 2015-01-06 16:38 32
我来说两句...好东西哦

支持(0) 盖楼(回复)

第 4 楼 zengjingbenben 发表于: 2015-01-06 16:38 33
我来说两句...好东西哦

支持(0) 盖楼(回复)

第 5 楼 tlchencheng 发表于: 2015-03-06 12:10 44
我来说两句...为什么要积分啊

支持(0) 盖楼(回复)

第 6 楼 2850805893 发表于: 2015-10-21 17:40 27
MABI,假的,被骗了

支持(0) 盖楼(回复)

第 7 楼 crazycode 发表于: 2015-10-21 22:55 37
至楼上:这个实例确实是 转盘转动那种抽奖,只是 需要滑动转盘 才能选择

支持(0) 盖楼(回复)

第 8 楼 黄易杰 发表于: 2015-11-03 13:09 09
牛逼了

支持(0) 盖楼(回复)

第 9 楼 muziye 发表于: 2016-03-22 17:40 54
应该是个 好例子

支持(0) 盖楼(回复)

第 10 楼 muziye 发表于: 2016-03-22 17:40 59
应该是个 好例子

支持(0) 盖楼(回复)

第 11 楼 muziye 发表于: 2016-03-22 17:41 01
应该是个 好例子

支持(0) 盖楼(回复)

第 12 楼 傻傻的等 发表于: 2016-04-07 16:48 39
好例子啊

支持(0) 盖楼(回复)

第 13 楼 sd889670 发表于: 2017-01-07 13:58 55
好东西,下载下来研究研究

支持(0) 盖楼(回复)

第 14 楼 3499312257 发表于: 2017-02-24 16:23 03
假的,靠。瞎宣传

支持(0) 盖楼(回复)

发表评论

(您的评论需要经过审核才能显示)

查看所有14条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
;
报警