Android游戏闯关模式View-(1) - Go语言中文社区

Android游戏闯关模式View-(1)


1.需求如下,对创的关数进行数字到汉字的转换,然后显示对应的闯过的关数,然后显示对应关的人物头像,同时能区分对应解锁关和未解锁的关数。

一般情况我们看着这个估计就开始头大了,一般的是先百度看看别人写过了没,写过了就拿别人的来修修改改就OK了,因为项目的紧张,目前我就只是采用了GridView+逻辑整理来完成这个任务,以后有空就来自定义这个View。

2.思路

    将闯关模式图,分为奇数行和偶数行,将每关显示的看成一个item项,然后item四周都有分割条,在通过基数行和偶数行对应的位置来控制显示和隐藏对应的item项就OK了。


3.代码

(1)item项目布局

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal">

        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:gravity="center_horizontal"
            android:orientation="vertical">
            <FrameLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content">
                <FrameLayout
                    android:id="@+id/framlay_head"
                    android:layout_width="@dimen/x50"
                    android:layout_height="@dimen/x50"
                    android:background="@mipmap/ic_to_confirm_head">




                    <ImageView
                        android:id="@+id/iv_head"
                        android:layout_width="@dimen/x30"
                        android:layout_height="@dimen/x30"
                        android:layout_gravity="center"
                        android:layout_marginBottom="@dimen/x5"
                        android:src="@mipmap/ic_head" />


                </FrameLayout>
                <View
                    android:id="@+id/view_line_up"
                    android:layout_width="@dimen/x5"
                    android:layout_height="@dimen/x50"
                    android:layout_gravity="center_horizontal"
                    android:background="@color/colorBlue"></View>
            </FrameLayout>


            <TextView
                android:id="@+id/tv_number"
                android:layout_width="@dimen/x70"
                android:layout_height="@dimen/y30"
                android:background="@drawable/shape_round_blue_stroke_deep"
                android:gravity="center"
                android:paddingLeft="@dimen/x10"
                android:paddingRight="@dimen/x10"
                android:text="第一关"
                android:textColor="@color/colorWhite"
                android:textSize="10sp" />

            <View
                android:id="@+id/view_line_down"
                android:layout_width="@dimen/x5"
                android:layout_height="@dimen/x20"
                android:layout_gravity="bottom|center"
                android:background="@color/colorBlue"></View>
        </LinearLayout>

        <View
            android:id="@+id/view_line_right"
            android:layout_width="0dp"
            android:layout_height="5dp"
            android:layout_gravity="center_vertical"
            android:layout_marginTop="@dimen/x15"
            android:layout_weight="1"
            android:background="@color/colorBlue"></View>

    </LinearLayout>

