轉盤抽獎(項目抽取執行個體)

來源:互聯網
上載者:User

  最近項目需要做一個抽獎轉盤的功能,想了很久,如果是要自己畫每一個項的背景,文字,圖片,則花費的時間太過多,會趕不上項目的進度,就取了巧,把獎項和轉盤指標分別作為一個獨立的整體,只做旋轉和角度判斷就行,這樣就會節約很多時間,就算以後更新抽獎獎項,只要替換獎項大圖就行,擷取什麼獎項和提示資訊都由服務端控制即可,廢話不多說,先上項目執行個體:

我編寫的(項目抽取執行個體比較簡單,大家別見怪)

具體程式碼分析我也不多說,只把關鍵代碼貼出來,

import android.content.Context;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Matrix;import android.graphics.Paint;import android.widget.ImageView;public class Circleview extends ImageView implements Runnable {private Bitmap mHourBitmap;private boolean bInitComplete = false;private boolean stopRoter = true;float Angel = 0.0f;Matrix matx = new Matrix();/** * 中獎各種計算參數  maxAngel=轉動到中獎的角度 */float maxAngel = 0.0f;/** * 螢幕的寬度 */int screnWidth = 0;/** * 初始抽獎滑動組件 * @param context * @param width 螢幕寬度 */public Circleview(Context context,int width) {super(context);this.screnWidth = width;init();new Thread(this).start();}public void init() {mHourBitmap = BitmapFactory.decodeResource(getResources(),R.drawable.share_lottery_pointer);bInitComplete = true;}public void setRotate_degree(float degree) {Angel = degree;}@Overrideprotected void onDraw(Canvas canvas) {// TODO Auto-generated method stubsuper.onDraw(canvas);matx.reset();canvas.drawColor(Color.TRANSPARENT);if (!bInitComplete) {return;}Paint localPaint = new Paint();// 設定取消鋸齒效果localPaint.setAntiAlias(true);localPaint.setFilterBitmap(true);/** * 初始中間指標 */matx.setTranslate(this.screnWidth/2-mHourBitmap.getWidth()/2, DensityUtil.dip2px(getContext(), 300)/2-mHourBitmap.getHeight()+DensityUtil.dip2px(getContext(), 20));/** * 設定繞點旋轉 */matx.preRotate(Angel, mHourBitmap.getWidth() / 2,mHourBitmap.getHeight() * 4 / 5);canvas.drawBitmap(mHourBitmap, matx, localPaint);}public void run() {try {while (true) {if (!isStopRoter()) {if(maxAngel!=0&&Angel>=maxAngel){setStopRoter(true);maxAngel = 0.0f;}else{if(maxAngel-Angel<360)setRotate_degree(Angel+=10);elsesetRotate_degree(Angel+=15);this.postInvalidate();Thread.sleep(50);}}}} catch (InterruptedException e) {e.printStackTrace();}}/** * 擷取當前的角度,並設定停止角度 * @param palce 位置 * @return */public void setStopPlace(int place){getRoterByPlace(place);}/** * 順時針旋轉 * 1 = 330-30 * 2 = 30-90 * 3 = 90-150 * 4 = 150-210 * 5 = 210-270 * 6 = 270-330 * @param place * @return */void getRoterByPlace(int place){float roter = getRoteCenter(place);float currentRoter = getCurrentRoter();//如果當前的角度小於位置的角度,則表示需要多轉多少角度float difRoter = currentRoter - roter;//固定三圈360*3,後在加上當前的角度差maxAngel = Angel + 360*2 + 360-difRoter;}/** * 得到獎項位置的角度 -轉盤360度 根據獎項取各個獎項的平均值,在設定指定各個獎項的中間點 * @param place * @return */ float getRoteCenter(int place){float roter = 0.0f;switch (place) {case 1:roter = 0;break;case 2:roter = 60/2 + 30;break;case 3:roter = 60/2 + 90;break;case 4:roter = 60/2 + 150;break;case 5:roter = 60/2 + 210;break;case 6:roter = 60/2 + 270;break;default:break;}return roter; }/** * 得到轉動的實際角度--換算角度值 * @return */ float getCurrentRoter(){ int current = (int) Angel/360;if(0==current)return Angel;float roter = Angel - 360*current;return roter;}public boolean isStopRoter() {return stopRoter;}public void setStopRoter(boolean stopRoter) {this.stopRoter = stopRoter;}}

  

具體Demo地址:http://download.csdn.net/detail/yuan232007/5850753

如果你有好的實現方式,請發資訊給我,讓我也學習下。謝謝!

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.