1+x安卓应用开发(中级)课程-项目2 多媒体技术应用_第1页
1+x安卓应用开发(中级)课程-项目2 多媒体技术应用_第2页
1+x安卓应用开发(中级)课程-项目2 多媒体技术应用_第3页
1+x安卓应用开发(中级)课程-项目2 多媒体技术应用_第4页
1+x安卓应用开发(中级)课程-项目2 多媒体技术应用_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

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

文档简介

《腾讯1+x安卓应用开发(中级)》教案

一、教案设计课题项目2任务1图形的绘制课型理论课理论课时1课时实践课时2课时教学目标知识目标能力(技能)目标掌握图形绘制的常用类和方法能够掌握安卓平台下图形的绘制。教学重点图形的绘制方法。教学难点图形绘制的常用类和方法的灵活使用教学内容Android界面中可以绘制各种图形,其中主要涉及4个类,分别是View、Canvas、Paint和Color。1.View类在Android中绘制图形需要在Canvas上进行,而使用Canvas需要使用View.onDraw()方法完成绘制工作,因此,需要定义一个android.view包中的View类的子类,然后复写onDraw()方法。格式如下。classMyViewextendsView{@OverrideprotectedvoidonDraw(Canvascanvas){}}2.Canvas类Canvas类相当于画布,定义在android.graphics包中,它给我们提供了一套画图API,常用的方法如下。(1)publicvoiddrawBitmap(Bitmapbitmap,floatleft,floattop,Paintpaint)表5-1drawBitmap方法参数介绍drawBitmap的作用:绘制位图bitmap要绘制的位图,此值不能为null。left正在绘制的位图左侧的位置。top正在绘制的位图顶部的位置。paint用于绘制位图的画笔,此值可能是null。(2)publicvoiddrawCircle(floatcx,floatcy,floatradius,Paintpaint)表5-2drawCircle方法参数介绍drawCircle的作用:绘制圆形cx要绘制的圆的中心的x坐标。cy要绘制的圆的中心的y坐标。radius要绘制的圆的半径。paint用来画圆的画笔,此值不能是null。(3)publicvoiddrawLine(floatstartX,floatstartY,floatstopX,floatstopY,Paintpaint)表5-3drawLine方法参数介绍drawLine的作用:绘制线条startX线条起点的x坐标。startY线条起点的y坐标。stopX线条终点的x坐标。stopY线条终点的y坐标。paint用于绘制线条的画笔,此值不能是null。(4)publicvoiddrawOval(RectFoval,Paintpaint)表5-4drawOval方法参数介绍drawOval的作用:绘制椭圆。oval要绘制的椭圆形矩形边界,这个值不能是null。paint画笔,此值不能是null。(5)publicvoiddrawPath(Pathpath,Paintpaint)表5-5drawPath方法参数介绍drawPath的作用:绘制路径path要绘制的路径,此值不能是null。paint用于绘制路径的画笔,此值不能是null。(6)publicvoiddrawPoint(floatx,floaty,Paintpaint)表5-6drawPoint方法参数介绍drawPoint的作用:绘制点x要绘制的圆的x轴。y要绘制的圆的y轴。paint画笔,此值不能是null。(7)publicvoiddrawText(Stringtext,floatx,floaty,Paintpaint)表5-7drawText方法参数介绍drawText的作用:绘制文本text拟绘制的文本,此值不能是null。x正在绘制的文本的x坐标y正在绘制的文本的y坐标paint画笔,此值不能是null。3.Paint类Paint类相当于画笔,定义在android.graphics包中,可以用来设置绘图时的颜色、字体等,常用的方法如下。(1)publicvoidsetARGB(inta,intr,intg,intb)表5-8setARGB方法参数介绍setARGB的作用:设置颜色a画笔的透明度,取值范围0-255。r画笔的红色成分,取值范围0-255。g画笔的绿色成分,取值范围0-255。b画笔的蓝色成分,取值范围0-255。(2)publicvoidsetAlpha(inta)表5-9setAlpha方法参数介绍setAlpha的作用:设置透明的a画笔的透明度,取值范围0-255。(3)publicvoidsetAntiAlias(booleanaa)表5-10setAntiAlias方法参数介绍setAntiAlias的作用:设置抗锯齿aa值为true时,消除锯齿值为false时,保留锯齿(4)publicvoidsetColor(intcolor)表5-11setColor方法参数介绍setColor的作用:设置颜色color画笔的颜色,Android内部定义有Color类,包含了一些常见颜色定义。(5)publicvoidsetStyle(Paint.Stylestyle)表5-12setStyle方法参数介绍setStyle的作用:设置绘制风格stylePaint.Style.FILL:填充内部Paint.Style.FILL_AND_STROKE:填充内部和描边Paint.Style.STROKE:仅描边(6)publicvoidsetTextAlign(Paint.Alignalign)表5-13setTextAlign方法参数介绍setTextAlign的作用:设置文本对齐方式alignPaint.Align.LEFT:左对齐Paint.Align.CENTER:居中对齐Paint.Align.RIGHT:右对齐(7)publicvoidsetTextScaleX(floatscaleX)表5-14setTextScaleX方法参数介绍setTextScaleX的作用:设置文本水平方向缩放比例scaleX文本水平方向的绘制比例。默认值为1.0。值>1.0将放大。值<1.0将缩小。(8)publicvoidsetTextSize(floattextSize)表5-15setTextSize方法参数介绍setTextSize的作用:设置文本大小textSize文本大小,以像素为单位。此值必须为>0。(9)publicTypefacesetTypeface(Typefacetypeface)表5-16setTypeface方法参数介绍setTypeface的作用:设置文本样式typefaceTypeface.BOLD为粗体,Typeface.BOLD_ITALIC为粗斜体,Typeface.ITALIC为斜体,Typeface.NORMAL为正常。(10)publicvoidsetUnderlineText(booleanunderlineText)表5-17setUnderlineText方法参数介绍setUnderlineText的作用:设置下划线文字underlineText值为true时,设置下划线。值为false时,取消下划线。4.Color类Color类在android.graphics包中。定义了很多常量的颜色值,可以通过Color.***使用。典型的颜色值如下。publicstaticfinalintBLACK=-16777216;//黑色publicstaticfinalintBLUE=-16776961;//蓝色publicstaticfinalintCYAN=-16711681;//青色publicstaticfinalintGRAY=-7829368;//灰色publicstaticfinalintGREEN=-16711936;//绿色publicstaticfinalintRED=-65536;//红色publicstaticfinalintTRANSPARENT=0;//透明色publicstaticfinalintWHITE=-1;//白色publicstaticfinalintYELLOW=-256;//黄色Color类还定义了一些静态方法,如下所示。publicstaticintalpha(intcolor))//透明度分量publicstaticintred(intcolor))//红色分量publicstaticintgreen(intcolor))//绿色分量publicstaticintblue(intcolor)//蓝色分量publicstaticintrgb(intred,intgreen,intblue)//由红绿蓝三原色组成的颜色值publicstaticintargb(intalpha,intred,intgreen,intblue)//由透明度和红绿蓝三原色组成的颜色值教学准备教材,PPT、教纲、教案参考资料/教学过程方法与手段教学备注【课堂导入】常见的二维图形在Android中是如何绘制的呢?AndroidAPI提供一系列进行2D绘图的方法,这些方法放置在android.graphics包下,graphics中包括了Canvas、Paint、Color、Bitmap等类,具有绘制点、线、颜色、2D几何图形、图像处理等功能。【教学实施】5.1.1任务描述利用Canvas、Paint和Color等类绘制如图所示的指南针表盘。5.1.2问题引导常见的二维图形在Android中是如何绘制的呢?AndroidAPI提供一系列进行2D绘图的方法,这些方法放置在android.graphics包下,graphics中包括了Canvas、Paint、Color、Bitmap等类,具有绘制点、线、颜色、2D几何图形、图像处理等功能。5.1.3知识准备View类的作用Canvas类的常用方法Paint类的常用方法Color类定义的常量颜色值和静态方法5.1.4完成指南针表盘的绘制5.1.5知识拓展利用Canvas类提供的不同方法绘制出不同的图形利用Bitmap、BitmapFactory和Matrix对图形图像进行处理【知识(技能)巩固练习】分别绘制出矩形、圆形和三角形。【教学小结】讲授、演示课后作业与训练完成项目2课后练习对应的习题。教学反思