(2)Adapter逻辑控制类

    private class GameAdapter extends BaseAdapter {

        private int now_count = 0;//第几关
        private int count = 18;//总关数
        private int old_count = 0;

        /**
         * 构造游戏关
         *
         * @param count
         * @param now_count
         */
        public ContentAdapter(int count, int now_count) {
            this.count = count;
            this.now_count = now_count;
        }

        /**
         * 刷新关数
         *
         * @param now_count
         */
        public void refresh(int now_count) {
            this.now_count = now_count;
        }

        @Override
        public int getCount() {
            old_count = count;
            if (count % 5 != 0) {
                int row = count / 5;
                return (row + 1) * 5;
            }
            return count;
        }

        @Override
        public Object getItem(int position) {
            return null;
        }

        @Override
        public long getItemId(int position) {
            return 0;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            final ViewHolder holder;
            if (convertView == null) {
                holder = new ViewHolder();
                convertView = LayoutInflater.from(ToConfirmAty.this).inflate(R.layout.item_to_confirm, parent, false);
                ViewUtils.inject(holder, convertView);
                convertView.setTag(holder);
            } else {
                holder = (ViewHolder) convertView.getTag();
            }
            init(holder, position);
            holder.tv_number.setTextColor(Color.parseColor("#FFFFFF"));
            int tag = (int) holder.tv_number.getTag(R.string.tag_game_position);
            if (tag == getCount()) {
                holder.view_line_down.setVisibility(View.INVISIBLE);
            }

            //显示头像
            if (tag == now_count) {
                holder.framlay_head.setVisibility(View.VISIBLE);
                holder.tv_number.setTextColor(Color.parseColor("#FED001"));
                ImageLoader.showCircleImage(ToConfirmAty.this,holder.iv_head,getUserInfo().get("headImg"),R.mipmap.ic_default_head,0);
            }
            //显示未开通
            if (tag > now_count) {
                holder.tv_number.setTag(R.string.tag_is_lock, 1);
                holder.tv_number.setText("");
                holder.tv_number.setBackgroundResource(R.drawable.ic_weijiesuo);

                holder.view_line_right.setBackgroundColor(Color.parseColor("#EEEEEE"));
                holder.view_line_up.setBackgroundColor(Color.parseColor("#EEEEEE"));
                holder.view_line_down.setBackgroundColor(Color.parseColor("#EEEEEE"));
            } else {
                holder.tv_number.setTag(R.string.tag_is_lock, 0);
            }

            holder.tv_number.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    int game_number = (int) holder.tv_number.getTag(R.string.tag_game_position);
                    int is_lock = (int) holder.tv_number.getTag(R.string.tag_is_lock);
                    Log.e("RRL", "game_number:" + game_number + ",is_lock:" + is_lock);
                }
            });
            return convertView;
        }

        private class ViewHolder {
            @ViewInject(R.id.framlay_head)
            private FrameLayout framlay_head;
            @ViewInject(R.id.iv_head)
            private ImageView iv_head;
            @ViewInject(R.id.tv_number)
            private TextView tv_number;
            @ViewInject(R.id.view_line_down)
            private View view_line_down;
            @ViewInject(R.id.view_line_up)
            private View view_line_up;
            @ViewInject(R.id.view_line_right)
            private View view_line_right;
        }

        private void init(ViewHolder holder, int position) {
            holder.framlay_head.setVisibility(View.INVISIBLE);
            holder.tv_number.setTag(R.string.tag_click_positin, position);
            int row = getCount() / 5;
            int other_row_count = getCount() % row;
            int now_row = position / 5 + 1;

            if (now_row % 2 == 0) {//偶数行
                int number = now_row * 5 - position % 5;
                holder.tv_number.setText("第" + MathToChinese.numtochinese(number + "") + "关");
                holder.tv_number.setTag(R.string.tag_game_position, number);
            } else {//奇数行
                int number = position + 1;
                holder.tv_number.setText("第" + MathToChinese.numtochinese(number + "") + "关");
                holder.tv_number.setTag(R.string.tag_game_position, number);
            }

            if ((position + 1) % 5 == 0 && now_row % 2 != 0) {//每行的最后+奇数数行
                holder.view_line_up.setVisibility(View.INVISIBLE);
                holder.view_line_right.setVisibility(View.INVISIBLE);
            } else {
                holder.view_line_up.setVisibility(View.INVISIBLE);
            }
            if ((position + 1) % 5 == 0 && now_row % 2 == 0) {//每行的最后+偶数行
                holder.view_line_up.setVisibility(View.VISIBLE);
                holder.view_line_right.setVisibility(View.INVISIBLE);
                holder.view_line_down.setVisibility(View.INVISIBLE);
            }
            if ((position + 1) % 5 != 0) {
                holder.view_line_down.setVisibility(View.INVISIBLE);
            }
            if (position % 5 == 0 && now_row % 2 != 0 && now_row > 1) {//每行的第一个+奇数数行
                holder.view_line_up.setVisibility(View.VISIBLE);
            }
            if ((position) % 5 == 0 && now_row % 2 == 0) {//每行的第一个+偶数行
                holder.view_line_down.setVisibility(View.VISIBLE);
            }

            Log.e("RRL", "old_count:" + old_count + ",count:" + getCount());
            if (old_count != getCount()) {
                int old_row = old_count / 5;
                int add_count = getCount() - old_count;
                if (now_row % 2 == 0) {//偶数
                    //隐藏多余的
                    int number = old_row * 5 + position % 5; //20 - 0
                    if (number == position && position < (old_row * 5 + add_count)) {
                        holder.tv_number.setVisibility(View.INVISIBLE);
                        holder.view_line_right.setVisibility(View.INVISIBLE);
                        holder.tv_number.setEnabled(false);
                    }
                } else {//奇数
                    int number = old_row * 5 + position % 5; //20 - 0
                    if (number == position && position > (old_row * 5 + add_count)) {
                        holder.tv_number.setVisibility(View.INVISIBLE);
                        holder.view_line_right.setVisibility(View.INVISIBLE);
                        holder.tv_number.setEnabled(false);
                    }
                    if (position == (old_row * 5 + add_count)) {//能显示的最后一个的右边线
                        holder.view_line_right.setVisibility(View.INVISIBLE);
                    }
                }
            }

        }


    }


版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/u012127961/article/details/80168835
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-03-02 04:43:47
  • 阅读 ( 1071 )
  • 分类:

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