为了账号安全,请及时绑定邮箱和手机立即绑定

点击图片交换问题。

到现在只能点击交换完成一次,然后就再也不能点击了。麻烦大家帮忙看一下 哪里出了问题 ,

package com.example.game_pintu.PintuView;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.location.OnNmeaMessageListener;
import android.text.Layout;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.TranslateAnimation;
import android.widget.ImageSwitcher;
import android.widget.ImageView;
import android.widget.RelativeLayout;

import com.example.game_pintu.R;
import com.example.game_pintu.game.utils.imagePiece;
import com.example.game_pintu.game.utils.imageSpiliter;

import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.concurrent.locks.ReadWriteLock;

public class PintuLayout extends RelativeLayout implements View.OnClickListener {
    private int mColumn=3;
    private int mPadding;//容器的内边距
    private int mMargin=3; //每张小图的横纵距离dp

    private ImageView[] mGamePintuItems;

    private int mItemWidth;

    private Bitmap mBitmap; //游戏的图片

    private List<imagePiece> mItemBitmaps;

    private boolean once;

    private int mWidth;//游戏面板的宽度
    private boolean isGameSuccess;
    private boolean isGameOver;


    public PintuLayout(Context context) {
        this(context,null);
    }

    public PintuLayout(Context context, AttributeSet attrs) {
        this(context, attrs,0);
    }
    public PintuLayout(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs,defStyle);
        init();
    }

    private void init() {
        mMargin = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
                3, getResources().getDisplayMetrics());
        mPadding = min(getPaddingLeft(), getPaddingRight(), getPaddingTop(),
                getPaddingBottom());
    }

        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
            // 取宽和高中的小值
            mWidth = Math.min(getMeasuredHeight(), getMeasuredWidth());

        if(!once){
            initBitmap();

            initItem();//设置ImageView(Item)的宽高等属性


            once=true;
        }
            setMeasuredDimension(mWidth, mWidth);
    }
    //进行切图,以及排序
    private void initBitmap() {
        if(mBitmap==null){
            mBitmap = BitmapFactory.decodeResource(getResources(),
                    R.drawable.kaolatwo);
        }

        mItemBitmaps = imageSpiliter.splitImage(mBitmap, mColumn);
        //使用sort完成乱序
        Collections.sort(mItemBitmaps, new Comparator<imagePiece>(){


            @Override
            public int compare(imagePiece a, imagePiece b) {
                return Math.random()>0.5 ? 1: -1;
            }
        });
    }
    //设置ImageView(Item)的宽高等属性
    private void initItem()
    {
        mItemWidth = (mWidth - mPadding * 2 - mMargin * (mColumn - 1))
                / mColumn;
        mGamePintuItems = new ImageView[mColumn * mColumn];
        // 生成我们的Item,设置Rule
        for (int i = 0; i < mGamePintuItems.length; i++)
        {
            ImageView item = new ImageView(getContext());
            item.setOnClickListener(this);
            item.setImageBitmap(mItemBitmaps.get(i).getBitmap());

            mGamePintuItems[i] = item;
            item.setId(i + 1);

            //在Item的tag中存储了index
            item.setTag(i + "_" + mItemBitmaps.get(i).getIndex());

            RelativeLayout.LayoutParams ip = new RelativeLayout.LayoutParams(
                    mItemWidth, mItemWidth);

            //不是最后一列
            if ((i + 1) % mColumn != 0)
            {
                ip.rightMargin = mMargin;
            }
            //不是第一例
            if (i % mColumn != 0)
            {
                ip.addRule(RelativeLayout.RIGHT_OF,
                        mGamePintuItems[i - 1].getId());
            }
            //如果不是第一行设置topMargin和Rule

            if ((i + 1) > mColumn)
            {
                ip.topMargin = mMargin;
                ip.addRule(RelativeLayout.BELOW,
                        mGamePintuItems[i - mColumn].getId());
            }
            addView(item, ip);

        }
    }


    /*
    获取多个参数的最小值
     */
    private int min(int... params) {
        int min = params[0];

        for (int param : params)
        {
            if (param < min)
                min = param;
        }
        return min;
    }

    private ImageView mFirst;//第一次点击
    private ImageView mSecond;//第二次点击

    @Override
    public void onClick(View v) {
        if (isAniming)
            return;
        //两次点击同一个Item
        if(mFirst==v){
            mFirst.setColorFilter(null);
            mFirst = null;
            return;
        }
        if(mFirst==null){
            mFirst = (ImageView) v;
            mFirst.setColorFilter(Color.parseColor("#55FF0000"));

        }else{
            mSecond = (ImageView) v;
            // 交换我们的Item
            exchangeView();
        }
    }