课题项目2任务2属性动画的实现课型理论课理论课时2课时实践课时2课时教学目标知识目标能力(技能)目标理解属性动画的实现原理能够掌握安卓平台下属性动画的实现。教学重点属性动画的实现方法。教学难点属性动画的实现原理教学内容属性动画的实现机制是通过对目标对象进行赋值并修改其属性来实现的。例如修改目标对象的alpha属性值,可以实现透明度的变化;修改目标对象的rotation属性值可以实现旋转角度的变化。ValueAnimator是整个属性动画机制中最核心的一个类,负责计算初始值和结束值之间的动画过渡,我们只需要将初始值和结束值提供给ValueAnimator,并告诉它动画运行的时长,ValueAnimator就会帮我们完成从初始值过渡到结束值的效果。此外,ValueAnimator还负责管理动画的播放次数、播放模式、以及对动画设置监听器等。例如,通过下面的代码可以实现将一个值从0平滑过渡到1,重复播放3次,每次播放时长是300毫秒。ValueAnimatoranim=ValueAnimator.ofFloat(0f,1f);anim.setDuration(300);//播放时长anim.setRepeatCount(3);//播放次数anim.setRepeatMode(ValueAnimator.REVERSE);//播放模式:反向播放anim.start();//开始播放ObjectAnimator是ValueAnimator的一个子类,也是我们最常接触到的类。ValueAnimator只是对值进行了一个平滑的过渡,而ObjectAnimator则可以直接对任意对象的任意属性进行动画操作。通过调用ofFloat()方法来去创建一个ObjectAnimator的实例,该方法的第一个参数用来指定动画作用的目标对象,第二个参数用来指定需要变化的是哪个属性,第三个参数是长度可变的float数据,用来指定动画变化过程中属性的值。publicstaticObjectAnimatorofFloat(Objecttarget,StringpropertyName,float...values)下面分别对透明度、旋转、缩放、平移四种属性动画进行讲解。1.透明度动画透明度动画主要通过指定目标对象的透明度在动画过程中的值,以及动画持续的时间来实现的。代码如下:ObjectAnimatoralpha=ObjectAnimator.ofFloat(imageView,"alpha",0f,1f);alpha.setRepeatCount(2);alpha.setRepeatMode(ObjectAnimator.REVERSE);alpha.setDuration(1000);alpha.start();上述代码定义了一个透明度动画,效果是,使imageView从完全透明变换到完全不透明,动画时间是1秒,并且该动画可以反向重复2次。表5-21透明度动画ofFloat()方法的参数透明度动画ofFloat()方法的参数imageView动画作用在imageView上alpha对imageView的alpha属性进行动画操作0f,1falpha属性的值从0变化到1。0表示完全都没,1表示完全不透明。此处也可以根据动画需要设置两个以上的值。setRepeatCount(2):设置动画重复次数为2次,如果设为-1,则表示重复无限次。setRepeatMode(ObjectAnimator.REVERSE):设置动画重复的方式是反向重复,如果设为ObjectAnimator.RESTART,则表示正向重复。setDuration(1000):设置动画播放时长为1000毫秒。start():开始播放动画。上述方法setRepeatCount()、setRepeatMode()、setDuration()、start()在其他属性动画中也可以使用,下面不再单独介绍。2.旋转动画旋转动画主要通过指定目标对象的旋转角度在动画过程中的值,以及动画持续的时间来实现的。代码如下:ObjectAnimatorrotation=ObjectAnimator.ofFloat(imageView,"rotation",0f,180f,0f);rotation.setRepeatCount(2);rotation.setRepeatMode(ObjectAnimator.RESTART);rotation.setDuration(1000);imageView.setPivotX(0);//指定旋转中心点的X坐标imageView.setPivotY(0);//指定旋转中心点的Y坐标rotation.start();上述代码定义了一个旋转动画,效果是,使imageView从0度旋转到180度,再旋转到0度,动画时间是1秒,并且该动画可以正向重复2次。表5-22旋转动画ofFloat()方法的参数旋转动画ofFloat()方法的参数imageView动画作用在imageView上rotation对imageView的rotation属性进行动画操作0f,180f,0frotation属性的值从0变化到180,再变化到0。0/180/90在这里指的是旋转的角度值。此处值的个数可以根据动画需要自行设置。默认情况下,旋转动画的中心点在目标对象的中心位置,如果想修改中心点,可以通过imageView.setPivotX()和imageView.setPivotY()指定旋转中心点的X坐标和Y坐标。上述代码中的imageView.setPivotX(0)和imageView.setPivotY(0),表示将imageView的左上角设置旋转中心点。3.缩放动画缩放动画主要通过指定目标对象的scaleX和scaleY两个属性在动画过程中的值,以及动画持续的时间来实现的。代码如下:AnimatorSetscale=newAnimatorSet();ObjectAnimatorscaleX=ObjectAnimator.ofFloat(imageView,"scaleX",1f,0.5f,1f);ObjectAnimatorscaleY=ObjectAnimator.ofFloat(imageView,"scaleY",1f,0.5f,1f);scale.setDuration(1000);scale.play(scaleX).with(scaleY);scale.start();上述代码定义了一个缩放动画,效果是,使imageView水平方向和垂直方向的尺寸同时从原来的大小缩小一半,再同时放大到原来的大小,动画时间是1秒。由于在这里需要对两个属性的值操作,所以要用到动画集合类AnimatorSet。scale.play(scaleX).with(scaleY);表示同时执行scaleX和scaleY动画。如果想先执行scaleX,再执行scaleY,则使用代码scale.play(scaleY).after(scaleX);表5-23缩放动画ofFloat()方法的参数缩放动画ofFloat()方法的参数imageView动画作用在imageView上scaleX对imageView的scaleX属性进行动画操作1f,0.5f,1fscaleX属性的值从1变化到0.5,再变化到1。1/0.5/1在这里指的是目标对象原来尺寸的倍数。此处值的个数可以根据动画需要自行设置。4.平移动画平移动画主要通过指定目标对象的translationX和translationY两个属性在动画过程中的值,以及动画持续的时间来实现的。代码如下:AnimatorSettranslate=newAnimatorSet();ObjectAnimatortranslationX=ObjectAnimator.ofFloat(imageView,"translationX",0f,100f,0f);ObjectAnimatortranslationY=ObjectAnimator.ofFloat(imageView,"translationY",0f,100f,0f);translate.setDuration(1000);translate.play(translationY).after(translationX);translate.start();上述代码定义了一个平移动画,效果是,使imageView先向右移动100px,再向左平移回到原来的位置,然后向下移动100px,再向上平移回到原来的位置,动画时间是1秒。由于在这里需要对两个属性的值进行操作,所以也用到了动画集合类AnimatorSet。表5-24平移动画ofFloat()方法的参数平移动画ofFloat()方法的参数imageView动画作用在imageView上translationX对imageView的translationX属性进行动画操作0f,100f,0ftranslationX属性的值从0变化到100,再变化到0。此处值的个数可以根据动画需要自行设置。教学准备教材,PPT、教纲、教案参考资料/教学过程方法与手段教学备注【课堂导入】属性动画是如何实现动画效果的呢?属性动画是通过对目标对象的进行赋值并修改其属性来实现的。例如修改目标对象的Alpha属性值,可以实现透明度的变化;修改目标对象的BackgroundColor属性值可以实现背景色的变化。【教学实施】5.2.1任务描述点击不同的按钮能实现4种不同的属性动画效果:透明度动画、旋转动画、缩放动画和平移动画。如图所示。5.2.2问题引导属性动画是如何实现动画效果的呢?属性动画是通过对目标对象的进行赋值并修改其属性来实现的。例如修改目标对象的Alpha属性值,可以实现透明度的变化;修改目标对象的BackgroundColor属性值可以实现背景色的变化。5.2.3知识准备属性动画简介透明度动画的实现旋转动画的实现缩放动画的实现平移动画的实现5.2.4实现苹果的透明度、旋转、缩放和平移动画。5.2.5知识拓展多个动画的执行顺序问题插值器的使用【知识(技能)巩固练习】实现时钟的秒针转动的动画。【教学小结】讲授、演示课后作业与训练完成项目2课后练习对应的习题。教学反思

