首页 > 代码库 > 跑马灯抽奖,本地图片简单实现

跑马灯抽奖,本地图片简单实现

公司要做个抽奖功能,写了两个demo,这个是使用本地图片的跑马灯抽奖。
加载的本地图片,这种的比较简单。想“跑”起来原理也很简单。
      一个是控制好线程sleep时间,sleep时做图片的变换,变换指的就是用滚动的图片依次替换下一个图片。
      再一个就是图片的定位,这个根据当前图片位置就可以精确计算了,比用WheelView做的老\虎\机容易定位。
      我还添加了SoundPool 让每次变动都有一个声音,这样更像游戏。


注意额:跑马灯还可以做成网络图片版本,稍微复杂一点,处理好图片的缓存,不过图片的“滚动”就不能用此处的图片替换了,我用的是图片重定位。
不管是本地图片版还是网络图片版,跑马灯核心原理就是:线程控制+图片定位,根据我的本地图片版完全可以实现。现在发给大家参考参考哈!

 

  1 package com.winxiang.paomadeng;  2   3 import java.util.HashMap;  4   5 import android.annotation.SuppressLint;  6 import android.app.Activity;  7 import android.content.Context;  8 import android.media.AudioManager;  9 import android.media.SoundPool; 10 import android.os.Bundle; 11 import android.os.Handler; 12 import android.os.Message; 13 import android.util.Log; 14 import android.view.View; 15 import android.view.View.OnClickListener; 16 import android.widget.ImageButton; 17 import android.widget.ImageView; 18 import android.widget.RadioButton; 19 import android.widget.RadioGroup; 20  21 public class MainActivity extends Activity { 22  23     private int[] StartUp={500,400,300,180,120};//启动,数量5个不能变 24     private int[] Moreover={150,320,550,800};//减速,数量4个不能变 25     private int[] Finish={900};//结束,数量1个不能变 26     private ImageView fruit_1,fruit_2,fruit_3,fruit_4,fruit_5,fruit_6,fruit_7,fruit_8,fruit_9,thanks; 27     private ImageButton start_btn; 28     private int image_num=10;//用于滚动的图片数量 29     private boolean scrolling = false; 30     private int fruit=0;//网络请求的中奖结果 31     private static final int CHANGIMAGE =0; 32     private static final int CHANGSTARTBUT =1; 33     private int fruit1=9;//一等奖对应的图片编号 34     private int fruit2=1;//二等奖对应的图片编号 35     private int fruit3=4;//三等奖对应的图片编号 36     private int sum=0;//用于计数 37     private RadioGroup award_group; 38     //用于音乐特效 39     private SoundPool sp; //得到一个声音池引用 40     private HashMap<Object, Object> spMap; //得到一个map的引用 41     private ChangeThread changeThread ;//可控线程 42      43      44     @Override 45     protected void onCreate(Bundle savedInstanceState) { 46         super.onCreate(savedInstanceState); 47         setContentView(R.layout.activity_main); 48         init(); 49     } 50  51     @Override 52     protected void onPause() { 53         super.onPause(); 54         if(changeThread!=null){ 55             changeThread.stopThread();//停止线程 56         } 57     } 58      59      60     /** 61      * 开始处理 62      */ 63     public void init(){ 64         fruit_1 = (ImageView) findViewById(R.id.fruit_1); 65         fruit_2 = (ImageView) findViewById(R.id.fruit_2); 66         fruit_3 = (ImageView) findViewById(R.id.fruit_3); 67         fruit_4 = (ImageView) findViewById(R.id.fruit_4); 68         fruit_5 = (ImageView) findViewById(R.id.fruit_5); 69         fruit_6 = (ImageView) findViewById(R.id.fruit_6); 70         fruit_7 = (ImageView) findViewById(R.id.fruit_7); 71         fruit_8 = (ImageView) findViewById(R.id.fruit_8); 72         fruit_9 = (ImageView) findViewById(R.id.fruit_9); 73         thanks = (ImageView) findViewById(R.id.thanks); 74         start_btn = (ImageButton) findViewById(R.id.start_btn); 75          76         start_btn.setOnClickListener(clicklistener); 77         award_group = (RadioGroup) findViewById(R.id.radioGroup1); 78         initSoundPool(); //初始化声音池 79     } 80     public void initSoundPool(){ //初始化声音池 81         sp=new SoundPool(5,AudioManager.STREAM_MUSIC,0); //maxStreams参数,该参数为设置同时能够播放多少音效//srcQuality参数,该参数设置音频文件的质量,目前还没有效果,设置为0为默认值。//streamType参数,该参数设置音频类型,在游戏中通常设置为:STREAM_MUSIC 82         spMap=new HashMap<Object, Object>(); 83         spMap.put(1, sp.load(this, R.raw.ogg4956_2,1)); 84         spMap.put(2, sp.load(this, R.raw.complete,1)); 85     } 86      87     public void playSound(int sound,int number){ //播放声音,参数sound是播放音效的id,参数number是播放音效的次数 88         AudioManager am=(AudioManager)this.getSystemService(AUDIO_SERVICE);//实例化AudioManager对象 89         float audioMaxVolumn=am.getStreamMaxVolume(AudioManager.STREAM_MUSIC); //返回当前AudioManager对象的最大音量值 90         float audioCurrentVolumn=am.getStreamVolume(AudioManager.STREAM_MUSIC);//返回当前AudioManager对象的音量值 91         float volumnRatio=audioCurrentVolumn/audioMaxVolumn; 92         sp.play((Integer) spMap.get(sound),volumnRatio,volumnRatio,1,number,1); 93     } 94      95     OnClickListener clicklistener = new OnClickListener() { 96          97         @Override 98         public void onClick(View v) { 99             start_btn.setEnabled(false);100             scrolling = true;101             new Thread(){//获取中奖结果102                 public void run() {103                     try {104                         sleep(5000);//模拟网络请求105                         fruit=check_group_select();//模拟中奖信息106                         scrolling = false;107                     } catch (InterruptedException e) {108                         // TODO Auto-generated catch block109                         e.printStackTrace();110                     }111                 };112             }.start();113             changeThread= new ChangeThread();//让图片按照指定位置停止114             changeThread.start();115         }116     };117     118     private Handler handler = new Handler(){119         @SuppressLint("HandlerLeak")120         public void handleMessage(android.os.Message msg) {121             switch (msg.what) {122             case CHANGIMAGE:123                 playSound(1,0);124                 Bundle bundle = msg.getData();125                 ChangeImage(bundle.getInt("imageid"));126                 break;127             case CHANGSTARTBUT:128                 start_btn.setEnabled(true);129                 if(fruit<=3){130                     playSound(2,0);131                 }132             default:133                 break;134             }135         };136     };137 138     /**139      * 计算出距离中奖还要走几步140      * @param sum141      * @return142      */143     public int  checkfruit(){144         int i=0;145         if(fruit==1){146             i=fruit1;147         }else if(fruit==2){148             i=fruit2;149         }else if(fruit==3){150             i=fruit3;151         }else{152             i=(int) (Math.random()*100);153             i=i%image_num;154             if(i==fruit1){155                 i--;156             }157             if(i==fruit2){158                 i--;159             }160             if(i==fruit3){161                 i--;162             }163         }164         i+=image_num;165         i=i-sum%image_num;166         if(i<10){167             i+=image_num;;168         }169         i=i-5;170         Log.i("计算再走几步", "当前图片编号+"+sum%image_num+" ;计算剩余步数:"+(i+5));171         return i;172     }173     174     /**175      * 改变图片176      */177     protected void ChangeImage(int sum) {178         int sum_2 = (sum%image_num);//取余179         if(sum_2==0){180             thanks.setImageResource(R.drawable.red);181             fruit_9.setImageResource(R.drawable.fruit_9);182         }else if(sum_2==1){183             fruit_1.setImageResource(R.drawable.red);184             thanks.setImageResource(R.drawable.thanks);185         }else if(sum_2==2){186             fruit_2.setImageResource(R.drawable.red);187             fruit_1.setImageResource(R.drawable.fruit_1);188         }else if(sum_2==3){189             fruit_3.setImageResource(R.drawable.red);190             fruit_2.setImageResource(R.drawable.fruit_2);191         }else if(sum_2==4){192             fruit_4.setImageResource(R.drawable.red);193             fruit_3.setImageResource(R.drawable.fruit_3);194         }else if(sum_2==5){195             fruit_5.setImageResource(R.drawable.red);196             fruit_4.setImageResource(R.drawable.fruit_4);197         }else if(sum_2==6){198             fruit_6.setImageResource(R.drawable.red);199             fruit_5.setImageResource(R.drawable.fruit_5);200         }else if(sum_2==7){201             fruit_7.setImageResource(R.drawable.red);202             fruit_6.setImageResource(R.drawable.fruit_6);203         }else if(sum_2==8){204             fruit_8.setImageResource(R.drawable.red);205             fruit_7.setImageResource(R.drawable.fruit_7);206         }else if(sum_2==9){207             fruit_9.setImageResource(R.drawable.red);208             fruit_8.setImageResource(R.drawable.fruit_8);209         }210     }211 212     /**213      * 检测选中的奖项214      * 215      * @return216      */217     public int check_group_select() {218         RadioButton button = (RadioButton) findViewById(award_group219                 .getCheckedRadioButtonId());220         if (button.getText().equals("1等奖")) {221             return 1;222         } else if (button.getText().equals("2等奖")) {223             return 2;224         } else if (button.getText().equals("3等奖")) {225             return 3;226         } else {227             return 0;228         }229     }230     /**231      * 将控制图片变动做一个可控线程232      * @description233      * @author 张向234      * 2014-10-30上午9:58:51235      *236      */237     private class ChangeThread extends Thread {238         private boolean stopFlag  = false;239         @Override240         public void run() {241             while(!stopFlag) {242                 try {243                     if(!stopFlag){244                         for(int i=0;i<StartUp.length;i++){//先执行启动245                             sum++;246                             Message message = new Message();247                             message.what = CHANGIMAGE;248                             Bundle bundle = new Bundle();249                             bundle.putInt("imageid", sum);250                             message.setData(bundle);251                             handler.sendMessage(message);252                             sleep(StartUp[i]);253                         }254                     }255                     if(!stopFlag){256                         while (scrolling) {//一直执行匀速变化257                             sum++;258                             Message message = new Message();259                             message.what = CHANGIMAGE;260                             Bundle bundle = new Bundle();261                             bundle.putInt("imageid", sum);262                             message.setData(bundle);263                             handler.sendMessage(message);264                             sleep(50);265                         }266                     }267                     if(!stopFlag){268                         //得到fruit值之后,开始停止计算一下当前走到哪里,并依照获奖结果停止到指定图片269                         int m=checkfruit();270                         for(int i=0;i<m;i++){271                             sum++;272                             Message message = new Message();273                             message.what = CHANGIMAGE;274                             Bundle bundle = new Bundle();275                             bundle.putInt("imageid",sum);276                             message.setData(bundle);277                             handler.sendMessage(message);278                             sleep(50);279                         }280                         for(int i=0;i<Moreover.length;i++){281                             sum++;282                             Message message = new Message();283                             message.what = CHANGIMAGE;284                             Bundle bundle = new Bundle();285                             bundle.putInt("imageid",sum);286                             message.setData(bundle);287                             handler.sendMessage(message);288                             sleep(Moreover[i]);289                         }290                         for(int i=0;i<Finish.length;i++){291                             sum++;292                             Message message = new Message();293                             message.what = CHANGIMAGE;294                             Bundle bundle = new Bundle();295                             bundle.putInt("imageid",sum);296                             message.setData(bundle);297                             handler.sendMessage(message);298                             sleep(Finish[i]);299                         }300                         Message message1 = new Message();301                         message1.what = CHANGSTARTBUT;302                         handler.sendMessage(message1);303                         stopFlag=true;304                     }305                 } catch (InterruptedException e) {306                     e.printStackTrace();307                     stopFlag=true;308                 }309             }310         }311         public void stopThread(){312             stopFlag=true;313         }314     }315 }
View Code

 
 下载地址:http://download.csdn.net/detail/win_xiang/8120047 下载不用积分

跑马灯抽奖,本地图片简单实现