我的编程空间,编程开发者的网络收藏夹
学习永远不晚

android如何实现简单拼图游戏

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

android如何实现简单拼图游戏

小编给大家分享一下android如何实现简单拼图游戏,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!

具体内容如下

android如何实现简单拼图游戏

//使用回调接口,首先初始化pintuview并绑定,实现回调接口的方法    mPintuLayout = (PintuLayout) findViewById(R.id.mpintu);        mPintuLayout.setOnGamePintuListener(new GamePintuListener() {            @Override            public void timechanged(int currentTime) {                tvTime.setText(currentTime + "");            }            @Override            public void nextLevel(final int nextLevel) {                mtvNextLevel.setVisibility(0);                mPintuLayout.pause();                mPintuLayout.nextLevel();                level = nextLevel + "";            }            @Override            public void gameover() {                mtvGameOver.setVisibility(0);            }        });    }    @Override    protected void onPause() {        super.onPause();        mPintuLayout.pause();    }    @Override    protected void onResume() {        super.onResume();        mPintuLayout.resume();    }// 设置按两次回退退出程序    @Override    public boolean onKeyDown(int keyCode, KeyEvent event) {        if (keyCode == KeyEvent.KEYCODE_BACK) {            exit();            Toast.makeText(getApplicationContext(), "再按一次则退出",                    Toast.LENGTH_SHORT).show();            return false;        }        return super.onKeyDown(keyCode, event);    }    private void exit() {        if (!isExit) {            isExit = true;            myHandler.sendEmptyMessageDelayed(0, 2000);        } else {            finish();        }    }    Handler myHandler = new Handler() {        @Override        public void handleMessage(Message msg) {            super.handleMessage(msg);            isExit = false;        }    };//界面的点击事件    @Override    public void onClick(View v) {        switch (v.getId()) {        case R.id.textView1:            mPintuLayout.pause();            Toast.makeText(getApplicationContext(), "Pausing",                    Toast.LENGTH_SHORT).show();            mPintuLayout.setVisibility(4);            miv.setVisibility(0);            break;        case R.id.textView2:            mPintuLayout.resume();            Toast.makeText(getApplicationContext(), "Restarted",                    Toast.LENGTH_SHORT).show();            mPintuLayout.setVisibility(0);            miv.setVisibility(4);            break;        case R.id.mtvGameOver:            mtvGameOver.setVisibility(4);            mPintuLayout.restart();            break;        case R.id.mtvNextLevel:            mtvNextLevel.setVisibility(4);            tvLevel.setText("" + level);            mPintuLayout.resume();            break;        }    }

每一小块退片的bean