课题项目2任务3逐帧动画的实现课型理论课理论课时1课时实践课时2课时教学目标知识目标能力(技能)目标理解逐帧动画的实现原理能够掌握安卓平台下逐帧动画的实现。教学重点逐帧动画的实现方法。教学难点逐帧动画的实现原理教学内容1.指定图像的播放顺序在drawable文件夹下创建xml文件,在该xml文件中指定图像的播放顺序和播放时长。要求该xml文件的跟节点是animation-list。每个item子节点表示一帧。代码示例如下:<?xmlversion="1.0"encoding="utf-8"?><animation-listxmlns:android="/apk/res/android"><itemandroid:drawable="@drawable/img1"android:duration="100"/><itemandroid:drawable="@drawable/img2"android:duration="100"/></animation-list>以上代码片段表示,先显示img1图像100毫秒,然后显示img2图像100毫秒。drawable属性用来指定图像资源,duration用来指定显示此帧的时间(以毫秒为单位)。更多XML属性见表5-26。表5-26XML属性属性名作用android:drawable用来指定drawable资源android:duration指定显示此帧的时间(以毫秒为单位)android:oneshot默认为false,当设置为true时,动画将只运行一次,然后停止。android:variablePadding默认为false,当设置为true时,则drawable的padding值随当前选择的状态而改变。android:visible用于设置drawable的可见性,默认为false。2.AnimationDrawable类 该类用于创建逐帧动画的对象。通过View对象的getBackground()方法,可以获得一个AnimationDrawable对象。然后调用AnimationDrawable的start()方法即可启动动画,调用stop()方法可以在当前帧中停止动画。其他常用方法的说明见表5-27。表5-27AnimationDrawable类的常见方法方法返回值类型方法名及作用voidaddFrame(Drawableframe,intduration)作用:将帧添加到动画中。booleanisRunning()作用:指示动画当前是否正在运行。voidsetOneShot(booleanoneShot)作用:设置动画是应该播放一次还是重复播放。参数设为true表示只播放一次。voidstart()从第一帧开始播放动画。voidstop()在当前帧中停止动画。教学准备教材,PPT、教纲、教案参考资料/教学过程方法与手段教学备注【课堂导入】什么是逐帧动画?逐帧动画指的是逐帧绘制帧内容的动画,其实现原理是把事先准备好的若干幅静态图像按照指定的顺序进行播放,利用人眼的“视觉暂留”性质,使用户产生动画的错觉。每幅图像称为一帧。【教学实施】5.3.1任务描述点击“播放”按钮后,能将4幅小狗的图像按照指定的顺序进行播放,形成小狗原地起跳的动画,同时“播放”二字变成“暂停”,点击“暂停”按钮后,动画暂停播放。如图所示。5.3.2问题引导什么是逐帧动画?逐帧动画指的是逐帧绘制帧内容的动画,其实现原理是把事先准备好的若干幅静态图像按照指定的顺序进行播放,利用人眼的“视觉暂留”性质,使用户产生动画的错觉。每幅图像称为一帧。5.3.3知识准备指定图像的播放顺序AnimationDrawable类的常用方法5.3.4实现小狗原地起跳的动画。5.3.5知识拓展介绍通过java代码定义逐帧动画的方法【知识(技能)巩固练习】利用逐帧动画制作一个进程加载动画。【教学小结】讲授、演示课后作业与训练完成项目2课后练习对应的习题。教学反思

