抽奖转盘
来源:互联网 发布:艾科网络 编辑:程序博客网 时间:2024/04/30 06:06
自定义类继承SurfaceView ,开启子线程中不断的绘制我们想要的效果.
public class SurfaceTemplate extends SurfaceView implements Callback, Runnable { /** * 绘制相关的成员变量 */ private SurfaceHolder mHolder; private Canvas mCanvas; ///进行绘制的线程 private Thread thread; //绘制线程的标志位 private boolean flag; /* * 盘快选项显示的文字 */ private String[] mStrs=new String[]{"单反相机","IPAD", "恭喜发财","IPHONE", "服装一套","恭喜发财"}; /** *盘快选项背景图片 */ private int[] mImgs=new int[]{R.drawable.danfan,R.drawable.ipad, R.drawable.f015,R.drawable.iphone, R.drawable.meizi,R.drawable.f040}; private Bitmap[] mBitmaps; /** * 盘快选项的背景颜色 */ private int[] mColors=new int[]{0xffffc300,0xfff17e01,0xffffc300,0xfff17e01,0xffffc300,0xfff17e01}; /** * 条目的总数 */ private int mItemCount=6; /** * 盘快的范围 */ private RectF mRange=new RectF(); /** * 绘制盘快的画笔 */ private Paint mArcPaint; /** * 绘制文字的画笔 */ private Paint mTextPaint; /** * 盘快转动的速度 */ private double mSpeed=0; /** * 盘快起始的角度 */ private volatile float mStartAngle=0; /** * 是否点击了暂停按钮 */ private boolean isShouldEnd=false; /** * 盘快中心点的位置你 */ private int mCenter; /** * 盘快的间距 */ private int mPadding; /** * 盘快的半径 */ private int mRadius; /** * 盘快的背景图片 */ private Bitmap mBgBitmap=BitmapFactory.decodeResource(getResources(), R.drawable.bg2); /** * 盘快的文字大小 */ private float mTextSize=TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 20, getResources().getDisplayMetrics()); public SurfaceTemplate(Context context, AttributeSet attrs) { super(context, attrs); /** * holder对象不仅可以拿到画板,还可以管理生命周期 */ mHolder=getHolder(); mHolder.addCallback(this); /** * 设置属性 */ setFocusable(true); setFocusableInTouchMode(true); setKeepScreenOn(true); } public SurfaceTemplate(Context context) { this(context,null); } /** * 测量的方法 */ @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { // TODO 自动生成的方法存根 super.onMeasure(widthMeasureSpec, heightMeasureSpec); int width=Math.min(getMeasuredWidth(), getMeasuredHeight()); ///以paddingLeft为准 mPadding=getPaddingLeft(); //设置直径 mRadius=width-mPadding*2; //设置中心点的位置 mCenter=width/2; //将盘快设置成正方形 setMeasuredDimension(width, width); } @Override public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) { // TODO 自动生成的方法存根 } @Override public void surfaceCreated(SurfaceHolder arg0) { // TODO 自动生成的方法存根 //初始化盘快的画笔 mArcPaint=new Paint(); mArcPaint.setAntiAlias(true); mArcPaint.setDither(true); //初始化文字的画笔 mTextPaint=new Paint(); mTextPaint.setColor(Color.parseColor("#ffffff")); mTextPaint.setTextSize(mTextSize); //初始化盘快的范围 mRange=new RectF(mPadding, mPadding, mPadding+mRadius, mPadding+mRadius); //初始化图片数组 mBitmaps=new Bitmap[mItemCount]; for(int i=0;i<mItemCount;i++){ mBitmaps[i]=BitmapFactory.decodeResource(getResources(), mImgs[i]); } //线程开启的标志 flag=true; //开启线程 thread=new Thread(this); thread.start(); } @Override public void surfaceDestroyed(SurfaceHolder arg0) { // TODO 自动生成的方法存根 flag=false; } /** * 开启子线程进行绘制操作 */ @Override public void run() { while(flag){ long start=System.currentTimeMillis(); draw(); long end=System.currentTimeMillis(); if(end-start<100){ SystemClock.sleep(100-(end-start)); } } } /** * 绘制操作 */ private void draw() { // TODO 自动生成的方法存根 mCanvas=mHolder.lockCanvas(); try { if(mCanvas!=null){ //绘制背景 drawBg(mCanvas); //绘制盘快 drawPlan(mCanvas); } } catch (Exception e) { }finally{ if(mCanvas!=null){ //释放 mHolder.unlockCanvasAndPost(mCanvas); } } } //绘制盘快 private void drawPlan(Canvas canvas) { float angle=mStartAngle; float sweepAngle=360/mItemCount; for(int i=0;i<mItemCount;i++){ mArcPaint.setColor(mColors[i]); /** * 以矩形的中心来绘制弧形 */ canvas.drawArc(mRange, angle, sweepAngle, true, mArcPaint); //绘制盘快上面的文字 Path path=new Path(); //指定路径的弧线 path.addArc(mRange, angle, sweepAngle); float textWidth=mTextPaint.measureText(mStrs[i]); float hOffset=(float) (mRadius*Math.PI/mItemCount/2-textWidth/2); float vOffset=mRadius/12; //指定弧形的线路来绘制文字 canvas.drawTextOnPath(mStrs[i], path, hOffset, vOffset, mTextPaint); //指定图片的宽度 int BitmapWidth=mRadius/8; float a=(float) ((angle+360/mItemCount/2)*Math.PI/180); ///图片中心点的坐标 float x=(float) (mCenter+Math.cos(a)*mRadius/4); float y=(float) (mCenter+Math.sin(a)*mRadius/4); RectF f=new RectF(x-BitmapWidth/2, y-BitmapWidth/2, x+BitmapWidth/2, y+BitmapWidth/2); canvas.drawBitmap(mBitmaps[i], null, f, null); angle+=sweepAngle; } //不停的转动 mStartAngle+=mSpeed; //是否被按下了停止按钮 if(isShouldEnd){ mSpeed-=2; } if(mSpeed<=0){ mSpeed=0; isShouldEnd=false; } } /** * 绘制背景 */ private void drawBg(Canvas canvas) { canvas.drawColor(Color.parseColor("#ffffff")); canvas.drawBitmap(mBgBitmap, null, new RectF(mPadding/2,mPadding/2, (getMeasuredWidth()-mPadding/2), (getMeasuredHeight()-mPadding/2)),null); } /** * 指定概率 */ public void start(int index){ float angle=360/mItemCount; float from=270-(index+1)*angle; float end=from+angle; float targetfrom=from+4*360; float targetend=end+4*360; //速度的区间 float v1=(float) ((-1+Math.sqrt(1+8*targetfrom))/2); float v2=(float) ((-1+Math.sqrt(1+8*targetend))/2); mSpeed=v1+Math.random()*(v2-v1); isShouldEnd=false; } public void start(){ mSpeed=30; isShouldEnd=false; } /** * 开始关闭 */ public void end(){ mStartAngle=0; isShouldEnd=true; } /** * 转盘是否旋转 * @return */ public boolean isStart(){ return mSpeed!=0; } /** * 是否按下了暂停按钮 * @return */ public boolean isShouldEnd(){ return isShouldEnd==true; }}
0 0
- 转盘抽奖
- 抽奖转盘
- 抽奖转盘
- 转盘抽奖
- 抽奖转盘
- 转盘抽奖
- 抽奖转盘
- 抽奖转盘
- 转盘抽奖
- 抽奖转盘
- html5抽奖转盘生成器
- 转盘抽奖案例
- Android抽奖转盘代码
- 抽奖大转盘
- 转盘抽奖游戏
- 大转盘抽奖算法
- java实现转盘抽奖;
- SurfaceView 实现 转盘抽奖
- 常用 Git 命令清单
- 黑马程序员--用户注册登录管理系统…
- Android Studio 的项目导入svn和svn的分支开发
- 黑马程序员--用户注册登录管理系统…
- 黑马程序员---关于枚举的理解
- 抽奖转盘
- 黑马程序员--用户注册登录管理系统…
- 黑马程序员--关于注解的理解
- 面向对象的分析与设计OOAD
- 黑马程序员--交通灯管理系统的心得…
- java使用sigar获取linux系统内存使用信息 注意事项
- JDK1.5新特性回顾
- Java基础笔记的复习与整理--集合框…
- 如何从官网下载Xcode等dmg文件