Android应用开发——实验四

  • 格式:doc
  • 大小:838.00 KB
  • 文档页数:20

1)阅读文献《Android应用开发揭秘》第五章,运行实例程序,分析程序代码,学习使用View类开发框架;2)运行SurfaceView类的实例程序,分析程序代码,熟悉使用SurfaceView 类开发框架;3)运行Graphics类的实例程序,分析程序代码,熟悉使用Paint类、Color 类、Canvas类,学习几何图形的绘制、字符串绘制、图像绘制、图像旋转、图像缩放等方法,学习对图像像素的操作;4)运行实例程序,分析程序代码,学习使用Shader类、双缓冲技术、全屏显示等技术;5)运行动画实例程序,分析程序代码,学习使用Tween动画、Frame动画、GIF动画播放等技术。

1.1 实验报告要求1)写出自己所做实验的步骤和内容;2)记录实验过程中发现的问题以及解决问题的方法;3)给出程序运行过程中主要页面的截图;4)提交文件包括:实验报告、源代码、可运行的安装程序,所有文件打包压缩;5)压缩包命名格式:班级号+学号+姓名+训练4.rar实验四姓名:马征学号:2011303502 班级:14011107一、阅读第五章运行示例程序学习View类开发框架分析:该示例中,我们通过实例化Handler对象并重写handleMessage方法实现了一个消息接收器,然后在线程中通过sendMessage方法发送更新界面的消息,当接收器收到更新界面的消息是,执行invalidate方法更新屏幕显示。

以上主要用来绘制主界面,接下来是控制整个应用的操作,比如世界处理,更新频率,相对的需要实现一个Activity类。

体会:在Android中虽然提供了invalidate方法来实现界面刷新,但是invalidate不能直接在线程中调用,因为违背了单线程模型,AndroidUI操作并不是线程安全的,并且这些操作必须在UI线程中执行,因此Android中最常用的方法是利用Handler来实现UI线程的更新。

示例中提供的View类来作为游戏的开发框架,然而当需要开发更加复杂的游戏,并且对程序的执行效率要求很高时,View类就不能满足需求,这个时候我们需要学习SurfaceView类。

二、SurfaceView类开发框架当游戏的需求较高的时候,可以使用双缓冲来显示,游戏中的背景、人物、动画等都需要绘制在一个画布上,而SurfaceView可以直接访问一个画布,SurfaceView是提供给需要直接画像素而不是使用窗体部件的应用使用的,Android图形系统中的一个重要概念是Surface,View及其子类要画在Surface上,每个Surface创建一个Canvas对象,用来管理View在Surface上的绘图操作。

SurfaceView在开发时一般都是出现在最顶层,使用时还需要对其惊醒创建、销毁,情况改变的时候进行监视,需要实现SurfaceHolder.Callback接口,需要对被绘制的画布进行裁剪,控制其大小的时候都需要使用SurfaceHolder来完成处理。

SurfaceHolder对象需要通过getHolder方法来获得,同事还需要addCallback方法来添加“回调函数”。

总结:surfaceChanged 在Surface的大小发生改变时激发SurfaceCreated 在创建Surface时激发surfaceDestroyed 在销毁Surface时激发addCallback 给SurfaceView添加一个回调函数lockCanvas 锁定画布,绘图之前必须锁定画布才能得到当前画布对象UnlockCanvasAndPost 开始绘制时,锁定了画布,绘制完成之后解锁画布removeCallback 从SurfaceView中移除回调函数分析:这个示例中,控制整个应用流程的Activity类和上一节差不多,首先需要控制循环。

在开始定义SurfaceHolder,然后对SurfaceHolder实例化,添加回调;根据上个总结的表格,Surfacc的大小发生改变的时候激发surfaceChanged三、Graphics类开发开发游戏,必须在屏幕上绘制2D图形,而在Android中需要通过graphics类显示2D图形,graphics中包括了Canvas、Paint、Color、Bitmap、2D几何图形等常用类。

可以绘制点、线、颜色、图像处理、2D几何图形等功能。

