最近做了一个转盘随机旋转获取对应的值,做了一个山寨的转盘抽奖,关键的代码如下:

该类控抽旋转,注:mPlayPlateBitmap 、mPlayPlatePointBitmap是两张图片,这两张图片的大小是一样的并关注他们的中心点要在一起,那样子才更有视觉效果!,

  1. import android.content.Context; 
  2. import android.content.res.Resources; 
  3. import android.graphics.Bitmap; 
  4. import android.graphics.BitmapFactory; 
  5. import android.graphics.Canvas; 
  6. import android.graphics.Matrix; 
  7. import android.os.Handler; 
  8. import android.util.AttributeSet; 
  9. import android.util.Log; 
  10. import android.view.View; 
  11.  
  12.  
  13. //自定义的转盘View   
  14.  
  15. public class PlayPlateView extends View implements Runnable { 
  16.     // 界面需要的图片 
  17.     private Bitmap mPlayPlateBitmap; 
  18.     private Bitmap mPlayPlatePointBitmap; 
  19.     private int mNumberOfTurns = 10
  20.     // 旋转矩阵 
  21.     private Matrix mPlayPlateMatrix = new Matrix(); 
  22.     // 平移矩阵 
  23.     private Matrix mPlatePointMatrix = new Matrix(); 
  24.     private int mRotationAngle = 0
  25.     private boolean isRotate = false
  26.     private int mStopAngle = -1; 
  27.     private int mScreenWidth = 0;// 屏幕的分辨率 
  28.     private int mRotateSpeed = 100;// 控制转速! 
  29.     private Thread mThread; 
  30.     private int mStopPosition;// 停止的位置,表示在那一个等份停止,从PlayPlateActivity传过来,然后在停止之后又传回去 
  31.     private Handler mHandler; 
  32.  
  33.     public PlayPlateView(Context context) { 
  34.         super(context); 
  35.     } 
  36.  
  37.     public PlayPlateView(Context context, AttributeSet attrs) { 
  38.         super(context, attrs); 
  39.         Resources r = context.getResources(); 
  40.         // 设置指针平移矩阵为按向量(160,160-指针的高度)平移 
  41.         int index = 0
  42.         int index2 = 0
  43.         mPlatePointMatrix.setTranslate(index, index2);//控制转盘底座的位置 
  44.         // 生成图片 
  45.         mPlayPlateBitmap = BitmapFactory.decodeStream(r 
  46.                 .openRawResource(R.drawable.playplate)); //转盘底座图片 
  47.         mPlayPlatePointBitmap = BitmapFactory.decodeStream(r 
  48.                 .openRawResource(R.drawable.plate_points)); //指针图片 
  49.     } 
  50.     // 重写View类的onDraw()函数 
  51.     @Override 
  52.     protected void onDraw(Canvas canvas) { 
  53.         int radius = mPlayPlateBitmap.getWidth() / 2;// 以底座生成的圆心 
  54.      
  55.         if(TurntableDemoActivity.SCREEN_WIDHT==320){ 
  56.             mPlayPlateMatrix.setRotate(mRotationAngle, radius -1, radius - 2);// 指针的位置 
  57.         }else{ 
  58.             mPlayPlateMatrix.setRotate(mRotationAngle, radius-1, radius -2); 
  59.         } 
  60.         Log.e("zhuanpan", "x: " + mRotationAngle); 
  61.         canvas.drawBitmap(mPlayPlateBitmap, mPlatePointMatrix, null);// 画转盘底 
  62.         canvas.drawBitmap(mPlayPlatePointBitmap, mPlayPlateMatrix, null);// 画指针 
  63.     } 
  64.  
  65.     public void run() { 
  66.         try { 
  67.             while (true) { 
  68.                 if (isRotate) { 
  69.                     this.mRotationAngle += 20; 
  70.  
  71.                     if (mRotationAngle <= mStopAngle) { 
  72.                         this.postInvalidate(); 
  73.                     } else { 
  74.                         mHandler.sendEmptyMessage(mStopPosition); 
  75.                         stopRotate(); 
  76.                     } 
  77.                     if (mRotateSpeed > 20 && mRotationAngle < mStopAngle - 700) {// 加速,通过angle,睡眠多久来表示转动一下 
  78.                         Log.i("runing", "加速:andgle=" + mRotateSpeed + " x=" 
  79.                                 + mRotationAngle + " stopAngle=" + mStopAngle); 
  80.                         mRotateSpeedmRotateSpeed = mRotateSpeed - 2; 
  81.                         Thread.sleep(mRotateSpeed); 
  82.  
  83.                     } else if (mRotationAngle > mStopAngle - 700) {// 减速,最后700 
  84.                         Log.i("runing", "减速:andgle=" + mRotateSpeed + " x=" 
  85.                                 + mRotationAngle + " stopAngle=" + mStopAngle); 
  86.                         mRotateSpeedmRotateSpeed = mRotateSpeed + 2; 
  87.                         Thread.sleep(mRotateSpeed); 
  88.  
  89.                     } else {// 均速 
  90.                         Thread.sleep(mRotateSpeed); 
  91.                     } 
  92.  
  93.                 } 
  94.             } 
  95.         } catch (InterruptedException e) { 
  96.             e.printStackTrace(); 
  97.         } 
  98.  
  99.     } 
  100.  
  101.     public void startRotate(Handler handler) { 
  102.         this.mRotationAngle = 0
  103.         mHandler = handler;// 调用playPlateAcitvity的通道 
  104.         if (mThread == null) { 
  105.             mThread = new Thread(this); 
  106.             mThread.start(); 
  107.         } else { 
  108.             Log.e("tag", "not null"); 
  109.             mThread.interrupt(); 
  110.             mThread = null
  111.             mThread = new Thread(this); 
  112.             mThread.start(); 
  113.         } 
  114.         this.isRotate = true
  115.     } 
  116.  
  117.     public void stopRotate() { 
  118.         this.isRotate = false
  119.         if (mThread != null) { 
  120.             mThread.interrupt(); 
  121.             mThread = null
  122.         } 
  123.  
  124.     } 
  125.  
  126.     public boolean getRotate() { 
  127.         return this.isRotate; 
  128.     } 
  129.  
  130.     public void setStopLocation(int angle, int stopLocation) { 
  131.         this.mStopAngle = 0
  132.         this.mStopPosition = 0
  133.         this.mStopPosition = stopLocation
  134.         this.mRotationAngle = 0
  135.         this.mStopAngle = angle + (mNumberOfTurns * 360); 
  136.  
  137.     } 
  138.  

通过下面这个类开启转盘Activity,

  1. import android.app.Activity; 
  2. import android.os.Bundle; 
  3. import android.os.Handler; 
  4. import android.os.Message; 
  5. import android.util.Log; 
  6. import android.view.MotionEvent; 
  7. import android.view.View; 
  8. import android.view.View.OnClickListener; 
  9. import android.view.Window; 
  10. import android.widget.ImageView; 
  11. import android.widget.TextView; 
  12. import android.widget.Toast; 
  13.  
  14. public class PlayplateActivity extends Activity { 
  15.     /** Called when the activity is first created. */ 
  16.     PlayPlateView panView = null
  17.     private ImageView p_w_picpath; 
  18.     private int awarded = 0
  19.     boolean bClickPanView = true
  20.     private TextView turntable_Text; 
  21.     Handler myHandler = new Handler() { 
  22.         @Override 
  23.         public void handleMessage(Message msg) { 
  24.             // TODO Auto-generated method stub 
  25.             super.handleMessage(msg); 
  26.             try { 
  27.  
  28.                 switch (msg.what) { 
  29.                 case 0: 
  30.                     awarded = 70;// 340 
  31.                     break; 
  32.                 case 1: 
  33.                     awarded = 10;// 280 
  34.                     break; 
  35.                 case 2: 
  36.                     awarded = 100;// 240 
  37.                     break; 
  38.                 case 3: 
  39.                     awarded = 20;// 200 
  40.                     break; 
  41.                 case 4: 
  42.                     awarded = 10;// 160 
  43.                     break; 
  44.                 case 5: 
  45.                     awarded = 50;// 120 
  46.                     break; 
  47.                 case 6: 
  48.                     awarded = 20;// 80 
  49.                     break; 
  50.                 case 7: 
  51.                     awarded = 5;// 20 
  52.                     break; 
  53.                 default: 
  54.                     break; 
  55.                 } 
  56.  
  57.                 postData(awarded); 
  58.  
  59.             } catch (Exception e) { 
  60.                 // TODO Auto-generated catch block 
  61.                 e.printStackTrace(); 
  62.             } 
  63.         } 
  64.  
  65.     }; 
  66.  
  67.     public void postData(int i) { 
  68.         if (i > 0) { 
  69.             Toast.makeText(this, "转盘积分为:" + i, Toast.LENGTH_LONG).show(); 
  70.         } else { 
  71.             Toast.makeText(this, "转盘获取积分失败!", Toast.LENGTH_LONG).show(); 
  72.         } 
  73.         bClickPanView = true
  74.     } 
  75.  
  76.     /** 
  77.      * 获取触屏的坐标! 
  78.      */ 
  79.     @Override 
  80.     public boolean onTouchEvent(MotionEvent event) { 
  81.         // TODO Auto-generated method stub 
  82.  
  83.         return super.onTouchEvent(event); 
  84.     } 
  85.  
  86.     @Override 
  87.     public void onCreate(Bundle savedInstanceState) { 
  88.         super.onCreate(savedInstanceState); 
  89.         requestWindowFeature(Window.FEATURE_NO_TITLE); 
  90.         setContentView(R.layout.turntable); 
  91.         panView = (PlayPlateView) findViewById(R.id.relativeLayout2); 
  92.         setTextView(); 
  93.         p_w_picpath = (ImageView) findViewById(R.id.playplate_bank); 
  94.  
  95.         panView.setOnClickListener(new OnClickListener() { 
  96.             public void onClick(View v) { 
  97.  
  98.                 if (bClickPanView) { 
  99.                     bClickPanView = false
  100.                     panView.startRotate(myHandler); 
  101.                     testLottery(); 
  102.                 } 
  103.             } 
  104.         }); 
  105.         p_w_picpath.setOnClickListener(new OnClickListener() { 
  106.  
  107.             @Override 
  108.             public void onClick(View v) { 
  109.                 finish(); 
  110.                 panView.stopRotate(); 
  111.             } 
  112.         }); 
  113.     } 
  114.  
  115.     public void setTextView() { 
  116.         turntable_Text = (TextView) findViewById(R.id.turntable_text); 
  117.         turntable_Text.setTextSize(TurntableDemoActivity.TurntableSize); 
  118.         turntable_Text.setText(TurntableDemoActivity.TurntableText); 
  119.         turntable_Text.invalidate(); 
  120.     } 
  121.  
  122.     /** 
  123.      * 控制旋转后指针指向转盘的位置 
  124.      */ 
  125.     private int Angle = 0
  126.  
  127.     private void testLottery() { 
  128.         int j = 0
  129.         int p = 8
  130.         int W = (int) (Math.random() * p + j); 
  131.         Log.i("W", W + ""); 
  132.  
  133.         switch (W) { 
  134.         case 0: 
  135.             Angle = 22;// 340 
  136.             break; 
  137.         case 1: 
  138.             Angle = 67;// 280 
  139.             break; 
  140.         case 2: 
  141.             Angle = 123;// 240 
  142.             break; 
  143.         case 3: 
  144.             Angle = 167;// 200 
  145.             break; 
  146.         case 4: 
  147.             Angle = 203;// 160 
  148.             break; 
  149.         case 5: 
  150.             Angle = 257;// 120 
  151.             break; 
  152.         case 6: 
  153.             Angle = 313;// 80 
  154.             break; 
  155.         case 7: 
  156.             Angle = 357;// 20 
  157.             break; 
  158.         default: 
  159.             break; 
  160.         } 
  161.         panView.setStopLocation(Angle, W); 
  162.     } 

 

  1. public class TurntableDemoActivity extends Activity { 
  2.     /** Called when the activity is first created. */ 
  3.     public static int SCREEN_WIDHT = 0
  4.     public static int SCREEN_HEIGHT = 0
  5.     public static int TurntableSize = 12
  6.     public static String TurntableText = "转盘抽奖"
  7.     private Button startTurntable; 
  8.  
  9.     @Override 
  10.     public void onCreate(Bundle savedInstanceState) { 
  11.         super.onCreate(savedInstanceState); 
  12.         requestWindowFeature(Window.FEATURE_NO_TITLE); 
  13.         this.setContentView(R.layout.main); 
  14.       
  15.         startTurntable = (Button) findViewById(R.id.play_turntable); 
  16.         startTurntable.setOnClickListener(new View.OnClickListener() { 
  17.  
  18.             @Override 
  19.             public void onClick(View v) { 
  20.                 Intent intent = new Intent(TurntableDemoActivity.this, 
  21.                         PlayplateActivity.class); 
  22.                 startActivity(intent); 
  23.             } 
  24.         }); 
  25.  
  26.     }
  27. }

mail.xml

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
  3.     android:layout_width="fill_parent" 
  4.     android:layout_height="fill_parent" 
  5.     android:gravity="center_horizontal" 
  6.     android:orientation="vertical" > 
  7.  
  8.     <Button 
  9.         android:id="@+id/play_turntable" 
  10.         android:layout_width="300dip" 
  11.         android:layout_height="wrap_content" 
  12.         android:layout_marginTop="20dip" 
  13.         android:text="启动转盘" /> 
  14.  
  15. </LinearLayout> 

turntable.xml

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
  3.     android:layout_width="fill_parent" 
  4.     android:layout_height="fill_parent" 
  5.     android:gravity="center" 
  6.     android:orientation="vertical" > 
  7.  
  8.     <FrameLayout 
  9.         android:id="@+id/zhuanpan_layout" 
  10.         android:layout_width="280dip" 
  11.         android:layout_height="320dip" 
  12.         android:gravity="center" > 
  13.  
  14.         <LinearLayout 
  15.             android:id="@+id/zhuanpan_layout" 
  16.             android:layout_width="wrap_content" 
  17.             android:layout_height="wrap_content" 
  18.             android:background="@drawable/turn_bg" 
  19.             android:gravity="center" 
  20.             android:orientation="vertical" > 
  21.  
  22.             <TextView 
  23.                 android:id="@+id/turntable_text" 
  24.                 android:layout_width="215dip" 
  25.                 android:layout_height="wrap_content" 
  26.                 android:ellipsize="end" 
  27.                 android:layout_marginTop="10dip" 
  28.                 android:lines="2" 
  29.                 android:textColor="@color/playplate_text" 
  30.                 /> 
  31.  
  32.             <com.wacosoft.turntable.PlayPlateView 
  33.                 android:id="@+id/relativeLayout2" 
  34.                 android:layout_width="wrap_content" 
  35.                 android:layout_height="wrap_content" /> 
  36.         </LinearLayout> 
  37.  
  38.         <LinearLayout 
  39.             android:layout_width="fill_parent" 
  40.             android:layout_height="wrap_content" 
  41.             android:orientation="horizontal" > 
  42.  
  43.             <View style="@style/FootBarSpringH" /> 
  44.  
  45.             <ImageView 
  46.                 android:id="@+id/playplate_bank" 
  47.                 android:layout_width="wrap_content" 
  48.                 android:layout_height="wrap_content" 
  49.                 android:src="@drawable/turntable_bank" /> 
  50.         </LinearLayout> 
  51.     </FrameLayout> 
  52.  
  53. </LinearLayout> 

在Values文件创建colors.xml

  1. <resources> 
  2.     <color name="playplate_text">#282828</color> 
  3.     <color name="transparent">#0000</color> 
  4. </resources> 

styles.xml

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <resources> 
  3.     <style name="FootBarSpringH"> 
  4.         <item name="android:layout_width">fill_parent</item> 
  5.         <item name="android:layout_height">0sp</item> 
  6.         <item name="android:layout_weight">1</item> 
  7.     </style> 
  8.     <style name="Transparent"> 
  9.           <item name="android:windowBackground">@color/transparent</item> 
  10.           <item name="android:windowIsTranslucent">true</item> 
  11.           <item name="android:windowAnimationStyle">@+android:style/Animation.Translucent</item> 
  12.   </style> 
  13. </resources> 

转盘的背景色是用一张小图片平铺的

drawable/turn_bg.xml

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <bitmap xmlns:android="http://schemas.android.com/apk/res/android" 
  3.     android:src="@drawable/turntable_bg" 
  4.     android:tileMode="repeat" > 
  5. </bitmap> 

图片没有提供,图片也有相应的说明!