课题项目2任务4音频的播放课型理论课理论课时2课时实践课时2课时教学目标知识目标能力(技能)目标掌握音频播放的常用类和方法。能够控制安卓平台下音频的播放。教学重点掌握播放音频的方法。教学难点音频播放的常用类和方法的灵活使用。教学内容1.MediaPlayer类的常用方法在Android中播放音频文件一般是通过MediaPlayer类实现的,该类对多种格式的音频文件提供了非常全面的控制方法,其常用方法见表5-28。表5-28MediaPlayer类的常用方法方法返回值类型方法名及作用voidsetDataSource()作用:设置播放的音频文件。voidPrepare()作用:准备音频文件以便播放。voidprepareAsync()作用:以异步的方式准备音频文件以便播放。voidstart()作用:开始播放或者继续播放音频。voidpause()作用:暂停播放音频。voidseekTo()作用:把播放头移动到指定的时间位置voidstop()作用:停止播放音频。voidrelease()作用:释放与MediaPlayer对象相关的资源。booleanisPlaying作用:判断音频是否正确播放。intgetCurrentPosition()作用:获取当前播放位置。intgetDuration()作用:获取音频文件的时长2.MediaPlayer的状态图MediaPlayer具有内部状态,某些操作仅在播放器处于特定状态时才有效。如果您在错误的状态下执行某项操作,则系统可能会抛出异常。图5-5是官方文档给出的MediaPlayer状态图。图5-5MediaPlayer状态图该图说明了哪些方法可将MediaPlayer从一种状态变为另一种状态。例如,当您创建新的MediaPlayer时,它处于“Idle”状态。此时,您应该通过调用setDataSource()初始化该类,使其处于“Initialized”状态。然后,您必须使用prepare()或prepareAsync()方法完成准备工作。当MediaPlayer准备就绪后,它便会进入“Prepared”状态,这也意味着您可以通过调用start()使其播放媒体内容。此时,如图5-5所示,您可以通过调用start()、pause()和seekTo()等方法在“Started”、“Paused”和“PlaybackCompleted”状态之间切换。不过请注意,当您调用stop()时,除非您再次准备MediaPlayer,否则将无法再次调用start()。3.MediaPlayer的三种数据源MediaPlayer可以播放raw文件夹下的音频文件,也可以播放sd卡中的音频文件,还可以播放网络音频文件。示例代码如下://设置raw文件夹下的音频文件为数据源mediaPlayer=MediaPlayer.create(MainActivity.this,R.raw.xxx);//设置sd卡中的音频文件为数据源mediaPlayer.setDataSource("sd卡中音频文件的路径");//设置网络音频文件为数据源mediaPlayer.setDataSource("http://..../xxx.mp3");需要注意的是,如果您使用MediaPlayer播放基于网络的内容,则您的应用必须申请网络访问权限。<uses-permissionandroid:name="android.permission.INTERNET"/>4.播放音频文件在设置完数据源后,播放音频文件前,需要调用prepare()或者prepareAync()对音频文件进行解析。prepare()是同步操作,用于解析小文件,prepareAync()是异步操作,用于解析大文件,以便造成UI线程阻塞。示例代码如下:(1)小音频文件mediaPlayer.prepare();mediaPlayer.start();//开始播放(2)大音频文件mediaPlayer.prepareAsync();mediaPlayer.setOnPreparedListener(newMediaPlayer.OnPreparedListener(){@OverridepublicvoidonPrepared(MediaPlayermp){mp.start();//开始播放}});需要注意的是,使用create()方法创建MediaPlayer对象并设置数据源时,不需要调用prepare()方法,直接调用start()播放音频文件即可。教学准备教材,PPT、教纲、教案参考资料/教学过程方法与手段教学备注【课堂导入】音频的播放是Android开发中较为常用的功能,Android是如何实现对音频播放的支持的呢?Android提供的对音频进行处理的API包是android.media,media中包括了AudioManager、MediaPlayer等类,具有设置音频类型,以及控制音频的播放、暂停、停止等功能。【教学实施】5.4.1任务描述本任务需要实现的功能是:通过Switch开关按钮控制背景音乐的播放。当按钮处于打开状态时,能播放音乐,并显示文字“音乐播放中”,当按钮处于关闭状态时,能暂停音乐的播放,并显示文字“音乐暂停播放”,当Activity被销毁时,停止音乐的播放,并释放播放器占用的资源。如图所示。5.4.2问题引导音频的播放是Android开发中较为常用的功能,Android是如何实现对音频播放的支持的呢?Android提供的对音频进行处理的API包是android.media,media中包括了AudioManager、MediaPlayer等类,具有设置音频类型,以及控制音频的播放、暂停、停止等功能。5.4.3知识准备MediaPlayer类的常用方法MediaPlayer的状态图MediaPlayer的三种数据源播放音频文件5.4.4通过Switch开关按钮控制背景音乐的播放。5.4.5知识拓展SoundPool类的常用方法使用SoundPool播放音频的过程加载音频文件播放音频【知识(技能)巩固练习】制作一个音频播放器,能实现暂停和播放功能。【教学小结】讲授、演示课后作业与训练完成项目2课后练习对应的习题。教学反思