1、Paint和Color类Paint类中定义了很多的效果,根据文档,列出效果如下:SetAntiAlias 设置画笔的锯齿效果setColor 设置画笔的颜色SetARGB 设置画笔的a r p g 值setAlpha 设置Alpha值setTextSize 设置字体尺寸setStyle 设置画笔风格,空心或者实心setStrokeWidth 设置空心的边框宽度getColor 得到画笔的颜色getAlpha 得到画笔的Alpha值而color类中包含了12中颜色package com.yarin.android.Examples_05_03;import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.util.Log;import android.view.KeyEvent;import android.view.MotionEvent;import android.view.View;public class GameView extends View implements Runnable{public final static String TAG = "Examples_05_03_GameView"; ///* 声明Paint对象*/private Paint mPaint = null;public GameView(Context context){super(context);/* 构建对象*/mPaint = new Paint();/* 开启线程*/new Thread(this).start();}public void onDraw(Canvas canvas){super.onDraw(canvas);/* 设置Paint为无锯齿*/mPaint.setAntiAlias(true);/* 设置Paint的颜色*/mPaint.setColor(Color.RED);mPaint.setColor(Color.BLUE);mPaint.setColor(Color.YELLOW);mPaint.setColor(Color.GREEN);/* 同样是设置颜色*/mPaint.setColor(Color.rgb(255, 0, 0));/* 提取颜色*/Color.red(0xcccccc);Color.green(0xcccccc);/* 设置paint的颜色和Alpha值(a,r,g,b) */mPaint.setARGB(255, 255, 0, 0);/* 设置paint的Alpha值*/mPaint.setAlpha(220);/* 这里可以设置为另外一个paint对象*/// mPaint.set(new Paint());/* 设置字体的尺寸*/mPaint.setTextSize(14);// 设置paint的风格为“空心”.// 当然也可以设置为“实心”(Paint.Style.FILL)mPaint.setStyle(Paint.Style.STROKE);// 设置“空心”的外框的宽度。

mPaint.setStrokeWidth(5);/* 得到Paint的一些属性*/Log.i(TAG, "paint的颜色:" + mPaint.getColor());Log.i(TAG, "paint的Alpha:" + mPaint.getAlpha());Log.i(TAG, "paint的外框的宽度:" + mPaint.getStrokeWidth());Log.i(TAG, "paint的字体尺寸:" + mPaint.getTextSize());/* 绘制一个矩形*/// 肯定是一个空心的举行canvas.drawRect((320 - 80) / 2, 20, (320 - 80) / 2 + 80, 20 + 40, mPaint);/* 设置风格为实心*/mPaint.setStyle(Paint.Style.FILL);mPaint.setColor(Color.GREEN);/* 绘制绿色实心矩形*/canvas.drawRect(0, 20, 40, 20 + 40, mPaint);}// 触笔事件public boolean onTouchEvent(MotionEvent event){return true;}// 按键按下事件public boolean onKeyDown(int keyCode, KeyEvent event){return true;}// 按键弹起事件public boolean onKeyUp(int keyCode, KeyEvent event){return false;}public boolean onKeyMultiple(int keyCode, int repeatCount, KeyEvent event){return true;}public void run(){while (!Thread.currentThread().isInterrupted()){try{Thread.sleep(100);}catch (InterruptedException e){Thread.currentThread().interrupt();}// 使用postInvalidate可以直接在线程中更新界面postInvalidate();}}}分析:根据代码的注释可以非常清楚的理解图形的绘制,需要注意的是在绘制出图形之后还需要通过Activity类的setContentView2、Canvas类介绍阅读资料以后,针对Canvas,我了解了如下十个最为常用的方法Canvas()创建一个空的画布,可以使用setBitmap()方法来设施绘制的具体画布Canvas(Bitmap bitmap)以bitmap对象创建一个画布,则将内容都绘制在bitmap上,因此bitmap不得为NULL Canvas(GL gl)在绘制3D效果时使用,和OpenGL相关DrawColor 设置Canvas的背景颜色setBitmap 设置具体画布clipRect 设置显示区域,即裁剪区域isOpaque 检测是否支持透明Rotate 旋转画布setViewport 设置画布中显示窗口Skew 设置便宜变量分析:通过代码分析,我们可以看出来,左边的矩形进行了旋转操作,并被裁减了。