Java基础案例教程-教材源码
第11章Java绘图与动画第1页本章概述本章的学习目标主要内容本章概述图形图像与动画等多媒体技术是当今计算机信息领域的热门话题,而且已经成为计算机中最大的应用领域。有了图形图像和动画,应用程序才变得丰富多彩,栩栩如生。传统的Java绘图与动画主要由AWT的Graphics和Graphics2D类来实现的,新的GUI框架JavaFX也对绘图和动画提供了强大的支持。本章将分别介绍传统的Java绘图与动画技术,以及JavaFX中的绘图与动画效果的应用。第2页本章的学习目标掌握Graphics类提供的绘制图形的方法了解Java2D绘图掌握传统的Java多线程实现的动画技术了解消除动画中的闪烁的方法掌握JavaFX的直接在画布上绘图的方法了解JavaFX的动画效果第3页第4页主要内容11.1传统的Java绘图
11.2显示图像与动画 11.3JavaFX绘图与动画 11.4本章小结 11.5思考和练习 11.1传统的Java绘图Java的图形都是相对于窗口绘制的,可以是applet的主窗口或子窗口,也可以是独立应用程序窗口(基于Swing的窗口也支持这些方法)。传统的Java绘图是使用AWT包中的Graphics类和Graphics2D类提供的绘图方法来绘制简单的图形。第5页图形直角坐标系统使用Java绘制图形时,采用以象素为单位的直角坐标系统,这是一种对屏幕上每个点进行定位的方案,默认情况下,该坐标系统的圆点位于屏幕的左上角,向左延伸出X轴的正方向,向下延伸出Y的正方向,这和其他的编程语言是相同的。所有的图形向窗口的输出都是通过图形上下文进行的。图形上下文是由Graphics类封装的,可以通过两种方式获得图形上下文: 作为参数通过方法传递,例如方法paint()或update()。 通过Component的getGraphics()方法返回。第6页Graphics类Graphics类是抽象类,它定义了大量方法,用于绘制各种类型的对象,例如直线、矩形和弧线。有的个方法只绘制对象的边框,有的方法那么绘制填充的对象。对象以当前选择的图形颜色进行绘制和填充,默认是黑色。当对图形对象的绘制超出窗口的范围时,会自动剪裁输出。第7页Java2D图形Graphics类提供的方法只能绘制宽度为1个象素的图形。如果需要绘制宽度大于1个像素的图形,那么需要使用Graphics2D。这是从JDK1.2版本开始增加的类,它扩展了Graphics类。Graphics2D在几个地方增强了Graphics提供的根本功能。为了使用这种扩展的功能,需要将使用paint()等方法获得的图形上下文强制转换成Graphics2D。Graphics2D提供了以下方法来设置绘图环境的属性。 voidsetBackground(Colorcolor):设置绘图环境的背景颜色; voidsetPaint(Paintpaint):设置绘图环境的绘图颜色; voidsetStroke(Strokes):设置绘图环境画笔的样式。第8页Font类Font类,即字体类,可以使用它来控制文本的字体及其样式。Font类提供了将字符序列映射到字形序列所需要的信息,以便在Graphics对象和Component对象上呈现字形序列。Font类的构造方法如下:Font(Fontfont);Font(Stringfontname,intstyle,intsize);其中,fontname为字体名称,是字体集合中的某个字符串,该字符串是某种字体的名称;style为字体风格,是Font类定义的静态常量,包括Font.PLAIN(下划线),Font.BOLD(粗体)和Font.ITALIC(斜体)等,可以是多个值的组合风格,如,Font.BOLD|Font.ITALIC可以指定加粗、斜体样式;size为字体的大小。第9页Color类Color类用于封装默认sRGB(standardRedGreenBlue)颜色空间中的颜色,或者用于封装由ColorSpace标识的任意颜色空间中的颜色。每种颜色都有一个隐式的alpha值1.0,或者有一个在构造方法中指定的alpha值。alpha值定义了颜色的透明度,可用一个范围在0.0~1.0或0~255内的浮点数来表示它。alpha值为1.0或255那么意味着颜色完全不透明,alpha值为0或0.0那么意味着颜色完全透明。Color类定义了一些静态颜色常量,如YELLOW和yellow都表示黄色,BLUE和blue表示蓝色等。第10页绘制简单图形第11页Java2D绘图使用Graphics2D可以绘制更丰富的Java2D图形。在绘制图形之前,通常需要使用setStroke()方法设置绘图环境的画笔样式,通过setPaint()方法设置绘图颜色。通常使用BasicStroke类来指定画笔的宽度。BasicStroke类实现了Stroke接口,该类用来定义直线的宽度、连接的样式、直线末端的样式以及虚线的样式。第12页Java2D绘图Java2D可以通过setPaint()方法来设置绘图颜色,本书介绍两个比较常用的:GradientPaint和TexturePaint。GradientPaint用来定义线性渐变颜色TexturePaint类用来定义填充的材质(texture),该类的构造方法如下:TexturePaint(BufferedImagetexture,Rectangle2Drect)其中,texture参数是一个BufferedImage对象,用来定义一个单位材质;rect参数用来复制材质。第13页Java2D绘图第14页XOR绘图模式绘图模式指的是画笔的着色方式。默认的绘图模式为覆盖,即后绘制的图形将覆盖先前绘制的图形。Graphics类还提供了一种异或绘图模式,即XOR模式。用户可以通过setXORMode()方法来将当前的绘图模式设置为异或模式。从XOR模式返回到覆盖模式的方法是调用setPaintMode()方法。XOR模式的优点是:新对象总是保证可见,而不管在它上面绘制的颜色是什么。第15页XOR绘图模式第16页显示文本除了绘制图形以外,Graphics类还提供了显示文本的方法drawString,在调用该方法显示文本时,还可以先设置文本的颜色和字体。第17页第18页主要内容11.1传统的Java绘图 11.2显示图像与动画 11.3JavaFX绘图与动画 11.4本章小结 11.5思考和练习 11.2显示图像与动画图像是由专门的软件和截取图像的工具生成的二进制文件,按照不同存储图像数据形成了不同的图形种类,主要包括bmp、gif、jpeg等几种,本节将介绍Java如何处理这些现有的图像资源。虽然Graphics类提供了大量的绘图方法,但是,如果用它们来绘制比较复杂的图形,还是比较困难,所以对于复杂的图像,还是通过其他图像处理软件处理好之后,然后通过Graphics类的drawImage()方法将它加载并显示出来。第19页创立图像图像的创立有多种方法,最简单的是从文件获取,通常使用ImageIO类的read方法来读取。该方法返回的是BufferedImage对象,BufferedImage是Image的子类,它描述了具有可访问图像数据缓冲区的Image。如果没有图像文件,还可以通过程序来生成一个图像,这就需要用到ImageProducer接口。该接口的定义在包中,该包中的FilterImageSource和MemoryImageSource类都实现了ImageProducer接口。MemoryImageSource类用来在内存中生成图像,该类的构造方法如下:MemoryImageSource(intw,inth,intpixel[],intoffset,intscan)FilteredImageSource类基于已经载入的图像和图像过滤器来生成一张图片,该类的构造方法如下:publicFilteredImageSource(ImageProducerorigObj,ImageFilterimgObj);第20页过滤图像过滤器的概念类似于摄影中的滤色镜。图像过滤器ImageFilter能够在图像显示之前修改图像,中提供了ImageFilter及其两个子类CropImageFilter和RGBImageFilter。CropImageFilter用于提取图像中指定矩形区域的图像,而RGBImageFilter用于对图像的色彩进行处理。本书案例用到了CropImageFilter过滤器,CropImageFilter的构造方法如下:publicCropImageFilter(intx,inty,intwidth,intheight);其中(x,y)为剪裁矩形的坐标,width和height为剪裁的宽度和高度。创立完图像过滤器之后,可以通过FilteredImageSource对象来将过滤器放在已有的图像源之上。第21页显示图像第22页多线程实现动画所谓动画就是通过连续播放一系列画面,给视觉造成连续变化的图画,这是动画最根本的原理。在Java中实现动画有很多种方法,但它们实现的根本原理是一样的,即在屏幕上画出一系列的帧,给人的视觉造成运动的感觉。要在Java中实现动画效果,首先需要用Graphics类的drawImage()方法在屏幕上绘制图片,然后通过定义一个线程,使该线程睡眠一段时间,然后再显示另外一幅图片,如此依次显示,即可在屏幕上绘制出一系列的帧来做成运动的感觉,从而到达显示动画的目的。第23页动画技术在制作动画的过程中,需要注意以下两个问题: 装载图像需要时间,可能导致图像一局部一局部的显示; 屏幕会出现闪烁现象。闪烁的原因有两个,一是绘制每一帧花费的时间太长〔因为重绘时要求的计算量大〕;二是在每次调用paint()方法之前,Java会用背景颜色重画整个画面,当在进行下一帧的计算时,用户看到的是背景。减弱闪烁的较好方法有两种:重载update()和使用双缓冲。第24页重载update()方法在AWT组件中,当upload方法去除组件的背景时,实际是用当前的背景色重新绘制图像。重载update()方法,将以前在paint()方法中的绘图代码包含在update()中,从而防止每次重绘时将整个区域去除。所以,要消除画面闪烁就一定要重载update()方法,使该方法不会去除整个画面,而只是消除必要的局部。第25页使用双缓冲技术图像双缓冲的主要原理是创立一个后台图像,将需要绘制的一帧画入图像,然后调用drawImage()方法将整个图像一次绘制到屏幕上。这种方法的好处是大局部绘制是离屏的。将离屏图像一次绘制到屏幕上比直接在屏幕上绘制要有效得多,大大提高做图的性能。双缓冲可以使动画更平滑,但也有一个缺点,那就是要分配一张后台图像,如果图像相当大,这将需要很大一块内存。当使用双缓冲技术时,应重载update()方法。、第26页动画案例第27页第28页主要内容11.1传统的Java绘图 11.2显示图像与动画 11.3JavaFX绘图与动画
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.bianchenghao6.com/h6javajc/19122.html