android项目课程的设计与实施国培_第1页
android项目课程的设计与实施国培_第2页
android项目课程的设计与实施国培_第3页
android项目课程的设计与实施国培_第4页
android项目课程的设计与实施国培_第5页
已阅读5页,还剩70页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Android项目课程的设计与实施图形和动画图形与动画

-inAndroid内容Android图形系统概述Adnroid动画处理Frame动画Tween动画Property动画第11章Android图形图像1、Android访问图片2、Android动画3、Android动态图像绘制4、Android图形特效5、Android与OpenGLESAndroid处理图形的能力非常强大,对于2D图形的处理不使用JavaAPI处理,Android系统定义了一系列处理2D图形的处理类,这些类分别位于android.graphics、android.graphics.drawbable.shapes和android.view.animation包中。对于3D图形的处理Android使用OPenGLES,这些类位于javax.microedition.khronos.opengles和android.opengl包中。Android系统中图形大体上分两类,一是静态图形的处理,也就是不经常变化的图片,如icon、logo、动画等。对于这种类型的图片通过各种Drawable类来处理,这种方式一般是将图片放在res/drawable目录或者res/animation目录中。对于动态图片(大小、位置格式经常变化的图片),一般采用不断的重新绘制绘制的方式来处理,例如游戏中场景、角色和道具等。Android图形系统概述Android中的图形系统采用Client/Server架构。SurfaceFlinger在整个图形系统中担任server角色,它负责将各个surface根据Zorder合成(composer)起来。负责Surface的建立、控制、管理等功能。Surface在Android中的本意是提供一个供显示使用的界面,其他程序可以在这个界面上进行显示输出。Surface系统可以实现多层的Surface,这样对于每一个程序调用者,都可以认为是在独有的界面上进行绘制;而多层次的叠加和管理,则由Surface系统来完成。View及其子类(如TextView,Button,ImageView)要画在surface上。每个surface创建一个Canvas对象,用来管理view在surface上的绘图操作,如画点画线。每个canvas对象对应一个bitmap,存储画在surface上的内容。Copyright2010ByNeusoftGroup.AllrightsreservedAndroid图形系统概述Skia是Google一个底层的图形,图像,动画,SVG,文本等多方面的图形库,它是Android中图形系统的引擎。最主要的API是SkCanvas类。Android图形系统概述对于2D图形处理,Android并没有使用Java的图形处理类,而是自定义了一系列的2D图形处理类,这些类分别位于android.graphics,android.graphics.drawable.shapes和android.view.animation包中。对于3D图形的处理,Android集成了OpenGLES提供的高效3D图形处理技术,这些类分别位于javax.microedition.khronos.opengles和android.opengl包中。Copyright2010ByNeusoftGroup.AllrightsreservedAndroid图形系统概述Android系统中的图形处理基本上可以分为两类:一类是静态图形处理,也就是这些图片不经常变化,例如,一些图标,logo等,针对这些图形的处理,一般是将图形作为资源文件添加到工程当中,然后通过各种Drawable类来处理使用。另一类是动态图形处理,也就是这些图片要经常变化(包括大小,位置,形状等)需要不断地进行绘制。例如翻书效果。Android动画处理现有的Android动画框架是建立在View的级别上的。要了解Android动画是如何画出来的,我们首先要了解Android的View是如何组织在一起,以及他们是如何画自己的内容的。Android动画处理DecorView是window的Top-levelView,称之为主View。是整个ViewTree的根节点。DecorView会缺省的attach到Activity的主窗口中。ViewRoot不是View,它本质上是一个Handler,ViewRoot是建立主View与WindowsManger通讯的桥梁。Android动画处理Android动画处理递归的绘制整个窗口需要按顺序执行以下几个步骤绘制背景如果需要,保存画布(canvas)的层(Layer),为淡入或淡出做准备;绘制View本身的内容,通过调用View.onDraw(canvas)函数实现.绘制自己的孩子(通常也是一个view系统),通过dispatchDraw(canvas)实现,参看ViewGroup.Java中的代码可知,dispatchDraw->drawChild->child.draw(canvas)这样的调用过程被用来保证每个子View的draw函数都被调用,通过这种递归调用从而让整个View树中的所有View的内容都得到绘制。在调用每个子View的draw函数之前,需要绘制的View的绘制位置是在Canvas通过translate函数调用来进行切换的,窗口中的所有View是共用一个Canvas对象如果需要,绘制淡入淡出相关的内容并恢复保存的画布所在的层(layer)绘制修饰的内容(例如滚动条).备注:当一个ChildView要重画时,它会调用其成员函数invalidate()函数将通知其ParentView这个ChildView要重画,这个过程一直向上遍历到ViewRoot,当ViewRoot收到这个通知后就会调用上面提到的ViewRoot中的draw函数从而完成绘制。Android使用访问图片创建Drawable对象Android在访问图片时,使用Drawable类及其子类BitmapDrawable、ColorDrawable、ShapeDrawable等类处理,关于Drawable类的初始化有三种方式,一是使用在工程中保存的图片;二是使用xml定义Drawable属性;三是使用构造器来完成,但这种方法不经常被采纳。使用图片创建Drawable对象,在资源文件中保存一图片文件test.jpg,然后通过R.drawable.test使用该图片,代码如下:ImageViewimgv=(ImageView)findViewById(R.id.imgv);imgv.setImageResource(R.drawable.test);也可以使用xml文件定义Drawable对象例如:在AndroidManifest.xml文件中定义应用的图标:<applicationandroid:icon=@drawable/icon.........在布局文件中定义一个ImageView时指定Drawable对象<ImageViewandroid:id="@+id/imgv"android:layout_width="fill-parent"android:layout_height="wrap_content"android:src="@drawable/test"/>Bitmap和BitmapFactory如果图片是保存在SD卡中,就需要Bitmap和BitmapFactory两个类来读取SD卡中的文件例如:publicclassMainActivityextendsActivity{/**Calledwhentheactivityisfirstcreated.*/@OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);//setContentView(R.layout.main);Stringpath="/sdcard/bg.png";Bitmapbm=BitmapFactory.decodeFile(path);ImageViewiv=newImageView(this);iv.setImageBitmap(bm);this.setContentView(iv);

}}

