社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
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);
}
}
}
}
}
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!