圖片跑馬燈抽獎,本地圖片變換簡單實現

公司要作個抽獎功能,寫了兩個demo,這個是使用本地圖片的跑馬燈抽獎。
加載的本地圖片,這種的比較簡單。想「跑」起來原理也很簡單。
      一個是控制好線程sleep時間,sleep時作圖片的變換,變換指的就是用滾動的圖片依次替換下一個圖片。
      再一個就是圖片的定位,這個根據當前圖片位置就能夠精確計算了,比用WheelView作的老\虎\機容易定位。
      我還添加了SoundPool 讓每次變更都有一個聲音,這樣更像遊戲。


注意額:跑馬燈還能夠作成網絡圖片版本,稍微複雜一點,處理好圖片的緩存,不過圖片的「滾動」就不能用此處的圖片替換了,我用的是圖片重定位。
無論是本地圖片版仍是網絡圖片版,跑馬燈核心原理就是:線程控制+圖片定位,根據個人本地圖片版徹底能夠實現。如今發給你們參考參考哈!java

 

  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 block
109                         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 sum
141      * @return
142      */
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      * @return
216      */
217     public int check_group_select() {
218         RadioButton button = (RadioButton) findViewById(award_group
219                 .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      * @description
233      * @author 張向
234      * 2014-10-30上午9:58:51
235      *
236      */
237     private class ChangeThread extends Thread {
238         private boolean stopFlag  = false;
239         @Override
240         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 下載不用積分android

相關文章
相關標籤/搜索