package com.peiandsky; import android.annotation.SuppressLint; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Paint; import android.view.MotionEvent; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.View; import android.view.View.OnTouchListener; /*开发游戏的时候必定有一个'画板',在上面不断的画图和更新,达到游戏场面 * 这里的'画板',我们采用了继承surfaceView,来实现*/ public class MenuView extends SurfaceView implements SurfaceHolder.Callback, OnTouchListener { private DDZ ddz; SurfaceHolder holder; Canvas canvas; boolean threadFlag = true; Bitmap back; private int x = 270; private int y = 50; private Bitmap[] menuItems; /*提供一个构造函数,new的时候产生的实例就会具有参数列表的属性 * 参数:context 这里解释一下,这个参数表示context(上下文)调用MenuView的实例, * 比如我们常看到Toast(this)之类的。这里其实是用this(当前activity)代替了context * ddz这个参数是为了getResource()。貌似是因为activity下的次方法返回的才是资源 * */ public MenuView(Context context, DDZ ddz) { super(context); this.ddz = ddz; //new一个位图的数组 menuItems = new Bitmap[5]; holder = getHolder(); /*将图片分解成位图,这应该是计算机可识别的二进制数据吧 * 从descode的字面上看应该是反编码*/ back = BitmapFactory .decodeResource(ddz.getResources(), R.drawable.menu); menuItems[0] = BitmapFactory.decodeResource(ddz.getResources(), R.drawable.menu1); menuItems[1] = BitmapFactory.decodeResource(ddz.getResources(), R.drawable.menu2); menuItems[2] = BitmapFactory.decodeResource(ddz.getResources(), R.drawable.menu3); menuItems[3] = BitmapFactory.decodeResource(ddz.getResources(), R.drawable.menu4); menuItems[4] = BitmapFactory.decodeResource(ddz.getResources(), R.drawable.menu5); // for(int i=0;i<menuItems.length;i++) // { // menuItems[0]=BitmapFactory.decodeFile("menu"+(i+1)+".png"); // } /* *每个surfaceView当中都有一个surface,surfaceView提供精细绘制surface的方法,可以通过它来改变surface的大小,格式等 *surfaceHolder是为surfaceView提供的一个接口类, 方便实现对surface的控制 *给Holder加一个回调接口,这个'回调接口应该就是指SurfaceHolder.Callback' *依照我的理解,就是给holder实现了callback的以下三个方法*/ this.getHolder().addCallback(this); //监听触摸事件 this.setOnTouchListener(this); } /* * 因为存在主线程UI线程,又另起一个线程来实现绘画,所以势必会两个线程同时共享一块surface内存 * 为了避免UI线程在绘图期间对surface的操作,我们通过lockCanvas对绘图的画布来加锁,直到解锁之后 * 才让出线程*/ @SuppressLint("WrongCall") Thread menuThread = new Thread() { @Override public void run() { while (threadFlag) { try { //给画布加锁 canvas = holder.lockCanvas(); //给onDraw方法加锁,在解锁之前其它线程不能修改此处内存 synchronized (this) { onDraw(canvas); } // System.out.println("menuThread"); } finally { //给画布解锁 holder.unlockCanvasAndPost(canvas); } try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } } }; /*绘图方法,在这里实现画布上的图像 * 绘制*/ @Override protected void onDraw(Canvas canvas) { //画笔 Paint paint = new Paint(); //先画个背景 canvas.drawBitmap(back, 0, 0, paint); //利用循环递加的方式,绘制出其它按钮的图像 for (int i = 0; i < menuItems.length; i++) { canvas.drawBitmap(menuItems[i], x, y + i * 43, paint); } // paint.setColor(Color.WHITE); // paint.setTextSize(32); // canvas.drawText("开始游戏", 158, 91, paint); // canvas.drawText("游戏帮助", 158, 121, paint); // canvas.drawText("关于游戏", 158, 151, paint); } /*关于callBack中方法触发的时机 * surfaceChange在surface大小等的改变时触发*/ @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } @Override /*在surface创建时激发,一般在这里调用过绘图的线程 * 这里用到标志位threadFlag*/ public void surfaceCreated(SurfaceHolder holder) { threadFlag = true; menuThread.start(); System.out.println("surfaceCreated"); } /*销毁时激发,一般在这里对绘图线程停止,释放*/ @Override public void surfaceDestroyed(SurfaceHolder holder) { threadFlag = false; boolean retry = true; while (retry) {// 循环 try { menuThread.join();// 等待线程结束 retry = false;// 停止循环 } catch (InterruptedException e) { }// 不断地循环,直到刷帧线程结束 } } /*监听触摸事件*/ @Override public boolean onTouch(View v, MotionEvent event) { //获取触摸的坐标 int ex = (int) event.getX(); int ey = (int) event.getY(); System.out.println(event.getX() + "," + event.getY()); int selectIndex = -1; for (int i = 0; i < menuItems.length; i++) { System.out.println(x+" "+(y+i*43)); if (Poke.inRect(ex, ey, x, y + i * 43, 125, 33)) { selectIndex = i; break; } } System.out.println(selectIndex); switch (selectIndex) { case 0: ddz.handler.sendEmptyMessage(DDZ.GAME); break; case 1: break; case 2: break; case 3: break; case 4: ddz.finish(); break; } return super.onTouchEvent(event); } }
相关推荐
matlab怎样注释一段代码Matlab代码分析器 MATLAB附带了非常重要的工具MLINT,它可以检查代码中的常见缺陷。 经验表明,这些提示对于清理MATLAB代码和防止简单错误非常有帮助。 至关重要的是,MLINT不是样式检查器。 ...
linux原始版本代码及其注释。讲解相关的linux运作机制
matlab怎样注释一段代码pet 新的python参数探索工具包: pypet管理python中任何数值模拟的参数空间的探索,从而为您将数据存储到HDF5文件中。 此外, pypet提供了一个新的数据容器,可让您从一个来源访问所有参数和...
查阅了网上的一些资料并加上自己的理解,在大部分原文件中进行了注释,希望对各位看官理解nginx有帮助,如有不对的地方,请见谅!
去除注释 去注释 目前简简单单一个去除.cpp的 //注释 和 /**/注释。 其他文件需要去除注释改改代码应该就可以实现了。
主要介绍了SqlSever 注释符 单行注释与多行注释,需要的朋友可以参考下
matlab把一段代码全作为注释BestLeetCode 它是什么? 这是针对LeetCode.com中的问题集的非正式FAST(est)C ++解决方案。 我们希望该存储库可以帮助人们编写灵活的程序。 警告:此存储库以速度为目标。 有些解决方案...
主要介绍了详解XML中的代码注释书写方法,文章中总结了注释使用的一些注意点,比如XML不支持嵌套注释等,需要的朋友可以参考下
Dreamweaver怎么给代码添加注释?给代码添加注释是好习惯,方便以后查看程序,该怎么添加注释呢?下面我们就来看看Dreamweaver注释的添加方法,需要的朋友可以参考下
一些常见的排序算法通过C语言来实现,包括算法思想和源代码
完美去除C++注释 包括 行注释 与 块注释
所以写了一个程序来自动将C++的单行注释替换成C语言的注释格式. 压缩包中有两个文件. 其中 to_c_style_comment.c 中的我程序文件. cpptest.c 只是一个测试文件. 是一个包含C++单行注释的c源程序, 仅供测试用. 编译...
此画图,我对每一行都加详细的注释,让你不再为理解不了别人写的代码而发愁!代码精炼,没有你多余的东西!
这是一段关于使用ARIMA建立预测模型的代码,代码比较老,但是有注释,写的很清楚。值得一看!
一个朋友要的,非常简单的java事务的处理代码.适合初学者看看!我已经写了注释了.
一段优秀的程序离不开信息完整的注释,然而编写美观的注释,却又总会耗掉一点时间。现在有了本程序,只需输入少量内容,就可生成整齐划一的注释格式,再也不用为了美观而去手动对齐了。程序中输入的内容自动保存到 ...
词频统计
为了让别人一看就知道这段代码是做什么用的。正确的程序注释一般包括序言性注释和功能性注释。序言性注释的主要内容包括模块的接口、数据的描述和模块的功能。模块的功能性注释的主要内容包括程序段的功能、语句的...
相信大家都了解后缀树难弄.给一源代码就好学习了.
下面是一段用Python写的圣诞树源码: ``` height = 10 # 圣诞树的高度 for i in range(height): print(' ' * (height - i - 1) + '*' * (2 * i + 1)) print(' ' * (height - 1) + '|') ``` 这段代码可以输出一...