课题项目2任务5视频的播放课型理论课理论课时1课时实践课时2课时教学目标知识目标能力(技能)目标掌握视频播放的常用类和方法。能够控制安卓平台下视频的播放。教学重点掌握播放视频的方法。教学难点视频播放的常用类和方法的灵活使用。教学内容1.SurfaceView简介SurfaceView把视频解析成的一帧一帧的图像,并把这些图像显示出来。如果把这些工作放在一个线程中完成,会导致画面不流畅或者视频不同步的情况发生。SurfaceView通过双缓冲机制解决这个问题,即通过两个线程循环交替地解析某一帧图像和显示图像,前端缓冲区是正在渲染的图形缓冲区,而后端缓冲区是接下来要渲染的图形缓冲区。当我们要播放某一帧时,它已经提前帮我们加载好后面一帧了,所以播放起视频很流畅。2.Surface简介Surface是由屏幕显示内容合成器(screencompositor)所管理的原生缓冲器的句柄。即通过Surface可以获得原生缓冲器以及其中的内容。原生缓冲器(rawbuffer)是用来保存当前窗口的像素数据的。Surface中的Canvas成员能用于画图形或图像。Surface用通过SurfaceView展示其中的内容。3.SurfaceHolder简介SurfaceHolder是一个接口,用于维护和管理SurfaceView背后的Surface。SurfaceHolder通过三个回调方法,让我们可以监听到Surface的创建、销毁或者改变。在SurfaceView中有一个方法getHolder(),可以很方便地获得SurfaceView背后的Surface所对应的SurfaceHolder。//监听Surface在创建、销毁、改变时的状态surfaceView.getHolder().addCallback(newSurfaceHolder.Callback(){//当Surface创建时调用@OverridepublicvoidsurfaceCreated(SurfaceHoldersurfaceHolder){}//当surface发生结构性变化时(格式或者大小)@OverridepublicvoidsurfaceChanged(SurfaceHoldersurfaceHolder,inti,inti1,inti2){}//当Surface销毁时调用@OverridepublicvoidsurfaceDestroyed(SurfaceHoldersurfaceHolder){}});教学准备教材,PPT、教纲、教案参考资料/教学过程方法与手段教学备注【课堂导入】Android是如何实现对视频播放的支持的呢?与音频播放相比,视频的播放需要将影像展示出来。在Android系统中,MediaPlayer不仅可以播放音频,还可以与SurfaceView相配合播放视频,SurfaceView主要负责显示MediaPlayer中解析得到的视频图像。【教学实施】5.5.1任务描述本任务需要实现的功能是:通过MediaPlayer和SurfaceView实现视频的播放。左边的按钮实现继续播放和暂停播放功能的切换,右边的按钮实现重播的功能。当Activity最小化后再重新显示时,视频能从最小化前的位置开始播放。当Activity被销毁时,停止视频的播放,并释放播放器占用的资源。界面效果如图所示。5.5.2问题引导Android是如何实现对视频播放的支持的呢?与音频播放相比,视频的播放需要将影像展示出来。在Android系统中,MediaPlayer不仅可以播放音频,还可以与SurfaceView相配合播放视频,SurfaceView主要负责显示MediaPlayer中解析得到的视频图像。5.5.3知识准备SurfaceView简介Surface简介SurfaceHolder简介5.5.4实现视频的播放、暂停播放、继续播放和重播。5.5.5知识拓展介绍在Android系统中使用VideoView控件播放视频的方法。【知识(技能)巩固练习】使用同一个按钮实现视频的播放和暂停。【教学小结】讲授、演示课后作业与训练完成项目2课后练习对应的习题。教学反思课题项目2任务6相机和相册的使用课型理论课理论课时1课时实践课时1课时教学目标知识目标能力(技能)目标掌握使用系统内置Activity实现拍照和读取相册的方法。能够控制安卓系统相机和相册。教学重点掌握控制安卓系统相机和相册的方法。教学难点调用系统内置拍照出错解决方法。教学内容1.在AndroidManifest.xml文件的manifest节点中声明使用相机的权限和外部存储设备的存取权限。<uses-permissionandroid:name="android.permission.CAMERA"/><uses-permissionandroid:name="android.permission.READ_EXTERNAL_STORAGE"/><uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>2.动态申请权限拍照需要申请使用相机的权限"android.permission.CAMERA",存取图片需要申请读外部存储设备的权限“android.permission.READ_EXTERNAL_STORAGE”和写外部存储设备的权限“android.permission.WRITE_EXTERNAL_STORAGE”。首先在AndroidManifest.xml文件中的manifest节点声明权限,代码如下:<uses-permissionandroid:name="android.permission.CAMERA"/><uses-permissionandroid:name="android.permission.READ_EXTERNAL_STORAGE"/><uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>在Android6.0以后开始,对于部分敏感的“危险”权限,需要在应用运行时向用户申请,只有用户允许的情况下这个权限才会被授予给应用。因此,接下来还需要在代码中动态申请权限。分为两个步骤,一是使用ContextCompat的checkSelfPermission()检测相关权限是否被用户许可了,如果没有许可,则调用ActivityCompat的requestPermissions()请求用户授权;二是通过对onRequestPermissionsResult()方法的回调判断用户是否同意授权,如果结果是PackageManager.PERMISSION_GRANTED则表示用户同意授权,如果结果是PackageManager.PERMISSION_DENIED则表示用户不同意授权。示例代码如下://检测相机权限if(ContextCompat.checkSelfPermission(this,Manifest.permission.CAMERA)!=PackageManager.PERMISSION_GRANTED){//如果未授权时,则请求用户授权ActivityCompat.requestPermissions(MainActivity.this,newString[]{Manifest.permission.CAMERA},PERMISSIONS_REQUEST);}else{//如果已经授权,在此处编写相应的功能代码}//用户对授权请求做出反馈后,回调该方法@OverridepublicvoidonRequestPermissionsResult(intrequestCode,Stringpermissions[],int[]grantResults){switch(requestCode){casePERMISSIONS_REQUEST:if(grantResults.length>0&&grantResults[0]==PackageManager.PERMISSION_GRANTED){//如果用户同意授权了,在此处编写相应的功能代码}else{//如果用户不同意授权,则在此处编写相应的功能代码}}}3.使用摄像头拍照调用系统拍照程序可以非常方便地实现使用摄像头拍照的功能。具体做法是,创建一个动作为MediaStore.ACTION_IMAGE_CAPTURE的Intent对象,调用Intent的putExtra()方法指定照片输出路径,执行startActivityForResult()方法启动系统自带的拍照程序,即可使用摄像头进行拍照。代码如下:IntentintentCapture=newIntent(MediaStore.ACTION_IMAGE_CAPTURE);intentCapture.putExtra(MediaStore.EXTRA_OUTPUT,Uri.fromFile(picFile));//1startActivityForResult(intentCapture,REQUEST_CAMERA);需要注意的是,以上代码的注释1处的含义是,将用于保存照片的文件picFile的URI通过Intent对象传递给系统的拍照程序,这就意味着将文件URI暴露给了另一个Activity,如果不做处理,程序运行时将会报出如下错误:android.os.FileUriExposedException:file:///storage/emulated/0/Pictures/***.jpgexposedbeyondappthroughClipData.Item.getUri()解决该错误的办法是,在onCreate()方法中,调用StrictMode.VmPolicy.Builder的detectFileUriExposure()方法检测文件URI暴露信息。代码如下:StrictMode.VmPolicy.Builderbuilder=newStrictMode.VmPolicy.Builder();StrictMode.setVmPolicy(builder.build());builder.detectFileUriExposure

温馨提示

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

评论

0/150

提交评论