公司要作個抽獎功能,寫了兩個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 }
下載地址:http://download.csdn.net/detail/win_xiang/8120047 下載不用積分android