
<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>