Android中的动画Tween动画Tween动画可以使视图组件移动、放大、缩小,以及产生透明的变化。例如在一个ImageView组件中,通过Tween动画可以使该视图实现放大、缩小、旋转、渐变等效果。Tween动画相关的类在android.view.animation包中,如:(1)Animation:抽象类,其他几个动画类继承自该类(2)ScaleAnimation类:控制尺寸变化的动画类(3)AlphaAnimation:控制透明变化的动画类(4)RotateAnimation:控制旋转变化的动画类(5)TranslateAnimation:控制移动变化的动画类(6)AnimationSet:定义动画属性集合类(7)AnimationUtils:动画的工具类总之,Tween动画一共有4种形式,具体如下:1、Alpha(渐变动画)实现类:AlphaAnimation常用构造器:AlphaAnimation(floatfromAlpha,float,toAlpha)常用构造器参数说明:fromAlpha:动画开始的透明度,toAlpha:动画结束前的透明度(取值范围是0.0~1.0)2、Scale(尺寸变化动画)实现类:ScaleAnimation常用构造器:ScaleAnimation(floatfromX,floattoX,floatfromY,floattoY,intpivotXtype,floatpivotXValue,intpivotYType,floatpivotYValue)常用构造器参数说明:fromX:起始X坐标上的伸缩尺寸toX:结束X坐标上的伸缩尺寸fromY:起始Y坐标上的伸缩尺寸toY:结束Y坐标上的伸缩尺寸pivotXType:在X轴上的伸缩模式,(取值有:Animation.ABSOLUTE、Animation.RELATIVE_TO_SELF、Animation.RELATIVE_TO_PARENT)pivotXValue:相对于X坐标的伸缩值pivotYType:在Y轴上的伸缩模式,(取值有:Animation.ABSOLUTE、Animation.RELATIVE_TO_SELF、Animation.RELATIVE_TO_PARENT)pivotYValue:相对于Y坐标的伸缩值3、Translate(位置变化动画):实现类:TranslateAnimation常用构造器:TranslateAnimation(floatfromXData,floattoXAata,floatfromYData,floattoYData)常用构造器参数说明:fromXData:起始X坐标toXData:结束X坐标fromYData:起始Y坐标toYData:结束Y坐标4、Rotate(旋转变化动画):实现类:RotateAnimation常用构造器:RotateAnimation(floatfromDegrees,floattoDegrees,intpivotXtype,floatpivotXValue,intpivotYType,floatpivotYValue)常用构造器参数说明:fromDegrees:起始旋转角度;toDegrees:结束旋转角度pivotXType:在X轴上的伸缩模式,(取值有:Animation.ABSOLUTE、Animation.RELATIVE_TO_SELF、Animation.RELATIVE_TO_PARENT)pivotXValue:相对于X坐标的伸缩值pivotYType:在Y轴上的伸缩模式,(取值有:Animation.ABSOLUTE、Animation.RELATIVE_TO_SELF、Animation.RELATIVE_TO_PARENT)pivotYValue:相对于Y坐标的伸缩值缩放效果截图

