大转盘游戏

 <com.example.zhuanpan.SurfaceViewTemp
        android:id="@+id/luckpan"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
       android:layout_centerInParent="true"
        android:padding="30dp" >
    </com.example.zhuanpan.SurfaceViewTemp>
	
    <ImageView
        android:id="@+id/start_btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:src="@drawable/start" >
        </ImageView>

<span style="font-size:18px;">package com.example.zhuanpan;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.Rect;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.util.Log;
import android.util.TypedValue;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;

public class SurfaceViewTemp extends SurfaceView implements Callback, Runnable {

	private SurfaceHolder mholder;
	private Canvas canvas;
	private Thread t;
	private boolean Runing;// 判断是否进程结束
	private String[] ms = new String[] { "单反相机", "IPAD", "恭喜发财", "IPHONE",
			"服装一团", "恭喜发财" };// 显示的文字
	private int[] mImg = new int[] { R.drawable.danfan,
			R.drawable.ipad,// 图片
			R.drawable.f040, R.drawable.iphone, R.drawable.meizi,
			R.drawable.f015 };
	private Bitmap[] mg;

	private int[] mcolor = new int[] { 0xFFFFC300, 0xFFF17E01, 0xFFFFC300,// 颜色的不同
			0xFFF17E01, 0xFFFFC300, 0xFFF17E01 };
	private int mc = 6;// 分的块数
	private RectF mRange = new RectF();// 潘快的范围
	private int mRadius;// 盘的直径
	private Paint marcPaint;//
	private Paint mtextPaint;// 子的笔
	private double mSpleed;// 旋转的速度
	private volatile float mStartAngle = 0;
	private boolean isShouldEnd;
	private int mCenter;// 中心
	private int mPadding;// 直接去最小值
	private Bitmap mbg = BitmapFactory.decodeResource(getResources(),
			R.drawable.bg2);
	private float mTextsixe = TypedValue.applyDimension(
			TypedValue.COMPLEX_UNIT_SP, 20, getResources().getDisplayMetrics());

	// 转变为标准尺寸的一个函数;

	public SurfaceViewTemp(Context context, AttributeSet attrs) {
		super(context, attrs);
		mholder = getHolder();// 构造方法中初始化
		mholder.addCallback(this);// 实现三个监听方法
		setFocusable(true);// 设置焦点
		setFocusableInTouchMode(true);// 设置触屏焦点
		setKeepScreenOn(true);// 是否保持屏幕常亮
	}

	@Override
	protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
		// TODO Auto-generated method stub
		super.onMeasure(widthMeasureSpec, heightMeasureSpec);
		int width = Math.min(getMeasuredWidth(), getMeasuredHeight());
		Log.i("yuanqing", getMeasuredHeight() + " bb" + getMeasuredWidth()
				+ "aa" + width);
		mPadding = getPaddingLeft();//
		Log.i("haha", mPadding + " ");
		mRadius = width - mPadding * 2;// 半径
		mCenter = width / 2;// 中心店
		setMeasuredDimension(width, width);// 设置surface的宽高。
	}

	public SurfaceViewTemp(Context context) {
		super(context);
		// TODO Auto-generated constructor stub
	}

	@Override
	public void surfaceChanged(SurfaceHolder holder, int format, int width,
			int height) {
		// TODO Auto-generated method stub

	}

	@Override
	public void surfaceCreated(SurfaceHolder holder) {
		/**
		 * 初始化的准备!!
		 */
		marcPaint = new Paint();
		marcPaint.setAntiAlias(true);// 初始化画笔
		marcPaint.setDither(true);// 防抖动
		mtextPaint = new Paint();
		mtextPaint.setColor(0xffffffff);
		mtextPaint.setTextSize(mTextsixe);
		mRange = new RectF(mPadding, mPadding, mRadius + mPadding, mRadius
				+ mPadding);// 盘快的位置,
		mg = new Bitmap[mc];
		for (int i = 0; i < mc; i++) {
			mg[i] = BitmapFactory.decodeResource(getResources(), mImg[i]);// 将图形转化为位图,
		}// 转化花盘

		Runing = true;// 将进程设为开始,
		t = new Thread(this);// 新建进程
		t.start();// 开始进程

	}

	@Override
	public void surfaceDestroyed(SurfaceHolder holder) {
		// TODO Auto-generated method stub
		Runing = false;// surface关闭,进程停止;
	}

	@Override
	public void run() {
		while (Runing) {
			long start = System.currentTimeMillis();

			draw();// 不断进行绘制
			long end = System.currentTimeMillis();
			if (end - start < 50) {// 设置大约每50毫秒转一圈

				try {
					Thread.sleep(50 - (end - start));
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}

			}
		}
	}

	private void draw() {
		try {
			canvas = mholder.lockCanvas();// 绘制很多东西
			if (canvas != null) {
				// somthing
				drawBg();// 绘制背景图
				// 绘制盘快
				float tmpAngle = mStartAngle;// 扇形的起始角度。。
				float sweepAngle = 360 / mc;// 每块扇形的角度。。
				for (int i = 0; i < mc; i++) {
					marcPaint.setColor(mcolor[i]);// 每块的颜色
					canvas.drawArc(mRange, tmpAngle, sweepAngle, true,
							marcPaint);
					// 绘制文本
					drawText(tmpAngle, sweepAngle, ms[i]);
					// 绘制图片
					drawIcon(tmpAngle, mg[i]);
					tmpAngle = tmpAngle + sweepAngle;
				}
				mStartAngle += mSpleed;
				if (isShouldEnd) {// 是否停止按钮
					mSpleed -= 1;
				}
				if (mSpleed <= 0) {
					mSpleed = 0;
					isShouldEnd = false;
				}
			}
		} catch (Exception e) {
			// TODO: handle exception
		} finally {
			if (canvas != null) {
				mholder.unlockCanvasAndPost(canvas);
			}
		}

	}

	/**
	 * 设置转盘的后门
	 * index是奖项的那个
	 */
