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


    公司要做个抽奖功能,写了两个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 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 下载不用积分

  • 相关阅读:
    第十周作业
    第九周作业
    软件工程作业2
    自我介绍
    2019学习总结
    第二周作业
    十二周
    十一周
    第十周作业
    第九周作业
  • 原文地址:https://www.cnblogs.com/winxiang/p/4074061.html
Copyright © 2020-2023  润新知