public class ImagePieces {    //小块图片的索引值    private int index;    //整个一大块的图片载体    private Bitmap bitmap;    public int getIndex() {        return index;    }    public void setIndex(int index) {        this.index = index;    }    public Bitmap getBitmap() {        return bitmap;    }    public void setBitmap(Bitmap bitmap) {        this.bitmap = bitmap;    }       //构造方法    public ImagePieces(int index, Bitmap bitmap) {        super();        this.index = index;        this.bitmap = bitmap;    }    public ImagePieces() {        // TODO Auto-generated constructor stub    }    @Override    public String toString() {        return "ImagePieces [index=" + index + ", bitmap=" + bitmap + "]";    }}

图片分割类

public class ImageSplitterUtil {    //pieces 为切成的块数,用list保存    public static List<ImagePieces> splitImage(Bitmap bitmap,int pieces){        List<ImagePieces> imagePieces = new ArrayList<ImagePieces>();        int width = bitmap.getWidth();        int height = bitmap.getHeight();        //去小的一方每一个快的宽度        int pieceWidth = Math.min(width,height)/pieces;        for(int i=0;i<pieces;i++){            for(int j=0;j<pieces;j++){                ImagePieces imagepieces = new ImagePieces();                                imagepieces.setIndex(j+i*pieces);                int x = j*pieceWidth;                int y = i*pieceWidth;                //x,y是每一块的起点位置,piecewidth是每一块的长度和高度,这里弄成正方形                imagepieces.setBitmap(Bitmap.createBitmap(bitmap, x, y, pieceWidth, pieceWidth));                //所有操作setIndex  setBitmap 然后把所有碎片按顺序加入list集合中                imagePieces.add(imagepieces);            }                   }               return imagePieces;    }}

布局类

首先

private void init() {        // 将margin的值的单位转为dp        mMargin = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,                3, getResources().getDisplayMetrics());        mPadding = min(getPaddingLeft(), getPaddingRight(), getPaddingTop(),                getPaddingBottom());    }

其次onmeasure

@Override    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {        super.onMeasure(widthMeasureSpec, heightMeasureSpec);        // 获得宽度和高度的最小值        mWidth = min(getMeasuredHeight(), getMeasuredWidth());        if (!once) {            // 进行切图及排序            initBitmap();            // 设置imageview[item]的宽高等属性            initItem();            // 标识已画,防止再画            once = true;            countTimeBaseLevel();        }        // 宽度和高度的最小值设为宽高        setMeasuredDimension(mWidth, mWidth);    }

其次

// 进行切图及排序    private void initBitmap() {        if (mBitmap == null) {            mBitmap = BitmapFactory.decodeResource(getResources(),                    R.drawable.psb);        }        mItemBitmaps = ImageSplitterUtil.splitImage(mBitmap, mColumn);        // 是用sort把小块的图片乱序        Collections.sort(mItemBitmaps, new Comparator<ImagePieces>() {            @Override            public int compare(ImagePieces a, ImagePieces b) {                return Math.random() > 0.5 ? 1 : -1;            }        });    }
private int mTime;    // 相对关卡的时间数    private void countTimeBaseLevel() {        mTime = (int) Math.pow(2, mLevel) * 30;        mHandler.sendEmptyMessage(TIME_CHANGED);    }
// 动画层的布局private RelativeLayout mAnimaLayout;private boolean isAniming;

回调接口

public interface GamePintuListener {        void nextLevel(int nextLevel);        void timechanged(int currentTime);        void gameover();    }    public GamePintuListener mListener;    // 设置接口回调    public void setOnGamePintuListener(GamePintuListener mListener) {        this.mListener = mListener;    }

游戏的进程控制,这里利用的是hangler

private static final int TIME_CHANGED = 0x110;    public static final int NEXT_LEVEL = 0x111;    private Handler mHandler = new Handler() {        public void handleMessage(android.os.Message msg) {            switch (msg.what) {            case TIME_CHANGED:                if (isGameSuccess || isGameOver || isPausing)                    return;                if (mListener != null) {                    mListener.timechanged(mTime);                    if (mTime == 0) {                        isGameOver = true;                        mListener.gameover();                        return;                    }                }                mTime--;                mHandler.sendEmptyMessageDelayed(TIME_CHANGED, 1000);                break;            case NEXT_LEVEL:                mLevel = mLevel + 1;                if (mListener != null) {                    mListener.nextLevel(mLevel);                } else {                    nextLevel();                }                break;            }        }    };

重新开始游戏方法

public void restart() {        isGameOver = false;        mColumn--;        nextLevel();    }

暂停和继续的方法

private boolean isPausing;    public void pause() {        isPausing = true;        mHandler.removeMessages(TIME_CHANGED);    }    public void resume() {        if (isPausing) {            isPausing = false;            mHandler.sendEmptyMessage(TIME_CHANGED);        }    }public void nextLevel() {        this.removeAllViews();        mAnimaLayout = null;        mColumn++;        isGameSuccess = false;        countTimeBaseLevel();        initBitmap();        initItem();    };
// 设置imageview[item]的宽高等属性    private void initItem() {        // 把内边距和外面距剪掉除以列数就是每一块的宽度        mItemWidth = (mWidth - mPadding * 2 - mMargin * (mColumn - 1))                / mColumn;        // item图片位置的初始化        mPintuItems = new ImageView[mColumn * mColumn];        // item图片的初始化        for (int i = 0; i < mPintuItems.length; i++) {            ImageView item = new ImageView(getContext());            item.setOnClickListener(this);            item.setImageBitmap(mItemBitmaps.get(i).getBitmap());            mPintuItems[i] = item;            item.setId(i + 1);            // 在item里面存放index,当拼图成功时候做为判断一句            item.setTag(i + "_" + mItemBitmaps.get(i).getIndex());            RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(                    mItemWidth, mItemWidth);            // 设置间隙            // 如果不是最后一列            if ((i + 1) % mColumn != 0) {                lp.rightMargin = mMargin;            }            // 不是第一列            if (i % mColumn != 0) {                lp.addRule(RelativeLayout.RIGHT_OF, mPintuItems[i - 1].getId());            }            // 纵向间隙            // 如果不是第一行,设置topMargin和rule            if ((i + 1) > mColumn) {                lp.topMargin = mMargin;                lp.addRule(RelativeLayout.BELOW,                        mPintuItems[i - mColumn].getId());            }            addView(item, lp);        }    }

交换图片

private ImageView mFirst;    private ImageView mSecond;    @Override    public void onClick(View v) {        if (isAniming)            return;        if (mFirst == v) {            mFirst.setColorFilter(null);            mFirst = null;            return;        }        if (mFirst == null) {            mFirst = (ImageView) v;            mFirst.setColorFilter(Color.parseColor("#45f0f0f0"));        } else {            mSecond = (ImageView) v;            exchangView();        }    }

交换图片的方法exchangeView方法的具体实现

// 交换image    private void exchangView() {        mFirst.setColorFilter(null);        String firstTag = (String) mFirst.getTag();        String secondTag = (String) mSecond.getTag();        String[] firstParams = firstTag.split("_");        String[] secondParams = secondTag.split("_");        final Bitmap firstBitmap = mItemBitmaps.get(                Integer.parseInt(firstParams[0])).getBitmap();        final Bitmap secondBitmap = mItemBitmaps.get(                Integer.parseInt(secondParams[0])).getBitmap();        //设置动画层,下面有具体实现        setUpAnimLayout();        ImageView first = new ImageView(getContext());        first.setImageBitmap(firstBitmap);        LayoutParams lp = new LayoutParams(mItemWidth, mItemWidth);        lp.leftMargin = mFirst.getLeft() - mPadding;        lp.topMargin = mFirst.getTop() - mPadding;        first.setLayoutParams(lp);        mAnimaLayout.addView(first);        ImageView second = new ImageView(getContext());        second.setImageBitmap(secondBitmap);        LayoutParams lp2 = new LayoutParams(mItemWidth, mItemWidth);        lp2.leftMargin = mSecond.getLeft() - mPadding;        lp2.topMargin = mSecond.getTop() - mPadding;        second.setLayoutParams(lp2);        mAnimaLayout.addView(second);        // 设置动画        TranslateAnimation anim = new TranslateAnimation(0, mSecond.getLeft()                - mFirst.getLeft(), 0, mSecond.getTop() - mFirst.getTop());        anim.setDuration(300);        anim.setFillAfter(true);        first.setAnimation(anim);        TranslateAnimation anim2 = new TranslateAnimation(0, mFirst.getLeft()                - mSecond.getLeft(), 0, mFirst.getTop() - mSecond.getTop());        anim2.setDuration(300);        anim2.setFillAfter(true);        second.setAnimation(anim2);        anim.setAnimationListener(new AnimationListener() {            @Override            public void onAnimationStart(Animation arg0) {                mFirst.setVisibility(View.INVISIBLE);                mSecond.setVisibility(View.INVISIBLE);                isAniming = true;            }            @Override            public void onAnimationRepeat(Animation arg0) {            }            @Override            public void onAnimationEnd(Animation arg0) {                mSecond.setImageBitmap(firstBitmap);                mFirst.setImageBitmap(secondBitmap);                String firstTag = (String) mFirst.getTag();                String secondTag = (String) mSecond.getTag();                mFirst.setTag(secondTag);                mSecond.setTag(firstTag);                mFirst.setVisibility(View.VISIBLE);                mSecond.setVisibility(View.VISIBLE);                mFirst = mSecond = null;                mAnimaLayout.removeAllViews();                // 每次移动完成判断是否成功                checkSuccess();                isAniming = false;            }            private void checkSuccess() {                boolean isSuccess = true;                for (int i = 0; i < mPintuItems.length; i++) {                    ImageView imageview = mPintuItems[i];                    String[] tag = imageview.getTag().toString().split("_");                    if (Integer.parseInt(tag[1]) != i) {                        isSuccess = false;                    }                }                if (isSuccess) {                    isSuccess = true;                    mHandler.removeMessages(TIME_CHANGED);                    Toast.makeText(getContext(), "level up!",                            Toast.LENGTH_SHORT).show();                    mHandler.sendEmptyMessage(NEXT_LEVEL);                }            }        });    }

动画层的具体实现

private void setUpAnimLayout() {  if (mAnimaLayout == null) {            mAnimaLayout = new RelativeLayout(getContext());            addView(mAnimaLayout);        }    }
//获取多个参数的最少值作为内边距private int min(int... params) {        int min = params[0];        for (int param : params) {            if (param < min) {                min = param;            }        }        return min;    }

看完了这篇文章,相信你对“android如何实现简单拼图游戏”有了一定的了解,如果想了解更多相关知识,欢迎关注编程网行业资讯频道,感谢各位的阅读!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

android如何实现简单拼图游戏

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

android如何实现简单拼图游戏

小编给大家分享一下android如何实现简单拼图游戏,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!具体内容如下1.2.//使用回调接口,首先初始化pintuview并绑定,实现回调接口的方法 mPintuLayout
2023-06-29

js如何实现简单拼图游戏

这篇文章主要介绍了js如何实现简单拼图游戏的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇js如何实现简单拼图游戏文章都会有所收获,下面我们一起来看看吧。HTML仅有一个id为game的div,并且没有编写css
2023-07-02

Java如何实现Android拼图游戏

这篇文章主要介绍“Java如何实现Android拼图游戏”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Java如何实现Android拼图游戏”文章能帮助大家解决问题。1.项目介绍这是一款基于 Jav
2023-06-29

怎么用Android实现拼图游戏

小编给大家分享一下怎么用Android实现拼图游戏,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!具体内容如下源码package packageName;import android.os.Bundle;import and
2023-06-29

Android实现美女拼图游戏详解

先来看看效果:图片切分很多份,点击交换拼成一张完整的;这样关卡也很容易设计,3 3;4 4;5 5;6 6;一直下去 加了个切换动画,效果还是不错的,其实游戏就是自定义了一个控件,下面我们开始自定义之旅。 游戏的设计首先我们分析下如何设计这
2022-06-06

C语言如何实现拼图游戏

本篇内容介绍了“C语言如何实现拼图游戏”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!制作一款拼图小游戏#include
2023-06-08

JS如何实现九宫格拼图游戏

这篇文章主要介绍了JS如何实现九宫格拼图游戏的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇JS如何实现九宫格拼图游戏文章都会有所收获,下面我们一起来看看吧。具体代码如下
2023-07-02

微信小程序如何实现拼图游戏

这篇文章给大家分享的是有关微信小程序如何实现拼图游戏的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。具体内容如下页面展示项目链接微信小程序实现拼图游戏项目设计首页面wxml
2023-06-20

C#怎么实现拼图游戏

这篇文章主要介绍“C#怎么实现拼图游戏”,在日常操作中,相信很多人在C#怎么实现拼图游戏问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C#怎么实现拼图游戏”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!本文
2023-06-20

如何用js代码实现拼图小游戏

这篇文章主要讲解了“如何用js代码实现拼图小游戏”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何用js代码实现拼图小游戏”吧!一、js拼图是什么?用js做得小游戏二、使用步骤1、先创建di
2023-06-14

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录