Android 滚动抽奖的实现

本文参考了网上的实现思路,使用了阿里的vlayout来实现,这里用vlayout只是单纯的熟悉一下vlayout的使用方法,毕竟vlayout还是可以解决很大部分UI需求。

首先看一下效果:

这里写图片描述

首先说一下思路:

1:数据,每一个奖项都是一个对象,需要设置id以及name
2:拿到数据集合,需要对id做一下处理,因为选中是圆形顺序转动,数据显示是集合顺序显示,这时候需要按照转动顺序获取到id集合
3:需要设置随机时长,根据结束时候的选中id,获取中奖信息。

首先用vlayout来实现列表:

 recyclerView = (RecyclerView) findViewById(R.id.recyclerview);
        VirtualLayoutManager layoutManager = new VirtualLayoutManager(this);
        recyclerView.setLayoutManager(layoutManager);
        //设置三列
        GridLayoutHelper gridLayoutHelper = new GridLayoutHelper(3);
        //设置数据长度,根据后台数据判断即可
        gridLayoutHelper.setItemCount(9);
        //管理LayoutHelper集合
        final List<LayoutHelper> helpers = new LinkedList<>();
        //添加gridlayout布局
        helpers.add(gridLayoutHelper);
        //设置布局管理器
        layoutManager.setLayoutHelpers(helpers);
        //设置item间隔
        recyclerView.addItemDecoration(new RecyclerView.ItemDecoration() {
            public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
                outRect.set(1, 1, 1, 1);
            }
        });
        //设置适配器
        recyclerView.setAdapter(new VirtualLayoutAdapter(layoutManager) {
            @Override
            public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
                return new MainViewHolder(new TextView(MainActivity.this));
            }

            @Override
            public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {
                VirtualLayoutManager.LayoutParams layoutParams = new VirtualLayoutManager.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 100);
                holder.itemView.setLayoutParams(layoutParams);
                ((TextView) holder.itemView).setGravity(Gravity.CENTER);
                if (position == 4) {
                    holder.itemView.setBackgroundColor(Color.WHITE);
                    ((TextView) holder.itemView).setText("开始");
                } else {
                    holder.itemView.setBackgroundResource(R.drawable.bg_item);
                    ((TextView) holder.itemView).setText(Integer.toString(position));
                }
                holder.itemView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        if (position==4){

                        }else {

                        }

                    }
                });
            }

            @Override
            public int getItemCount() {
            //这个主要计算布局item数量
                List<LayoutHelper> helpers = getLayoutHelpers();
                if (helpers == null) {
                    return 0;
                }
                int count = 0;
                for (int i = 0, size = helpers.size(); i < size; i++) {
                //遍历每一个helper,拿到每一个helper的数据长度累加
                    count += helpers.get(i).getItemCount();
                }
                return count;
            }
        });
    }

MainViewHolder

 static class MainViewHolder extends RecyclerView.ViewHolder {

        public MainViewHolder(View itemView) {
            super(itemView);
        }
    }

这样就实现了3x3的gridlayout的列表布局,并设置样式。

然后需要开启一个线程,遍历id列表,去刷新背景,显示一个转动的效果

   class MyRunnable implements Runnable{

        @Override
        public void run() {
            handler.sendEmptyMessage(0);
            if(startTime>=stopTime){
                handler.removeCallbacks(myRunnable);
                if(array_id[num]==5){
                    Toast.makeText(MainActivity.this,array_id[num]+"中奖了",Toast.LENGTH_SHORT).show();
                }else {
                    Toast.makeText(MainActivity.this,array_id[num]+"未中奖",Toast.LENGTH_SHORT).show();
                }
                startTime=0;
                return;
            }
            handler.postDelayed(myRunnable,100);
            startTime+=100;
        }
    }

这里设置id为5为中奖,中奖也必须根据id来判断。每100毫秒发送刷新一次,如果起始时间大于等于结束时间(随机时间),则停止线程,拿到当前id去判断是否中奖。

接收消息并处理:

  private Handler handler=new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            Change(array_id[num]);
            num++;
            if (num >=8) {
                num = 0;
            }
        }
    };

    private void Change(int num) {
        for (int i=0;i<recyclerView.getChildCount();i++){
            if(i==num){
                recyclerView.getChildAt(i).setSelected(true);
            }else if(i==4){
                continue;
            }else {
                recyclerView.getChildAt(i).setSelected(false);
            }
        }
    }

在ViewHolder中设置开启线程以及UI

   @Override
            public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {
                VirtualLayoutManager.LayoutParams layoutParams = new VirtualLayoutManager.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 100);
                holder.itemView.setLayoutParams(layoutParams);
                ((TextView) holder.itemView).setGravity(Gravity.CENTER);
                if (position == 4) {
                    holder.itemView.setBackgroundColor(Color.WHITE);
                    ((TextView) holder.itemView).setText("开始");
                } else {
                    holder.itemView.setBackgroundResource(R.drawable.bg_item);
                    ((TextView) holder.itemView).setText(Integer.toString(position));
                }
                holder.itemView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        if (position==4){
                            myRunnable.run();
                        }else {
                            Toast.makeText(MainActivity.this,"选中了"+position,Toast.LENGTH_SHORT).show();
                        }

                    }
                });
            }

本文参考了http://blog.csdn.net/qq_31530015/article/details/51287053,非常感谢。
代码没有多大意义,主要是体验一下实现思路,自己敲一下才能明白自己思路问题出在哪里

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值