/*
动画层
 */
private RelativeLayout mAnimLayout;
private boolean isAniming;
/*
交换我们的Item
 */
private void exchangeView()
{
    mFirst.setColorFilter(null);
    // 构造我们的动画层
    setUpAnimLayout();

    ImageView first = new ImageView(getContext());
    final Bitmap firstBitmap = mItemBitmaps.get(
            getImageIdByTag((String) mFirst.getTag())).getBitmap();
    first.setImageBitmap(firstBitmap);
    LayoutParams ip = new LayoutParams(mItemWidth, mItemWidth);
    ip.leftMargin = mFirst.getLeft() - mPadding;
    ip.topMargin = mFirst.getTop() - mPadding;
    first.setLayoutParams(ip);
    mAnimLayout.addView(first);

    ImageView second = new ImageView(getContext());
    final Bitmap secondBitmap = mItemBitmaps.get(
            getImageIdByTag((String) mSecond.getTag())).getBitmap();
    second.setImageBitmap(secondBitmap);
    LayoutParams ip2 = new LayoutParams(mItemWidth, mItemWidth);
    ip2.leftMargin = mSecond.getLeft() - mPadding;
    ip2.topMargin = mSecond.getTop() - mPadding;
    second.setLayoutParams(ip2);
    mAnimLayout.addView(second);

        //设置动画
    TranslateAnimation anim = new TranslateAnimation(0, mSecond.getLeft()
            - mFirst.getLeft(), 0, mSecond.getTop() - mFirst.getTop());
    anim.setDuration(300);
    anim.setFillAfter(true);
    first.startAnimation(anim);

    TranslateAnimation animSecond = new TranslateAnimation(0,
            -mSecond.getLeft() + mFirst.getLeft(), 0, -mSecond.getTop()
            + mFirst.getTop());
    animSecond.setDuration(300);
    animSecond.setFillAfter(true);
    second.startAnimation(animSecond);
        //监听动画
    anim.setAnimationListener(new Animation.AnimationListener()
    {
        @Override
        public void onAnimationStart(Animation animation)
        {
            mFirst.setVisibility(View.INVISIBLE);
            mSecond.setVisibility(View.INVISIBLE);

            isAniming = true;
        }

            @Override
            public void onAnimationRepeat(Animation animation) {




            }
        @Override
        public void onAnimationEnd(Animation animation) {
            String firstTag = (String) mFirst.getTag();
            String secondTag = (String) mSecond.getTag();

            mFirst.setImageBitmap(secondBitmap);
            mSecond.setImageBitmap(firstBitmap);

            mFirst.setTag(secondTag);
            mSecond.setTag(firstTag);

            mFirst.setVisibility(View.VISIBLE);
            mSecond.setVisibility(View.VISIBLE);

            mFirst = mSecond = null;
            mAnimLayout.removeAllViews();
            // 判断用户游戏是否成功
        }
        });


    }
/*
根据Tga获取Id
 */
public int getImageIdByTag(String tag)
{
    String[] split = tag.split("_");
    return Integer.parseInt(split[0]);
}

    public int getImageIndexByTag(String tag)
    {
        String[] split = tag.split("_");
        return Integer.parseInt(split[1]);
    }
/*
构建我们的动画层
 */
private void setUpAnimLayout()
{
    if (mAnimLayout == null)
    {
        mAnimLayout = new RelativeLayout(getContext());
        addView(mAnimLayout);
    }
}

}

这是到现在的代码

正在回答

2 回答

http://img1.sycdn.imooc.com//5e2176570001357706210392.jpg

里面加上 

isAniming = false;
我猜的


1 回复 有任何疑惑可以回复我~

有人吗?


0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
Android美女拼图小游戏
  • 参与学习       25702    人
  • 解答问题       97    个

本视频教程将带领大家通过自定义控件实现一个拼图游戏

进入课程

点击图片交换问题。

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信