public void luckStart(int index) {
		
		int angle=360/mc;//计算每一项的角度
		//计算中奖范围
		float from=270-(index+1)*angle;
		float end=from+angle;
		//设置停下来需要旋转的距离
		float targetfrom=4*360+from;
		float targetEnd=4*360+end;
		float v1=(float) ((-1+Math.sqrt(1+8*targetfrom))/2);
		float v2=(float) ((-1+Math.sqrt(1+8*targetEnd))/2);
		mSpleed=v1+Math.random()*(v2-v1);
//		mSpleed = 50;
		isShouldEnd = false;

	}
	public void luckStart() {
		
		int angle=360/mc;//计算每一项的角度
		//计算中奖范围
		
		mSpleed = 50;
		isShouldEnd = false;

	}

	public void luckend() {
		mSpleed=0;
		isShouldEnd = true;

	}

	public boolean isstart() {
		return mSpleed != 0;
	}

	public boolean isShouldEnd() {
		return isShouldEnd;
	}

	/**
	 * 图片的位置及其相关的大小,位置
	 * 
	 * @param tmpAngle
	 * @param bitmap
	 */
	private void drawIcon(float tmpAngle, Bitmap bitmap) {
		int imgwidth = mRadius / 8;// 设置图片的宽带,为直径的1/8;
		float angle = (float) ((tmpAngle + 360 / mc / 2) * Math.PI / 180);
		int x = (int) (mCenter + mRadius / 2 / 2 * Math.cos(angle));
		int y = (int) (mCenter + mRadius / 2 / 2 * Math.sin(angle));
		Rect rect = new Rect(x - imgwidth, y - imgwidth / 2, x + imgwidth / 2,
				y + imgwidth / 2);
		canvas.drawBitmap(bitmap, null, rect, null);

	}

	/**
	 * 绘制每个盘快的文本
	 * 
	 * @param tmpAngle
	 * @param sweepAngle
	 * @param string
	 */

	private void drawText(float tmpAngle, float sweepAngle, String string) {

		Path p = new Path();
		p.addArc(mRange, tmpAngle, sweepAngle);
		float textWidth = mtextPaint.measureText(string);
		// 利用水平偏移量居中
		int hoff = (int) (mRadius * Math.PI / mc / 2 - textWidth / 2);
		int voffset = mRadius / 2 / 6;// 坠子偏移量
		canvas.drawTextOnPath(string, p, hoff, voffset, mtextPaint);
	}

	private void drawBg() {
		canvas.drawColor(0xFFFFFFFF);
		canvas.drawBitmap(mbg, null, new Rect(mPadding / 2, mPadding / 2,
				getMeasuredWidth() - mPadding / 2, getMeasuredWidth()
						- mPadding / 2), null);

	}
}</span>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值