抽奖转盘

来源:互联网 发布:艾科网络 编辑:程序博客网 时间: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
原创粉丝点击