效果图

网上有很多大转盘的例子,这个也是从网上找的,可是千篇一律,旋转结束后,会出现内圈小图片角度的问题,找了很多都有这个问题,怀疑都是一个源头来的,但是不符合我需求,所以做了进一步的修改。

效果实现

核心实现

    public void drawWheel(Canvas canvas){//绘制扇形//设置每一个扇形的角度sweepAngle = 360 / mCount;startAngle = -120;for (int i = 0; i < mCount; i++) {mArcPaint.setColor(sectorColor[i % 2]);//sectorRectF 扇形绘制范围  startAngle 弧开始绘制角度 sweepAngle 每次绘制弧的角度// useCenter 是否连接圆心canvas.drawArc(sectorRectF, startAngle, sweepAngle, true, mArcPaint);
//            //绘制二级小背景canvas.drawArc(subBgRectF, startAngle, sweepAngle, true, mBgPaint);//3.绘制文字drawTexts(canvas, textInfo[i]);//4.绘制图片Bitmap bp = ((BitmapDrawable)getResources().getDrawable(mImages[i%2])).getBitmap();drawIcons(canvas, bp);angles[i] = startAngle;Log.d(TAG, "onDraw: " + angles[i] + "     " + i);startAngle += sweepAngle;}}
  • 首先计算弧度,就是一个小扇形
  • 起始角度-120度,为什么呢,因为从0度开始绘画,但是绘画位置是偏离了120度,自己可以设置0度试一试,这个也是我踩过的坑
  • 绘制背景和小弧形
  • 绘制文字
  • 绘制icon图片(这个也有坑,因为图片的角度的问题,旋转的不是回到第一个,位置都不正确)

绘制文字

    private void drawTexts(Canvas canvas, String mString) {Path path = new Path();//添加一个圆弧的路径path.addArc(sectorRectF, startAngle, sweepAngle);String startText = null;String endText = null;//测量文字的宽度float textWidth = mTextPaint.measureText(mString);//水平偏移int hOffset = (int) (mRadius * 2 * Math.PI / mCount / 2 - textWidth / 2);//计算弧长 处理文字过长换行int l = (int) ((360 / mCount) * Math.PI * mRadius / 180);if (textWidth > l * 4 / 5f) {int index = mString.length() / 2;startText = mString.substring(0, index);endText = mString.substring(index, mString.length());float startTextWidth = mTextPaint.measureText(startText);float endTextWidth = mTextPaint.measureText(endText);//水平偏移hOffset = (int) (mRadius * 2 * Math.PI / mCount / 2 - startTextWidth / 2);int endHOffset = (int) (mRadius * 2 * Math.PI / mCount / 2 - endTextWidth / 2);//文字高度int h = (int) ((mTextPaint.ascent() + mTextPaint.descent()) * 1.5);//根据路径绘制文字//hOffset 水平的偏移量 vOffset 垂直的偏移量canvas.drawTextOnPath(startText, path, hOffset, mRadius / 6f, mTextPaint);canvas.drawTextOnPath(endText, path, endHOffset, mRadius / 6f - h, mTextPaint);} else {//根据路径绘制文字StringBuilder builder = new StringBuilder();for(int i = 0; i < mString.length(); i++) {String c = ""+ mString.charAt(i);builder.append(c.toLowerCase());if(i+1 < mString.length()) {builder.append("\u00A0");}}SpannableString finalText = new SpannableString(builder.toString());if(builder.toString().length() > 1) {for(int i = 1; i < builder.toString().length(); i+=2) {finalText.setSpan(new ScaleXSpan((1+1)/10), i, i+1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);}}canvas.drawTextOnPath(finalText.toString(), path, hOffset, mRadius / 6f, mTextPaint);}}

这个主要是沿着路径绘画文字,里边多了一些显示的优化,比如文字之间的距离等等。

绘制icon图片

    /*** 以二分之一的半径的长度,扇形的一半作为图片的中心点* 图片的宽度为imageWidth*/private void drawIcons(Canvas canvas, Bitmap mBitmap) {int imageWidth = mRadius / 9;//计算半边扇形的角度 度=Math.PI/180 弧度=180/Math.PIfloat angle = (float) ((startAngle + sweepAngle / 2) * Math.PI / 180);//计算中心点的坐标int r = mRadius / 2;float x = (float) (mCenter + r * Math.cos(angle));float y = (float) (mCenter + r * Math.sin(angle));//=================最终方案=============Matrix matrix = new Matrix();matrix.postTranslate(x - imageWidth,y - imageWidth);matrix.postRotate(startAngle+120,x,y);//设置绘制图片的范围canvas.drawBitmap(mBitmap,matrix,null);//================网上的方案===============
//        RectF rectF = new RectF(x - imageWidth, y - imageWidth, x + imageWidth, y + imageWidth);
//        canvas.drawBitmap(mBitmap, null, rectF, null);}
  • imagewidth是图片的大小,自己可以调节
  • 这里的最终方案是我优化过的方案,网上方案是很多网上的例子,其实这个就是在一个区域绘制icon而已,对于图片的旋转问题没有解决

很感谢之前同学发布的例子,我是在那个上面修改的。找不到引用的地方,希望别侵权

下边是demo地址,大家可以按照自己的需求更改,以符合自己的需求,有不足的地方随时留言

demo下载

android的大转盘抽奖完美实现相关推荐

  1. android自定义大转盘,Android 自定义View 抽奖大转盘(1)

    站在别人的肩膀上慢慢前行 只是部分的转盘主要功能的实现,其他的东西可以慢慢填上,这里做一个简单的介绍 镇楼图 S71010-17315559.jpg github链接 https://github.c ...

  2. android自定义大转盘,android 代码绘制转盘抽奖的实现

    android 代码绘制转盘抽奖的实现 先上图 第一个是 整体的布局 xmlns:tools="http://schemas.android.com/tools" android: ...

  3. Android撸一个转盘抽奖

    Android撸一个转盘抽奖 前言 最近在学习的时候想做个积分转盘抽奖的功能,以前项目中使用过,但是是用的H5写的,但是我现在还不是太会写网页,就想算了,用Android写个吧!因为我这边的业务逻辑是 ...

  4. 幸运大转盘抽奖(前端)

    采用Lottery.js插件, 无依赖, 简单易用(复制粘贴就能用) 效果图(可自己写算法定义概率,可自己定义奖项数量和名称) html <!DOCTYPE html> <html ...

  5. 基于 SurfaceView 详解 android 幸运大转盘,附带实例app

    基于 SurfaceView 详解 android 幸运大转盘,附带实例app 首先说一下,幸运大转盘,以及SurfaceView是在看了也为大神的博客,才有了比较深刻的理解,当然这里附上这位大神的博 ...

  6. html转盘游戏,html5大转盘抽奖实例源码(基于vue.js)

    [实例简介] [调试步骤] # 安装依赖 npm install # 开启本地服务器localhost:8088 npm run dev # 发布环境 npm run build #然后静待你的浏览器 ...

  7. php 打乱数组顺序_PHP实现大转盘抽奖算法

    php中文网最新课程 每日17点准时技术干货分享 本文通过具体的实例向大家介绍了PHP语言实现大转盘抽奖算法,希望对大家学习PHP抽奖有所帮助. 流程: 1.拼装奖项数组: 2.计算概率: 3.返回中 ...

  8. Jquery写的幸运大转盘抽奖实例,用asp.net处理的服务器逻辑,附源码下载

    [实例简介] 该幸运大转盘抽奖实例已实现服务器端的业务逻辑代码,稍加改动就可以应用实际了 文件:590m.com/f/25127180-488779229-66bbf7(访问密码:551685) [实 ...

  9. PHP+AJAX开发幸运大转盘抽奖

    PHP+AJAX开发幸运大转盘抽奖 PHP+AJAX开发幸运大转盘抽奖,通过奖品库存.中奖次数来计算中奖概率 奖品设置 1 $prizes = array( 2 0 => array( 3 &q ...

  10. js框架jquery实现的幸运大转盘抽奖程序代码,兼容多种浏览器(Internet Explorer 6.0+ 、Firefox 2.0 、Safari 3 、Opera 9 、Chrome)

    博客目录 js框架jquery实现的幸运大转盘抽奖程序代码 实现功能截图 系统功能 使用技术 代码 写在最后 js框架jquery实现的幸运大转盘抽奖程序代码 本系统实现了一个幸运转盘抽奖,兼容多种浏 ...

最新文章

  1. MySQL环境配置和入门讲解!
  2. ICCV2017: Unlabeled Samples Generated by GAN Improve the Person Re-Identification Baseline in Vitro
  3. Ubuntu Server中怎样卸载keepalived
  4. 使用ArrayList时设置初始容量的重要性
  5. 我的Go+语言初体验——(6)整型有理数数据类型
  6. bzoj 3386 bzoj 3408: [Usaco2009 Oct]Heat Wave 热浪(最短路)
  7. 通过try、except和else的使用来使Python程序更加“强壮”
  8. abaqus汉化后有结果界面中有中文乱码
  9. 初识scratch,球拍,背景,障碍物的制作
  10. 利用到路面提取道路中心线的方法
  11. 牛客小白月赛5-E-面积(area)(波尔约-格维也定理+皮克公式)
  12. 统计100以内能被7整除的自然数c语言,编写程序,计算1到100中既能被3整除又能被7整除的所有数,并计算这些数的个数...
  13. 字体在其他浏览器正常在IE8显示字体模糊问题解决
  14. SpringBoot中的html页面访问不到js,css等静态资源问题解决方案
  15. git报错error: index uses extension, fatal: index file corrupt
  16. datatable隐藏列设置及获取隐藏列的值
  17. Hexo博客安装卡在“INFO install dependencies”解决方法
  18. python毕业论文开题报告_本科毕业论文开题报告怎么写-如何写毕业设计的开题报告?...
  19. ORA-01122;ORA-01110;ORA-01207问题解决经验总结
  20. 计算机基础实验测试题第一章(悄悄变强秘籍)

热门文章

  1. r语言 linux plot,详解R语言plot函数参数合集
  2. Python接口自动化
  3. 计算机学院手绘,PS电脑手绘效果绘画教程
  4. WordPress优化教程让WordPress打开速度更快
  5. 解决无法ping通 127.0.0.1
  6. 微信小黄鸡php,微信表情包小黄鸡含义
  7. Axure RP--快捷键大全(常用快捷键)
  8. 使用nginx代理实现前后端分离开发调试,零基础教程
  9. VS的Qt界面预览和QtCreator的界面预览快捷键
  10. python爬取文字和图片_Selenium_Chrome爬取文本和百度图片