【文档说明】第06章-Android图形图像处理1课件.ppt,共(23)页,4.242 MB,由小橙橙上传
转载请保留链接:https://www.ichengzhen.cn/view-92617.html
以下为本文档部分文字说明:
第6章图像与图形处理本章知识结构图图形、图像处理逐帧动画简单图片自定义绘图CanvasPaintPathAnimationDrawableBitmapBitmapFactoryDrawable逐帧动画简单图片作为一款注重用户体验的应用程序
,当然离不开图形、图像的支持。在Android中对图形、图像提供了多种支持,一般使用Bitmap和BitmapFactory方法来封装和管理位图,通过Animation和AnimationDrawabl
e类来保存和控制逐帧动画,使用Canvas和Path两个类绘制各种各样的图形,其中,Canvas可以绘制一些常见的规则图形,而Path则用于绘制一些不规则、自定义的图形。静态图片即图片内容不发生变化的图片,通常用于显示、增添界面美观,例如图标、背景等。对于这种类型的图片通常由一些图片控件
进行处理,如ImageView等。动态图片即内容、大小、位置等会随着时间而变化的图片,一般采用不断重新绘制的方式来处理,每隔多少毫秒绘制一次,给人的感觉就是连续变化的。2D绘图接口结构图片不仅可以使用ImageView等图片控件显示,也可以作为Button、Tex
tView等控件的背景。从广义的角度来看,Android应用中图片不仅包括*.png(首选)、*.jpg、*.gif(不建议)等格式的位图,也包括使用XML资源文件定义的各种Drawable对象。逐帧动画是一种常见的动画形式,其
原理是利用人的视觉的滞后性,在时间轴的每帧上绘制不同的内容,然后在足够短的时间内进行播放,给人的感觉就如同连续的动画。由于逐帧动画的帧序列内容不一样,这不但给制作增加了负担而且最终输出的文件量也很大,但它的优势也很明显:逐帧动画适合
于表演细腻的动作。例如:人物走路、说话,动物奔跑等6.1简单图片和逐帧动画逐帧动画简单图片6.1简单图片和逐帧动画6.1简单图片和逐帧动画程序结构在Android中操作图片是通过Drawable类来完成的,Drawable类有很多子类,如Bit
mapDrawable类用于操作位图,AnimationDrawable类用于操作逐帧动画,ShapeDrawable类用于操作形状。Android不允许图片资源的文件名中出现大写字母,且不能以数字开头。需要指
出的是,R.drawable.Xxx只是一个int类型的常量,代表该Drawable对象的ID,如果在Java程序中需要获得实际的Drawable对象,则可以调用getResources()方法再调用Resources的getDrawable(intID)方法来获取
。1.Drawable对象6.1.1简单图片2.Bitmap和BitmapFactoryBitmap用于表示一张位图,BitmapDrawable用于封装一个Bitmap对象。如果想将Bitmap对象包装成Bitm
apDrawable对象,可以调用BitmapDrawable的构造方法。BitmapDrawablebd=newBitmapDrawable(Bitmapbitmap);如果需要获取BitmapDrawable包装的Bitmap对象,可以调用BitmapDrawable的ge
tBitmap()方法。Bitmapbitmap=bd.getBitmap();6.1.1简单图片Bitmap类常用方法方法描述createBitmap(Bitmapsource,intx,inty,intwidth,intheight)从原位图source的指定坐标点(x,y)开始
,截取宽为width,长为height的部分,创建一个新的Bitmap对象createBitmap(intwidth,intheight,Bitmap.Configconfig)创建一个宽为width,长为height的新位
图getHeight()获取位图的高度getWidth()获取位图的宽度isRecycle()返回该Bitmap对象是否已被回收recycle()强制一个Bitmap对象立即回收自己6.1.1简单图片BitmapFactory是一个工具类,该类
所有的方法都是静态方法,这些方法可以从不同的数据源来解析、创建Bitmap对象,如资源ID、路径、文件和数据流等方式。方法描述decodeByteArray(byte[]data,intoffset,intlength)从指定的data字节数组的offset位置,将长度为len
gth的字节数据解析成Bitmap对象decodeFile(StringpathName)从pathName指定的文件中解析,创建一个Bitmap对象decodeResource(Resourcesres,intID)从指定的资源ID
中解析创建Bitmap对象decodeStream(InputStreamis)从指定的输入流解析,创建一个Bitmap对象6.1.1简单图片BitmapFactory类常用方法3.实现示例6.1.1简单图片1<Im
ageView2android:id="@+id/bitmap1"3android:layout_width="match_parent"4android:layout_height="240dp"→
高度固定,宽度填充整个屏幕5android:scaleType="fitXY"/>→设置图片的缩放方式6<ImageView7android:id="@+id/bitmap2"8android:layout_width="
100dp"9android:layout_height="100dp"10android:layout_gravity="center_horizontal"→高度、宽度固定,位置水平居中11android:layout_margi
nTop="10dp"/>→设置两个ImageView的上下间距6.1.1简单图片1finalImageViewbitmap1=(ImageView)findViewById(R.id.bitmap1);→获取ImageView对象2finalImageViewbitmap2=(
ImageView)findViewById(R.id.bitmap2);3bitmap1.setImageBitmap(BitmapFactory.decodeResource(getResources(),R.drawable.grass));→获取草地背景的位图4bitmap1.setO
nTouchListener(newOnTouchListener(){→设置触摸监听器5publicbooleanonTouch(Viewv,MotionEventevent){6BitmapDrawablebitmapDrawable=(
BitmapDrawable)bitmap1.getDrawable();7Bitmapbitmap=bitmapDrawable.getBitmap();8floatxchange=bitmap.getWidth()/(float)bitmap1.get
Width();→获取原图的缩放量9floatychange=bitmap.getHeight()/(float)bitmap1.getHeight();10intx=(int)(event.getX()*xchange);→获取触摸的坐标对应原图上的位置11inty=(
int)(event.getY()*ychange);12if(x+50>bitmap.getWidth()){x=bitmap.getWidth()-50;}→对越界情况的处理13if(x-50<0){x=50
;}14if(y+50>bitmap.getHeight()){y=bitmap.getHeight()-50;}15if(y-50<0){y=50;}16bitmap2.setImageBitmap(Bitmap.createBitmap(bitmap,x
-50,y-50,100,100));→以点击的位置为中心查看原图的局部细节17bitmap2.setVisibility(View.VISIBLE);18returnfalse;19}1.创建逐帧动画创建逐帧动画的一般方法:先在程序中存放逐帧动画的素材,再在res文件夹下创建一个ani
m文件夹,再在该文件夹下创建一个XML文档,在<animation-list…/>元素中添加<item…/>元素来定义动画的全部帧。<?xmlversion="1.0"encoding="utf-8"?><animation-listxmlns:android=
"http://schemas.android.com/apk/res/android"android:oneshot=["true"|"false"]><itemandroid:drawable="…"androi
d:duration="…"/></animation-list>注意:Android也支持在代码中创建逐帧动画,调用AnimationDrawable的addFrame(Drawableframe,intduration)方法即可,类似于使用XML方法创建时的
<item…/>。6.1.2逐帧动画其中:(1)android:oneshot属性定义动画是否循环播放。true---只播一次,不循环播放;false---循环播放。(2)<item.../>元素定义每一张图片的内容和播放持续时间。androi
d:drawable指定内容,android:duration指定时间。(3)<item...>元素出现的顺序指定图片播放的顺序。Android也支持在代码中创建逐帧动画:调用AnimationDrawable的addFrame(Draw
ableframe,intduration)方法即可,类似于使用XML方法创建时的<item.../>。6.1.2逐帧动画2.实现示例6.1.2逐帧动画程序界面布局中定义了三个组件:两个Button和一个ImageView,两个Button用于控
制逐帧动画的开始和停止,ImageView用于显示背景和逐帧动画。2.实现示例6.1.2逐帧动画1<LinearLayout水平线性布局设置两个按钮2android:orientation="horizontal"3android:layout_width="match_pare
nt"4android:layout_height="wrap_content"5android:gravity="center">6<Button“动画开始”按钮7android:id="@+id/start"8android:layout_width="wrap_conten
t"9android:layout_height="wrap_content"10android:text="@string/start"/>11<Button“动画停止”按钮12android:id="@+id/stop"13android:layo
ut_width="wrap_content"14android:layout_height="wrap_content"15android:text="@string/stop"/>16</LinearLayout>17<ImageView18andr
oid:id="@+id/animImg"19android:layout_width="wrap_content"20android:layout_height="wrap_content"21android:backgrou
nd="@drawable/grass"设置草地为背景图片22android:scaleType="center"设置图片的缩放类型23android:src="@anim/horse"/>逐帧动画为马的奔跑布局文件:activity_main.xml2.实现示例6.1.2逐帧动画1final
Buttonstart=(Button)findViewById(R.id.start);2finalButtonstop=(Button)findViewById(R.id.stop);3finalImageViewanimImg=
(ImageView)findViewById(R.id.animImg);4finalAnimationDrawableanim=(AnimationDrawable)animImg.getDrawable();获取逐帧动画
的AnimationDrawable对象5start.setOnClickListener(newOnClickListener(){为“动画开始”按钮添加单击事件处理6publicvoidonCli
ck(Viewv){7anim.start();开始动画8}9});10stop.setOnClickListener(newOnClickListener(){为“动画停止”按钮添加单击事件处理11publicvoidonClick(Viewv){
12anim.stop();停止动画13}14});两个按钮代码所在文件:/Bitmap_AnimationTest/src/com/example/bitmap_animationtest/MainActivity.java2.实现示例6.1.2逐帧动画该程序在
使用android:src="@anim/horse"引用逐帧动画如果无需草地背景,也可以使用android:background="@anim/horse“将逐帧动画作为背景显示,在代码中将“finalAnimationDrawableanim=(Animation
Drawable)img.getDrawable();”改为“finalAnimationDrawableanim=(AnimationDrawable)img.getBackground();”。首先
在界面布局中添加ToggleButton控件。6.1.3示例讲解要实现示例的在简单图片和逐帧动画界面中进行切换功能,需要利用ToggleButton控件。1<ToggleButton2android:id="@+i
d/change"3android:layout_width="wrap_content"4android:layout_height="wrap_content"5android:layout_gravity="center_horizontal"6android:textOn
="@string/anim"→状态为on时显示的文本为“切换到逐帧动画”7android:textOff="@string/bitmap"→状态为off时显示的文本为“切换到简单图片”8android:checked="true
"/>→设置初始状态为on然后在代码中为ToggleButton添加一个状态改变的监听器,状态为on时显示简单图片的界面,状态为off时显示逐帧动画的界面。6.1.3示例讲解该示例完整的代码请参考co
des\chapter09\Bitmap_AnimationTest