Android实现抽奖转盘实例代码

本文详述了android抽奖程序的实现方法,程序为一个抽奖大转盘代码,里面定义了很多图形方法和动画。

实现主要功能的SlyderView.java源代码如下:

import android.app.Activity; import android.content.Context; import android.graphics.BlurMaskFilter; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.ColorMatrixColorFilter; import android.graphics.EmbossMaskFilter; import android.graphics.MaskFilter; import android.graphics.Paint; import android.graphics.PorterDuffXfermode; import android.graphics.Paint.Style; import android.graphics.PorterDuff.Mode; import android.graphics.Path; import android.graphics.RadialGradient; import android.graphics.RectF; import android.graphics.Shader.TileMode; import android.util.AttributeSet; import android.util.TypedValue; import android.view.View; public class SlyderView extends View{ public SlyderView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(context); } public SlyderView(Context context, AttributeSet attrs) { super(context, attrs); init(context); } public SlyderView(Context context) { super(context); init(context); } /** * 屏幕宽度 */ private int screenW; /** * 屏幕的高度 */ private int screenH; /** * 分割的度数 */ private int [] drgrees = {20,50,40,90,70,40,50}; /*** * 分割的文字 */ private String [] strs = {"level1","level2","level3","level4","level5","level6","level7"}; /** * 分割的颜色 */ private int [] colos = new int[] { 0xfed9c960, 0xfe57c8c8, 0xfe9fe558, 0xfef6b000, 0xfef46212, 0xfecf2911, 0xfe9d3011 }; /** * 画笔 */ private Paint paint; /** * 文字的大小 */ private float textSize = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 15, getResources().getDisplayMetrics()); /** * 文字的颜色 */ private int textcolor = Color.WHITE; /** * 园的半径 */ private float radius = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 100, getResources().getDisplayMetrics()); /** * 画文字的距离 */ private float textdis = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 80, getResources().getDisplayMetrics()); /** * 画箭头的大小 */ private float roketSize = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 10, getResources().getDisplayMetrics()); private float initDegress = 0; /** * 圆心 */ private float centerX; /** * 圆心 */ private float centerY; /** * 立体边缘 */ private MaskFilter filter = new EmbossMaskFilter(new float[] { 1, 1, 1 },0.4f, 6, 3.5f); private MaskFilter outerFilter = new BlurMaskFilter(10, BlurMaskFilter.Blur.OUTER); private MaskFilter innerFilter = new BlurMaskFilter(10, BlurMaskFilter.Blur.INNER); @SuppressWarnings("deprecation") private void init(Context context){ paint = new Paint(); paint.setAntiAlias(true); paint.setStyle(Style.FILL); paint.setColor(Color.WHITE); screenW = ((Activity)context).getWindowManager().getDefaultDisplay().getWidth(); screenH = ((Activity)context).getWindowManager().getDefaultDisplay().getHeight(); int[] colores = new int[3]; colores[0] = Color.rgb(0xfF, 0x99, 0x00); colores[1] = Color.rgb(0xff, 0xff, 0x00); colores[2] = Color.rgb(0xff, 0x99, 0x00); float[] positions = new float[3]; positions[0] = 0.0f; positions[1] = 0.5f; positions[2] = 1.0f; gradient = new RadialGradient(centerX, centerY, radius/5, colores, positions, TileMode.CLAMP); } /** * 绘制三角箭头 */ private Path path = new Path(); /** * 绘制矩形框 */ private RectF oval; /** * 外圆内阴影矩阵 */ private ColorMatrixColorFilter colorFilter = new ColorMatrixColorFilter(new float[]{ 1,0,0,0,0, 0,1,0,0,0, 0,0,1,0,0, 0,0,0,-1,255 }); @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); centerX = screenW/2; centerY = screenH/2; oval = new RectF(centerX-radius,centerY-radius,centerX+radius,centerY+radius); float start = 0; paint.setColor(Color.rgb(0xdd, 0xdd, 0xdd)); paint.setAlpha(127); canvas.drawCircle(centerX, centerY, radius+10, paint); paint.setAlpha(255); //画扇形 paint.setAntiAlias(true); for(int i=0;i<drgrees.length;i++){ float sweepAngle = drgrees[i]; float startAngle = start; paint.setColor(colos[i%colos.length]); canvas.drawArc(oval, startAngle, sweepAngle, true, paint); start += drgrees[i]; } //画文字 paint.setColor(textcolor); paint.setAntiAlias(true); paint.setTextSize(textSize); paint.setTextAlign(Paint.Align.RIGHT); start = 0; for(int i=0;i<drgrees.length;i++){ canvas.save(); canvas.rotate(start+drgrees[i]/2, centerX, centerY); canvas.drawText(strs[i], centerX+textdis, centerY, paint); canvas.restore(); start += drgrees[i]; } int saveCount = canvas.save(); //画外层立体效果 paint.setColorFilter(colorFilter); canvas.saveLayer(oval,paint,Canvas.ALL_SAVE_FLAG); paint.setColorFilter(null); canvas.drawARGB(255, 0, 0, 0); paint.setXfermode(new PorterDuffXfermode(Mode.CLEAR)); canvas.drawCircle(centerX, centerY, radius, paint); paint.setXfermode(null); paint.setMaskFilter(innerFilter); paint.setColor(Color.argb(0xff, 0, 0, 0)); canvas.drawCircle(centerX, centerY, radius, paint); paint.setMaskFilter(null); canvas.restoreToCount(saveCount); //画内圆和内园效果 canvas.save(); paint.setColor(Color.argb(0xff, 0, 0, 0)); paint.setAntiAlias(true); paint.setMaskFilter(outerFilter); canvas.rotate(initDegress, centerX, centerY); canvas.drawCircle(centerX, centerY, radius/3, paint); paint.setMaskFilter(null); paint.setColor(Color.WHITE); canvas.drawCircle(centerX, centerY, radius/3, paint); //画三角型叠加当箭头 path.moveTo(centerX-radius/3, centerY); path.lineTo(centerX, centerY-radius/3-roketSize); path.lineTo(centerX+radius/3, centerY); path.close(); canvas.drawPath(path, paint); canvas.restore(); paint.setMaskFilter(filter); paint.setColor(Color.GREEN); paint.setShader(gradient); canvas.drawCircle(centerX, centerY, radius/5, paint); paint.setMaskFilter(null); paint.setShader(null); //重绘调整三角的指向达到滚动的效果,现实项目中可不能这样用的,效率太低下了,拆分View用动画完成滚动才是王道 if(isRunning){ if(initDegress>=360){ initDegress = 0; } initDegress +=4; invalidate(); } if(isStoping){ if(initDegress<=360){ initDegress+=4; invalidate(); }else{ if(initDegress-360<stop_degress){ initDegress+=2; invalidate(); } } } } private boolean isRunning = false; private boolean isStoping = false; private int stop_degress =90; /** * 渐变 */ private RadialGradient gradient; public void play(){ isRunning = true; invalidate(); } public void stop(int count){ for(int i =0;i<=count;i++){ if(i == count){ stop_degress +=drgrees[i]/2; }else{ stop_degress +=drgrees[i]; } } isStoping = true; isRunning = false; invalidate(); } }