渐变效果截图

移动效果截图旋转效果截图

publicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);yixiu=(ImageView)findViewById(R.id.yixiu);yixiu.setVisibility(View.INVISIBLE);bs=(Button)findViewById(R.id.bs);ba=(Button)findViewById(R.id.ba);bt=(Button)findViewById(R.id.bt);br=(Button)findViewById(R.id.br);bs.setOnClickListener(this);ba.setOnClickListener(this);bt.setOnClickListener(this);br.setOnClickListener(this);

}@OverridepublicvoidonClick(Viewarg0){//TODOAuto-generatedmethodstubAnimationanimation=null;intid=arg0.getId();

switch(id){caseR.id.bs:yixiu.setVisibility(View.VISIBLE);animation=newScaleAnimation(0f,1f,0f,1f,Animation.RELATIVE_TO_SELF,2f,Animation.RELATIVE_TO_SELF,2f);animation.setDuration(3000);yixiu.setAnimation(animation);break;caseR.id.ba:yixiu.setVisibility(View.VISIBLE);animation=newAlphaAnimation(0.1f,1.0f);;animation.setDuration(3000);yixiu.setAnimation(animation);break;caseR.id.bt:yixiu.setVisibility(View.VISIBLE);animation=newTranslateAnimation(10,10,10,100);animation.setDuration(3000);yixiu.setAnimation(animation);break;caseR.id.br:yixiu.setVisibility(View.VISIBLE);animation=newRotateAnimation(0f,-1880f,Animation.RELATIVE_TO_SELF,0.8f,Animation.RELATIVE_TO_SELF,0.8f);animation.setDuration(8000);yixiu.setAnimation(animation);break;}}

除了通过以上“硬编码”实现Tween动画的4种效果外,还可以使用“软编码”即使用xml配置文件的方式来实现,这个xml文件在rs/anim目录中,这种方式是Android推荐使用的方式。首先定义各种动画xml文件1、myscale.xml<setxmlns:android=""><scaleandroid:fromXScale="0.0"android:toXScale="1.0"android:fromYScale="0.0"android:toYScale="1.0"android:pivotX="50%"android:pivotY="50%"android:duration="5000"/></set>

