首页 > 代码库 > 跑马灯抽奖,本地图片简单实现
跑马灯抽奖,本地图片简单实现
公司要做个抽奖功能,写了两个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 }
下载地址:http://download.csdn.net/detail/win_xiang/8120047 下载不用积分
跑马灯抽奖,本地图片简单实现
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。