时间: 2024-10-18 22:36:03

Android实现抽奖转盘实例代码的相关文章

Android实现抽奖转盘实例代码_Android

本文详述了android抽奖程序的实现方法,程序为一个抽奖大转盘代码,里面定义了很多图形方法和动画. 实现主要功能的SlyderView.java源代码如下: import android.app.Activity; import android.content.Context; import android.graphics.BlurMaskFilter; import android.graphics.Canvas; import android.graphics.Color; import

Android 画一个太极图实例代码_Android

今天练手一下,一起来画个太极图吧~ 最终效果如下: 最终效果 一般都是先讲原理,我就反其道而行,先讲实现吧. 1.继承实现初始化方法 继承View,实现基本的构造函数: public TestView(Context context) { this(context, null); } public TestView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public TestView(Context c

Android字段验证的实例代码_Android

先给大家展示效果图: package com.example.walkerlogin1; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.widge

Webview实现android简单的浏览器实例代码_Android

WebView是Android中一个非常实用的组件,它和Safai.Chrome一样都是基于Webkit网页渲染引擎,可以通过加载HTML数据的方式便捷地展现软件的界面,下面通过本文给大家介绍Webview实现android简单的浏览器实例代码. 实现了浏览器的返回 前进 主页 退出 输入网址的功能 注释的很清楚啦 就不多说了 首先是布局文件 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android&qu

Android字段验证的实例代码

先给大家展示效果图: package com.example.walkerlogin1; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.widge

Android 画一个太极图实例代码

今天练手一下,一起来画个太极图吧~ 最终效果如下: 最终效果 一般都是先讲原理,我就反其道而行,先讲实现吧. 1.继承实现初始化方法 继承View,实现基本的构造函数: public TestView(Context context) { this(context, null); } public TestView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public TestView(Context c

Android绘制验证码的实例代码

在前面仿华为加载动画.仿网易音乐听歌识曲-麦克风动画中,我们通过绘图的基础知识完成了简单的绘制.在本例中,我们将绘制常见的验证码. 一.效果图 二.知识点与思路分析 通过上面的效果图观察,我们可以看到里面有绘制的随机线条,随机绘制的验证码. 绘制线条,直线或曲线 绘制文本,生成的验证码文本的绘制 绘制圆点. 三.代码编写 /** * Created by Iflytek_dsw on 2017/7/3. */ public class IdentifyCodeUtil { private sta

Android 动态菜单实现实例代码

Android 动态菜单 先上效果图 比较简单,主要就是属性动画的使用和坐标角度的小细节. 实现 实现效果: 图标按照路径一路缩放渐变过来即可. 核心代码 /** * Item开启动画 * * @param btnItem * @param index * @param total * @param radius */ private void btnItemStartAnimator(View btnItem, int index, int total, int radius) { if (b

Android触屏测试实例代码_Android

本文实例详细描述了Android触屏测试代码,可实现对触屏的点击.移动.离开等事件的处理,对于Android初学者有很好的借鉴价值. 具体功能代码如下: package com.test; import android.app.Activity; import android.os.Bundle; import android.util.DisplayMetrics; import android.util.Log; import android.view.MotionEvent; import