2、myalpha.xml<setxmlns:android=""><alphaandroid:fromAlpha="0.1"android:toAlpha="1.0"android:duration="5000"/></set>3、myrotate.xml<setxmlns:android=""><rotateandroid:fromDegrees="0"android:toDegrees="180"android:pivotX="50%"android:pivotY="50%"android:duration="5000"/></set>4、mytrans.xml<setxmlns:android=""><translateandroid:fromXDelta="10"android:toXDelta="100"android:fromYDelta="10"android:toYDelta="100"android:duration="5000"/></set>然后修改MainActivity.java中的代码:caseR.id.bs:yixiu.setVisibility(View.VISIBLE);AnimationsAnimation=AnimationUtils.loadAnimation(MainActivity.this,R.anim.myscale);yixiu.startAnimation(sAnimation);break;caseR.id.ba:yixiu.setVisibility(View.VISIBLE);AnimationaAnimation=AnimationUtils.loadAnimation(MainActivity.this,R.anim.myalpha);yixiu.startAnimation(aAnimation);break;caseR.id.bt:yixiu.setVisibility(View.VISIBLE);AnimationtAnimation=AnimationUtils.loadAnimation(MainActivity.this,R.anim.mytrans);yixiu.startAnimation(tAnimation);break;caseR.id.br:yixiu.setVisibility(View.VISIBLE);AnimationrAnimation=AnimationUtils.loadAnimation(MainActivity.this,R.anim.myroate);yixiu.startAnimation(rAnimation);break;运行结果同上例完全一致。Frame动画Frame动画是顺序播放图片来产生的一种动画效果类似于电影。例如要实现一个人走路的动画效果,可以通过3张图片实现:第一张是两脚着地;第二张是左脚着地;第三张是右脚着地。这样顺序播放就形成了人走路的动画了。Frame动画是通过AnimationDrawable类实现的。该类中有两个重要的方法是start()和stop(),分别用来开始和停止动画。动画一般是通过xml配置文件来进行配置的。在res/anim目录中定义xml文件,该文件的根元素是<animation-list>,子元素是<item>,子元素可以有多个。frame_anim.xml文件内容如下:<animation-listxmlns:android=""android:oneshot="true"><itemandroid:drawable="@drawable/bugbear3_1"android:duration="500"/><itemandroid:drawable="@drawable/bugbear3_2"android:duration="500"/><itemandroid:drawable="@drawable/bugbear3_3"android:duration="500"/><itemandroid:drawable="@drawable/bugbear3_4"android:duration="500"/></animation-list>Frame动画截图代码如下:<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android=""android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent"android:background="#fff"android:gravity="center_vertical"><ImageViewandroid:id="@+id/iamgeView"android:layout_width="wrap_content"android:layout_height="wrap_content"android:background="@anim/frame_anim“/></LinearLayout>publicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);imageView=(ImageView)findViewById(R.id.iamgeView);ad=(AnimationDrawable)imageView.getBackground();

}@OverridepublicbooleanonCreateOptionsMenu(Menumenu){menu.add(0,0,0,"开始");menu.add(0,1,1,"停止");returntrue;}@OverridepublicbooleanonOptionsItemSelected(MenuItemitem){switch(item.getItemId()){case0:Animationanimation=newTranslateAnimation(10,100,10,10);animation.setDuration(6000);ad.start();imageView.startAnimation(animation);break;case1:ad.stop();break;}returntrue;}动态图形绘制动态图形绘制的基本思路是,创建一个View类或者SurfaceView类,重写onDraw()方法,使用Canvas对象在界面上绘制不同图形,使用invalidate()方法刷新界面。动态绘制图形的常见类有Canvas、Paint、Color、Path等。1、Canvas类:Canvas类是画布,提供了各种图形的绘制方法,如矩形、圆、椭圆、点、线、文字等。具体方法见下表方法名称方法描述drawText(Stringtext,floatx,floaty,Paintpaint)画文本drawPoint(floatx,floaty,Paintpaint)画点drawLine(floatstartX,floatstartY,floatsoptX,floatstopY,Paintpaint)画线drawCircle(floatcx,floatcy,flaotradius,Paintpaint)画圆drawOval(rectFoval,paintpaint)画椭圆drawRect(rectFrect,paintpaint)画矩形drawRoundRect(rectFrect,floatrx,floatry,paintpaint)圆角矩形clipRect(floatleft,floattop,floatright,floatbottom)裁剪矩形clipRegion(Regionregion)裁剪区域2、Paint类:Paint类是画笔,用来描述图形的颜色和风格,如线宽、颜色、字体等信息。Paint类常用方法如下:方法名称方法描述Paint()构造方法setColor(intcolor)设置颜色setStrokeWidth(floatwidth)设置线宽setTextAlign(Paint.Alignalign)设置文字对齐setTextSize(floattextSize)设置文字尺寸setShader(Shadershader)设置渐变setAlpha(inta)设置alpha值reset()复位Paint默认设置3、Color类:Color类中定义了一些颜色常量和创建颜色的方法,颜色定义使用RGB定义,如下表:颜色属性名称描述BLACK黑色BLUE蓝色CYAN青色DKGRAY深灰色GRAY灰色GREEN绿色LIGRAY浅灰色MAGENTA紫色RED红色TRANSSARENT透明WHITE白色YELLOW黄色4、Path类:一般用来从某个点移动到另一个点连线,例如画梯形需要有点和连线,常使用的方法如下:方法名称方法描述lineTo(floatx,floaty)从最后点到指定点画线moveTo(floatx,floaty)移动到某一点reset()复位5、Shader类及其子类:用来渲染图像使用的类,子类有BitmapShader、ComposeShader、LinearGradient、RadialGradient、SweepGradient。各个类的用法参照SDKdoc。实例1:飞舞的小球,在这个例子中,通过自定义View,并继承View类,通过多线程机制不断的绘制并刷新,实现小球飞舞的情景。如图所示代码如下:classMyViewextendsViewimplementsRunnable{//图形当前坐标privateintx=20,y=20;//坐标控制开关booleanflagy=true;booleanflagx=true;//构造方法publicMyView(Contextcontext,AttributeSetattrs){super(context,attrs);//获得焦点setFocusable(true);//启动线程newThread(this).start();}publicvoidrun(){while(!Thread.currentThread().isInterrupted()){MyView.this.update();try{Thread.sleep(10);}catch(InterruptedExceptione){e.printStackTrace();}}}@OverrideprotectedvoidonDraw(Canvascanvas){super.onDraw(canvas);//实例化画笔Paintp=newPaint();//设置画笔颜色p.setColor(Color.WHITE);//画圆canvas.drawCircle(x,y,20,p);MyView.this.postInvalidate();}//更新坐标privatevoidupdate(){inth=getHeight();intw=getWidth();if(x==w-20)flagx=false;if(y==h-20)flagy=false;if(x==20)flagx=true;if(y==20)flagy=true;if(flagy)y+=5;if(!flagy)y-=5;if(flagx)x+=5;if(!flagx)x-=5;}}publicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);MyViewv=newMyView(this,null);setContentView(v);

}

}实例2:Canvas、Paint、Shader类综合应用publicclassMyViewextendsView{publicMyView(Contextcontext){super(context);}@OverrideprotectedvoidonDraw(Canvascanvas){//TODOAuto-generatedmethodstubsuper.onDraw(canvas);//设置画布颜色canvas.drawColor(Color.WHITE);Paintpaint=newPaint();//去除锯齿paint.setAntiAlias(true);paint.setColor(Color.RED);//设置样式paint.setStyle(Paint.Style.STROKE);//设置画笔粗细paint.setStrokeWidth(3);//画圆canvas.drawCircle(40,40,30,paint);//画矩形canvas.drawRect(10,90,70,150,paint);canvas.drawRect(10,170,70,200,paint);//声明矩形区域RectFre=newRectF(10,220,70,250);//画椭圆canvas.drawOval(re,paint);//实例化PathPathpath=newPath();path.moveTo(10,330);path.lineTo(70,330);path.lineTo(40,270);path.close();canvas.drawPath(path,paint);Pathpath1=newPath();path1.moveTo(10,410);path1.lineTo(70,410);path1.lineTo(55,350);path1.lineTo(25,350);path1.close();canvas.drawPath(path1,paint);paint.setStyle(Paint.Style.FILL);paint.setColor(Color.BLUE);//画圆canvas.drawCircle(120,40,30,paint);//画矩形canvas.drawRect(90,90,150,150,paint);canvas.drawRect(90,170,150,200,paint);//声明矩形区域RectFre2=newRectF(90,220,150,250);//画椭圆canvas.drawOval(re2,paint);//实例化PathPathpath2=newPath();path2.moveTo(90,330);path2.lineTo(150,330);path2.lineTo(120,270);path2.close();canvas.drawPath(path2,paint);Pathpath3=newPath();path3.moveTo(90,410);path3.lineTo(150,410);path3.lineTo(135,350);path3.lineTo(105,350);path3.close();canvas.drawPath(path3,paint);ShaderlShader1=newLinearGradient(0,0,100,100,newint[]{Color.RED,Color.GREEN,Color.BLUE,Color.YELLOW},null,Shader.TileMode.REPEAT);ShaderlShader2=newLinearGradient(0,0,100,100,Color.RED,Color.GREEN,Shader.TileMode.MIRROR);ShadersShader1=newSweepGradient(0,0,newint[]{Color.RED,Color.GREEN,Color.BLUE,Color.YELLOW},null);ShadersShader2=newSweepGradient(0,0,Color.RED,Color.GREEN);paint.setShader(lShader1);//画圆canvas.drawCircle(200,40,30,paint);//画矩形canvas.drawRect(170,90,230,150,paint);canvas.drawRect(170,170,230,200,paint);//声明矩形区域RectFre3=newRectF(170,220,230,250);//画椭圆canvas.drawOval(re3,paint);//实例化PathPathpath4=newPath();path4.moveTo(170,330);path4.lineTo(230,330);path4.lineTo(200,270);path4.close();canvas.drawPath(path4,paint);Pathpath5=newPath();path5.moveTo(170,410);path5.lineTo(230,410);path5.lineTo(215,350);path5.lineTo(185,350);path5.close();canvas.drawPath(path5,paint);paint.reset();paint.setColor(Color.BLACK);paint.setTextSize(24);canvas.drawText("圆形",240,50,paint);canvas.drawText("正方形",240,120,paint);canvas.drawText("长方形",240,190,paint);canvas.drawText("椭圆形",240,250,paint);canvas.drawText("三角形",240,320,paint);canvas.drawText("梯形",240,390,paint);}}publicclassMainActivityextendsActivity{/**Calledwhentheactivityisfirstcreated.*/@OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(newMyView(this));

}}图形特效使用Matrix实现旋转平移和缩放在Android系统中Matrix类是一个矩阵,该类中有一个3*3的矩阵坐标,通过该类可以实现旋转、平移和缩放的综合应用。使用reset()方法初始化矩阵,使用setScale()设置缩放属性,setTranslate()设置平移属性,setRotate()设置旋转属性。publicclassMyViewextendsView{privateBitmapbitmap=null;privateMatrixmatrix=newMatrix();privatefloatangle=0.0f;privateintwidth;privateintheight;privatefloatscale=1.0f;privatebooleanisScale=false;publicMyView(Contextcontext){super(context);bitmap=BitmapFactory.decodeResource(this.getResources(),R.drawable.yixiu);width=bitmap.getWidth();height=bitmap.getHeight();this.setBackgroundColor(Color.WHITE);this.setFocusable(true);}@OverrideprotectedvoidonDraw(Canvascanvas){super.onDraw(canvas);matrix.reset();if(!isScale){matrix.setRotate(angle);}else{matrix.setScale(scale,scale);}Bitmapbm=Bitmap.createBitmap(bitmap,0,0,width,height,matrix,true);canvas.drawBitmap(bm,matrix,null);}publicbooleanonKeyDown(intkeyCode,KeyEventevent){if(keyCode==KeyEvent.KEYCODE_DPAD_LEFT){angle++;this.postInvalidate();}if(keyCode==KeyEvent.KEYCODE_DPAD_RIGHT){isScale=false;angle--;this.postInvalidate();}if(keyCode==KeyEvent.KEYCODE_DPAD_UP){isScale=true;scale+=0.1f;this.postInvalidate();}if(keyCode==KeyEvent.KEYCODE_DPAD_DOWN){isScale=true;scale-=0.1f;this.postInvalidate();}returnsuper.onKeyDown(keyCode,event);}}Android动画处理一种是Tween动画,这种实现方式可以使视图组件平移、缩放、旋转以及产生透明度的变化;另外一种是Frame动画,这是一种传统的动画方法,通过顺序播放排放好的图片来实现。Copyright2010ByNeusoftGroup.Allrightsreserved在android系统中提供了两种动画实现方式:Frame动画Frame动画是通过android.graphics.drawable.AnimationDrawable类来实现的,在该类中保存了帧序列以及显示的时间,为了简化动画的创建,Android提供了一种通过XML来创建逐帧动画的方式,这样把动画的创建和代码分来以后如果需要修改动画内容,只需要修改资源文件就可以了不用修改代码,简化开发维护工作。Frame动画在res/drawable/文件夹下创建一个XML文件animation1,定义ImageView的drawable资源animation-list。通过animation-list指定这是个AnimationDrawable动画定义,里面的item来指定每帧图片和显示时间(单位为毫秒),帧显示的顺序就是item定义的顺序。如果android:oneshot设置为true表明该动画只播放一次,否则该动画会循环播放。这些设置也可以通过AnimationDrawable提供的函数来设置ImageView通过android:src="@drawable/animation1"引用了前面定义的AnimationDrawable。通过getDrawable接口取得AnimationDrawable对象。需要执行动画播放时,调用AnimationDrawable的start方法。stop用来停止动画的播放。Tween动画创建一个类继承View类。覆写onDraw()方法,使用Canvas对象在界面上绘制不同的图形,使用invalidate()方法刷新新界面。Android动画就是通过ParentView来不断调整ChildView的画布(Canvas)坐标系来实现的.Copyright2010ByNeusoftGroup.Allrightsreserved因此,在现有的机制下,动态调整坐标是实现动画效果的关键。对于改变坐标,Android通常使用仿射变换矩阵(AffineTransformationMatrix)来实现。Tween动画通过对View的内容完成一系列的图形变换(包括平移、缩放、旋转、改变透明度)来实现动画效果。Tween动画平移变换缩放变换错切变换旋转变换AffineTransformation是一种二维坐标到二维坐标之间的线性变换,保持二维图形的“平直性”(即变换后直线还是直线不会打弯,圆弧还是圆弧)和“平行性”(指保二维图形间的相对位置关系不变,平行线还是平行线,相交直线的交角不变。)。仿射变换Tween动画矩阵变换Tween动画矩阵变换Tween动画[10tx][01ty][001]平移变换缩放变换[cosA-sinA0][sinAcosA0][001][sx00][0sy0][001][1shx0][shy10][001]旋转变换(围绕原点)‏错切变换矩阵变换Tween动画Matrix的操作,总共分为translate(平移),rotate(旋转),scale(缩放)和skew(倾斜)四种。每一种变换在Android的API里都提供了set,post和pre三种操作方式,除了translate,其他三种操作都可以指定中心点。set是直接设置Matrix的值,每次set一次,整个Matrix的数组都会变掉。post是后乘,当前的矩阵乘以参数给出的矩阵。pre是前乘,参数给出的矩阵乘以当前的矩阵。所以操作是在当前矩阵的最前面发生的。Android矩阵应用Tween动画例如:要将一个图片旋转30度(绕原点),然后平移到(100,100)的地方。Paintpaint=newPaint();paint.setAntiAlias(true);Matrixm=newMatrix();m.postRotate(30);m.postTranslate(100,100);canvas.drawBitmap(bitmap,matrix,paint);或者Paintpaint=newPaint();paint.setAntiAlias(true);Matrixm=newMatrix();m.setTranslate(100,100);m.preRotate(30);canvas.drawBitmap(bitmap,matrix,paint);Android矩阵应用Album实例---实训这是一个通过调用系统相机实现拍照功能,拍照之后直接进入照片浏览,可以继续拍照也可以退出的小应用。如下图所示:publicclassMainActivityextendsActivity{/**Calledwhentheactivityisfirstcreated.*/privateStringlogTag="Exception";@OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);try{Intentintent=newIntent(MediaStore.ACTION_IMAGE_CAPTURE);startActivityForResult(intent,0);}catch(Exceptione){Log.v(logTag,e.getMessage());}

}protectedvoidonActivityResult(intrequestCode,intresultCode,Intentdata){try{if(requestCode!=0){return;

}super.onActivityResult(requestCode,resultCode,data);Bundleextras=data.getExtras();Bitmapb=(Bitmap)extras.get("data");Intentintent=newIntent();intent.setClass(this,ShowImageActivity.class);intent.putExtra("image",b);this.startActivity(intent);}catch(Exceptione){//TODO:handleexceptionLog.v(logTag,e.getMessage());}

}}publicstaticfinalStringMIME_TYPE_IMAGE_JPEG="image/jpeg";publicstaticfinalintACTIVITY_GET_IMAGE=0;publicstaticfinalStringFILE_NAME="name";publicstaticfinalStringFILE_TYPE="type";publicstaticfinalStringFILE_BITS="bits";publicstaticfinalStringFILE_OVERWRITE="overwrite";publicstaticfinalStringFILE_URL="url";privatebyte[]mContent;@OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.showimage);IntentgetImage=newIntent(Intent.ACTION_GET_CONTENT);getImage.addCategory(Intent.CATEGORY_OPENABLE);getImage.setType(MIME_TYPE_IMAGE_JPEG);startActivityForResult(getImage,ACTIVITY_GET_IMAGE);

}@OverrideprotectedvoidonActivityResult(intrequestCode,intresultCode,Intentdata){if(resultCode!=RESULT_OK){return;

}Bitmapbm=null;ContentResolverresolver=getContentResolver();if(requestCode==ACTIVITY_GET_IMAGE){try{ UrioriginalU

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论