第9章-圖形和多媒體_第1頁
第9章-圖形和多媒體_第2頁
第9章-圖形和多媒體_第3頁
第9章-圖形和多媒體_第4頁
第9章-圖形和多媒體_第5頁
已閱讀5頁,還剩134頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

第9章圖形和多媒體信息工程學(xué)院楊斌9.1幾何圖形繪制類

在Android系統(tǒng)中繪制幾何圖形,需要用到一些繪圖工具,這些繪圖工具都在android.graphics包中。1、畫布Canvas方法功能Canvas()創(chuàng)建一個(gè)空的畫布,可以使用setBitmap()方法來設(shè)置繪制具體的畫布。Canvas(Bitmapbitmap)以bitmap對(duì)象創(chuàng)建一個(gè)畫布,則將內(nèi)容都繪制在bitmap上,bitmap不得為null。drawColor()設(shè)置Canvas的背景顏色。setBitmap()設(shè)置具體畫布。clipRect()設(shè)置顯示區(qū)域,即設(shè)置裁剪區(qū)。rotate()旋轉(zhuǎn)畫布skew()設(shè)置偏移量。drawLine(floatx1,floaty1,floatx2,floaty2)從點(diǎn)(x1,y1)到點(diǎn)(x2,y2)的直線。drawCircle(floatx,floaty,floatradius,Paintpaint) 以(x,y)為圓心,radius為半徑畫圓。drawRect(floatx1,floaty1,floatx2,floaty2,Paintpaint)從左上角(x1,y1)到右下角(x2,y2)的矩形。drawText(Stringtext,floatx,floaty,Paintpaint) 寫文字。drawPath(Pathpath,Paintpaint)從一點(diǎn)到另一點(diǎn)的連接路徑線段。2、畫筆Paint

畫筆Paint用來描述所繪制圖形的顏色、和風(fēng)格,如線條寬度、顏色等信息。方法功能Paint()構(gòu)造方法,創(chuàng)建一個(gè)輔助畫筆對(duì)象。setColor(intcolor)設(shè)置顏色。setStrokeWidth(floatwidth)設(shè)置畫筆寬度。setTextSize(floattextSize)設(shè)置文字尺寸。setAlpha(inta)設(shè)置透明度alpha值。setAntiAlias(booleanb)除去邊緣鋸齒,取true值。paint.setStyle(Paint.Stylestyle)設(shè)置圖形為空心(Paint.Style.STROKE)或?qū)嵭?Paint.Style.FILL)。3、點(diǎn)到點(diǎn)的連線路徑Path當(dāng)繪制由一些線段組成的圖形(如:三角形、四邊形等),需要用Path類來描述線段路徑。方法功能lineTo(floatx,floaty)從當(dāng)前點(diǎn)到指定點(diǎn)畫連線。moveTo(floatx,floaty)移動(dòng)到指定點(diǎn)。close()關(guān)閉繪制連線路徑4幾何圖形繪制過程在Android中繪制幾何圖形的一般過程為:(1)創(chuàng)建一個(gè)View的子類,并重寫View類的onDraw()方法;(2)在View的子類視圖中使用畫布對(duì)象Canvas繪制各種圖形;(3)使用invalidate()方法刷新畫面?!纠坷L制幾何圖形示例本例繼承自Android.view.View的TestView類,重寫View類的onDraw()方法,在onDraw()方法中運(yùn)用Paint對(duì)象(繪筆)的不同設(shè)置值,在Cavas(畫布)上繪制圖形,分別繪制了矩形、圓形、三角形和文字?!纠坷L制幾何圖形示例關(guān)鍵代碼(MainActivity.java)publicclassMainActivityextendsActivity{@OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);TestViewtView=newTestView(this);setContentView(tView);

}privateclassTestViewextendsView

{publicTestView(Contextcontext){super(context);}【例】繪制幾何圖形示例關(guān)鍵代碼(MainActivity.java)【例】繪制幾何圖形示例關(guān)鍵代碼(MainActivity.java)protectedvoidonDraw(Canvascanvas){canvas.drawColor(Color.CYAN);//設(shè)置背景為青色Paintpaint=newPaint();//定義畫筆paint.setStrokeWidth(3);//設(shè)置畫筆寬度paint.setStyle(Paint.Style.STROKE);//設(shè)置畫空心圖形paint.setAntiAlias(true);//去鋸齒

canvas.drawRect(10,10,70,70,paint);/*畫空心矩形(正方形)*/paint.setStyle(Paint.Style.FILL);/*設(shè)置畫實(shí)心圖形*/

canvas.drawRect(100,10,170,70,paint);/*畫實(shí)心矩形(正方形)*/paint.setColor(Color.BLUE);/*設(shè)置畫筆顏色為藍(lán)色*/

/*畫圓心為(100,120),半徑為30的實(shí)心圓*/canvas.drawCircle(100,120,30,paint);paint.setColor(Color.WHITE);/*在上面的實(shí)心圓上畫一個(gè)小白點(diǎn)*/

canvas.drawCircle(91,111,6,paint);【例】繪制幾何圖形示例關(guān)鍵代碼(MainActivity.java)/*設(shè)置畫筆顏色為紅色*/

paint.setColor(Color.RED);

/*畫三角形*/

Pathpath=newPath();path.moveTo(100,170);path.lineTo(70,230);path.lineTo(130,230);path.close();canvas.drawPath(path,paint);

/*用畫筆書寫文字*/paint.setTextSize(28);paint.setColor(Color.BLUE);canvas.drawText(getResources().getString(R.string.hello_world),30,270,paint);}【例】繪制一個(gè)可以在任意指定位置顯示的小球。設(shè)計(jì)思想:Android系統(tǒng)應(yīng)用程序的設(shè)計(jì)模式是采用MVC模式,即把應(yīng)用程序分為表現(xiàn)層(View)、控制層(Control)、業(yè)務(wù)模型層(Model)。在本示例中,按照這種模式,圖形界面布局為表現(xiàn)層,Activity控制程序?yàn)榭刂茖?,?shí)現(xiàn)幾何作圖的繪制過程屬于業(yè)務(wù)模型層。在業(yè)務(wù)模型層,將圓心坐標(biāo)設(shè)為(x,y),則圓的位置隨控制層任意輸入的坐標(biāo)值而改變?!纠坷L制一個(gè)可以在任意指定位置顯示的小球?!纠咳我庵付ㄎ恢蔑@示的小球。關(guān)鍵代碼(activity_main.xml)<LinearLayoutxmlns:android=/apk/res/android….android:orientation="vertical">

<LinearLayout…..</LinearLayout><com.example.randompaint.TestViewandroid:id="@+id/testView1"android:layout_width="match_parent"android:layout_height="match_parent"/></LinearLayout>關(guān)鍵代碼(MainActivity.java)classmClickimplementsOnClickListener

{@OverridepublicvoidonClick(Viewv){y1=Integer.parseInt(edit_y.getText().toString());testView.setXY(x1,y1);testView.invalidate();}

}【例】任意指定位置顯示的小球。關(guān)鍵代碼(TestView.java)publicclassTestViewextendsView{

intx,y;publicTestView(Contextcontext,AttributeSetattrs){super(context,attrs);}

voidsetXY(int_x,int_y){x=_x;y=_y;}protectedvoidonDraw(Canvascanvas){super.onDraw(canvas);canvas.drawColor(Color.CYAN);/*設(shè)置背景為青色*/Paintpaint=newPaint();

paint.setAntiAlias(true);/*去鋸齒*/paint.setColor(Color.BLACK);

/*設(shè)置paint的顏色*/canvas.drawCircle(x,y,15,paint);/*畫一個(gè)實(shí)心圓*/paint.setColor(Color.WHITE);

/*畫一個(gè)實(shí)心圓上的小白點(diǎn)*/canvas.drawCircle(x-6,y-6,3,paint);}}【例】任意指定位置顯示的小球。關(guān)鍵代碼(TestView.java)【例】任意指定位置顯示的小球。4.2Android二維游戲開發(fā)視圖Android圖形開發(fā)中常用的三種視圖:view視圖、SurfaceView視圖和GLSurfaceView視圖。View視圖:顯示視圖,內(nèi)置畫布,提供圖形繪制函數(shù)、觸屏事件、按鍵事件函數(shù)等;必須在UI主線程內(nèi)更新畫面,速度較慢。SurfaceView視圖:基于view視圖進(jìn)行拓展的視圖類,更適合2D游戲的開發(fā);是view的子類,類似使用雙緩沖機(jī)制,在新的線程中更新畫面所以刷新界面速度比view快。在一個(gè)新啟動(dòng)的線程中重新繪制畫面,主動(dòng)更新畫面。GLSurfaceView視圖:基于SurfaceView視圖再次進(jìn)行拓展的視圖類,是專用于3D游戲開發(fā)的視圖;是SurfaceView的子類(openGL專用)。9.2圖形開發(fā)

(2)主動(dòng)更新

需要一個(gè)單獨(dú)的thread不停的重繪的狀態(tài),例如一個(gè)人在一直跑動(dòng)。避免阻塞mainUIthread。所以顯然view不合適,需要surfaceView來控制。圖形界面開發(fā)一般分為以下兩類:(1)被動(dòng)更新畫面的

畫面的更新依賴于onTouch來更新,可以直接使用invalidate。因?yàn)檫@種情況下,這一次Touch和下一次的Touch需要的時(shí)間比較長些,不會(huì)產(chǎn)生影響。9.2圖形開發(fā)View視圖框架對(duì)于常規(guī)的游戲,在View中需要處理以下3種問題:控制事件、刷新View、繪制View。4.2Android二維游戲開發(fā)視圖(1)處理按鍵事件onKeyDown,屏幕觸控onTouchEvent以及Sensor重力感應(yīng)等方法。(2)刷新view的方法這里主要有invalidate(intl,intt,intr,intb)刷新局部,四個(gè)參數(shù)分別為左、上、右、下。(3)繪制View主要是onDraw()中通過形參canvas來處理,相關(guān)的繪制主要有drawRect、drawLine、drawPath等。9.2圖形開發(fā)4.2Android二維游戲開發(fā)視圖9.2圖形開發(fā)SurfaceView視圖框架4.2Android二維游戲開發(fā)視圖SurfaceView視圖和View視圖最本質(zhì)的區(qū)別是View視圖要在UI的主線程中更新畫面,surfaceView視圖是在一個(gè)新起的單獨(dú)線程中可以重新繪制畫面SurfaceView視圖原理9.2圖形開發(fā)4.3常用繪圖類

在Android下進(jìn)行2D繪圖最常用的就是Paint類、Canvas類、Bitmap類和BitmapFactory類。其中Paint類代表畫筆,Canvas類代表畫布。9.2圖形開發(fā)Bitmap類Bitmap類代表位圖,不僅可以獲取圖像文件信息,對(duì)圖像進(jìn)行剪切、旋轉(zhuǎn)、縮放等操作,而且還可以指定保存圖像文件格式。BitmapFactory類

該類為一個(gè)工具類,用于從不同的數(shù)據(jù)源解析和創(chuàng)建Bitmap對(duì)象。本例實(shí)現(xiàn)一個(gè)不停跳舞的卡通人物,不間斷地變換各種動(dòng)作。跳舞的卡通人物實(shí)例運(yùn)行界面卡通人物圖片素材【例】跳舞的卡通人物【例】跳舞的卡通人物關(guān)鍵代碼(activity_main.xml)<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="/apk/res/android"android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent"android:gravity="center"android:background="@drawable/bg"><ImageViewandroid:id="@+id/myImageView"android:layout_width="fill_parent"android:layout_height="wrap_content"android:src="@drawable/boy0"android:gravity="center"/></LinearLayout>關(guān)鍵代碼(MainActivity.java)publicclassMainActivityextendsActivity{

privateImageViewmyImageView;

privateHandlermyHandler;

privateBooleanisDancing=true;@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//設(shè)置屏幕為橫向setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);myImageView=(ImageView)findViewById(R.id.myImageView);//實(shí)例化Handler對(duì)象myHandler=newHandler(){【例】跳舞的卡通人物關(guān)鍵代碼(MainActivity.java)myHandler=newHandler(){@OverridepublicvoidhandleMessage(Messagemsg){super.handleMessage(msg);

switch(msg.what){

case0:myImageView.setImageResource(R.drawable.boy0);

break;……case18:myImageView.setImageResource(R.drawable.boy18);

break;

}}};//啟動(dòng)線程newmyThread().start();}【例】跳舞的卡通人物關(guān)鍵代碼(MainActivity.java)//線程類,用于定時(shí)給Handler對(duì)象傳遞參數(shù)classmyThreadextendsThread{@Overridepublicvoidrun(){intwhat=1;while(isDancing){myHandler.sendEmptyMessage((what++)%19);try{Thread.sleep(100);}catch(InterruptedExceptione){e.printStackTrace();}}}}【例】跳舞的卡通人物4.3常用繪圖類本例實(shí)現(xiàn)對(duì)RGP類型的游戲人物行走進(jìn)行控制。人物行走圖片素材人物行走實(shí)例運(yùn)行界面【例】人物的行走控制關(guān)鍵代碼(MainActivity.java)publicclassMainActivityextendsActivity{@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);requestWindowFeature(Window.FEATURE_NO_TITLE);getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);getWindow().setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON,WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);MyViewgameView=newMyView(this);gameView.setFocusable(true);setContentView(gameView);}【例】人物的行走控制關(guān)鍵代碼(MyView.java)publicclassMyViewextendsViewimplementsRunnable{privatefinalstaticintRIGHT=1;//標(biāo)識(shí)向右走privatefinalstaticintLEFT=2;//標(biāo)識(shí)向左走privateintdirection=1;//標(biāo)識(shí)行走方向privatePaintpaint;//定義畫筆privateBitmapgameBG;//定義背景privateBitmaproleRight[],roleLeft[];//定義行走序列圖像數(shù)組privatefloatdestX;//目標(biāo)點(diǎn)X坐標(biāo)privatebooleanisGame=true;//游戲是否結(jié)束privatebooleanisMove=false;//是否開始行走privateintroleX=30,roleY=200;//角色默認(rèn)位置privateintframeIndex=0;//行走序列幀privateintspeed=5;//行走速度privateHandlerhandler;//定義Handler對(duì)象

【例】人物的行走控制關(guān)鍵代碼(MyView.java)publicMyView(Contextcontext){super(context);…..roleRight=newBitmap[4];roleRight[0]=BitmapFactory.decodeResource(getResources(),R.drawable.role_right0);…………..roleLeft=newBitmap[4];………h(huán)andler=newHandler(){@OverridepublicvoidhandleMessage(Messagemsg){super.handleMessage(msg);if(msg.what==1){invalidate();//刷新視圖}}};newThread(this).start();}

【例】人物的行走控制關(guān)鍵代碼(MyView.java)@OverrideprotectedvoidonDraw(Canvascanvas){super.onDraw(canvas);canvas.drawBitmap(gameBG,0,0,paint);switch(direction){caseRIGHT:canvas.drawBitmap(roleRight[frameIndex],roleX,roleY,paint);break;caseLEFT:canvas.drawBitmap(roleLeft[frameIndex],roleX,roleY,paint);break;}}@OverridepublicbooleanonTouchEvent(MotionEventevent){destX=event.getX();//獲取觸屏X位置坐標(biāo)isMove=true;//角色開始行走returntrue;}

【例】人物的行走控制關(guān)鍵代碼(MyView.java)@Overridepublicvoidrun(){while(isGame){if(isMove){direction=destX>roleX?RIGHT:LEFT;//判斷行走方向switch(direction){caseRIGHT:roleX+=speed;break;caseLEFT:roleX-=speed;break;}frameIndex=(frameIndex==3?0:frameIndex+1);//循環(huán)序列幀if(Math.abs(roleX-destX)<=5){//如果到達(dá)位置frameIndex=0;//初如序列幀isMove=false;//角色停止行走}

【例】人物的行走控制關(guān)鍵代碼(MyView.java)Messagemsg=handler.obtainMessage();//獲取Handler消息對(duì)象msg.what=1;handler.sendMessage(msg);//發(fā)送消息try{Thread.sleep(100);}catch(InterruptedExceptione){e.printStackTrace();}}}}}

【例】人物的行走控制實(shí)現(xiàn)游戲處于菜單狀態(tài)下多數(shù)花瓣不斷飄落的效果。游戲動(dòng)態(tài)導(dǎo)航花瓣效果【例】SurfaceView的使用關(guān)鍵代碼(MainActivity.java)publicclassMainActivityextendsActivity{@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);requestWindowFeature(Window.FEATURE_NO_TITLE);getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);GameSurfaceViewgameView=newGameSurfaceView(this);gameView.setFocusable(true);setContentView(gameView);}【例】SurfaceView的使用關(guān)鍵代碼(GameSurfaceView.java)publicclassGameSurfaceViewextendsSurfaceViewimplementsCallback,Runnable{privateSurfaceHolderholder;privateCanvascanvas;privatePaintpaint;privatebooleanisGame;privateBitmaplogo[];privateintframeIndex=1;privateinttimeCount;privateBitmapmenu[];privateintmenuIndex=0;privateBitmapflowerImg[];privateintflower[][];//每一行表示一個(gè)花瓣對(duì)象,有多少行表示對(duì)象池的初始化大小【例】SurfaceView的使用關(guān)鍵代碼(GameSurfaceView.java)@OverridepublicvoidsurfaceCreated(SurfaceHolderholder){isGame=true;newThread(this).start();}@OverridepublicvoidsurfaceDestroyed(SurfaceHolderholder){isGame=false;activity.finish();}【例】SurfaceView的使用關(guān)鍵代碼(GameSurfaceView.java)@OverridepublicbooleanonTouchEvent(MotionEventevent){switch(event.getAction()){caseMotionEvent.ACTION_DOWN:switch(gameState){//判斷游戲狀態(tài)caseLOGO://閃屏狀態(tài)gameState=MENU;//切換到菜單狀態(tài)frameIndex=0;//花瓣圖像數(shù)組幀索引break;caseMENU://菜單狀態(tài)floatpointX=event.getX();//獲取觸屏X坐標(biāo)floatpointY=event.getY();//獲取觸屏Y坐標(biāo)if(pointX>=LEFT_START_X&&pointX<=LEFT_END_X&&pointY>=LEFT_START_Y&&pointY<=LEFT_END_Y)//判斷觸屏位置menuIndex=(menuIndex>0?menuIndex-1:5);//計(jì)算菜單圖像位置索引【例】SurfaceView的使用關(guān)鍵代碼(GameSurfaceView.java)elseif(pointX>=RIGHT_START_X&&pointX<=RIGHT_END_X&&pointY>=RIGHT_START_Y&&pointY<=RIGHT_END_Y)menuIndex=(menuIndex>4?0:menuIndex+1);elseif(pointX>=MENU_START_X&&pointX<=MENU_START_X+menu[1].getWidth()/6&&pointY>=MENU_START_Y&&pointY<=MENU_START_Y+menu[1].getHeight()){switch(menuIndex){//判斷菜單圖像位置索引case0:gameState=GAME;break;case5:isGame=false;activity.finish();break;}}break;}break;}returntrue;}

【例】SurfaceView的使用關(guān)鍵代碼(GameSurfaceView.java)privatevoiddrawMenu(Canvascanvas){canvas.drawBitmap(menu[0],0,0,paint);//繪制菜單界面背景canvas.clipRect(MENU_START_X,MENU_START_Y,MENU_START_X+menu[1].getWidth()/6,MENU_START_Y+menu[1].getHeight());//剪切菜單項(xiàng)區(qū)域canvas.drawBitmap(menu[1],MENU_START_X-menuIndex*menu[1].getWidth()/6,MENU_START_Y,paint);//繪制當(dāng)前菜單項(xiàng)……paintFlower(canvas,paint);}【例】SurfaceView的使用關(guān)鍵代碼(GameSurfaceView.java)privatevoidrender(){canvas=holder.lockCanvas();//鎖定畫布switch(gameState){//判斷游戲狀態(tài)caseLOGO://閃屏狀態(tài)drawLogo(canvas);//調(diào)用閃屏狀態(tài)繪制函數(shù)break;caseMENU://菜單狀態(tài)drawMenu(canvas);//調(diào)用菜單狀態(tài)繪制函數(shù)break;caseGAME:break;}holder.unlockCanvasAndPost(canvas);//解鎖畫布}

【例】SurfaceView的使用關(guān)鍵代碼(GameSurfaceView.java)@Overridepublicvoidrun(){while(isGame){//當(dāng)游戲開始switch(gameState){//判斷游戲狀態(tài)caseLOGO://閃屏狀態(tài)timeCount++;//延時(shí)操作計(jì)數(shù)if(timeCount%15==0){//對(duì)15取余if(frameIndex<2)//判斷閃屏圖像數(shù)組索引frameIndex++;else{gameState=MENU;//切換到菜單狀態(tài)frameIndex=0;}}break;……….render();Thread.sleep(100);…….}}

【例】SurfaceView的使用9.4動(dòng)畫Android動(dòng)畫可以分為逐幀動(dòng)畫和補(bǔ)間動(dòng)畫1.補(bǔ)間動(dòng)畫(TweenAnimation)Android系統(tǒng)提供4中補(bǔ)間動(dòng)畫,分別是透明度漸變動(dòng)畫(AlphaAnimation)旋轉(zhuǎn)動(dòng)畫(RotateAnimation)縮放動(dòng)畫(ScaleAnimation)平移動(dòng)畫(TranslateAnimation)補(bǔ)間動(dòng)畫的效果可以通過XML文件定義,也可以通過代碼編寫實(shí)現(xiàn)。XML文件放在res/anim文件夾下

例子中,單擊響應(yīng)的圖片,就會(huì)有不同的動(dòng)畫效果【例】補(bǔ)間動(dòng)畫關(guān)鍵代碼(alpha_animation.xml)<?xmlversion="1.0"encoding="utf-8"?><setxmlns:android="/apk/res/android"android:interpolator="@android:anim/linear_interpolator"><alphaandroid:repeatMode="restart"android:repeatCount="infinite"android:duration="1000"android:fromAlpha="0.0"android:toAlpha="1.0"/></set>【例】補(bǔ)間動(dòng)畫關(guān)鍵代碼(rotate_animation.xml)<?xmlversion="1.0"encoding="utf-8"?><setxmlns:android="/apk/res/android"android:interpolator="@android:anim/accelerate_interpolator"><rotateandroid:fromDegrees="0"android:toDegrees="180"android:pivotX="50%"android:pivotY="50%"android:repeatMode="reverse"android:repeatCount="infinite"android:duration="2000"/></set>【例】補(bǔ)間動(dòng)畫關(guān)鍵代碼(scale_animation.xml)<?xmlversion="1.0"encoding="utf-8"?><setxmlns:android="/apk/res/android"android:interpolator="@android:anim/accelerate_interpolator"><scaleandroid:repeatMode="restart"android:repeatCount="infinite"android:duration="3000"android:fromXScale="1.0"android:fromYScale="1.0"android:toXScale="2.0"android:toYScale="0.5"android:pivotX="50%"android:pivotY="50%"/></set>【例】補(bǔ)間動(dòng)畫關(guān)鍵代碼(translate_animation.xml)<?xmlversion="1.0"encoding="utf-8"?><setxmlns:android="/apk/res/android"android:interpolator="@android:anim/accelerate_interpolator"><translateandroid:fromXDelta="50"android:fromYDelta="50"android:toXDelta="200"android:toYDelta="200"android:repeatCount="infinite"android:repeatMode="reverse"android:duration="5000"/></set>【例】補(bǔ)間動(dòng)畫關(guān)鍵代碼(MainActivity.java)publicclassMainActivityextendsActivityimplementsOnClickListener{privateImageViewimg01;privateImageViewimg02;privateImageViewimg03;privateImageViewimg04;publicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);img01=(ImageView)findViewById(R.id.img01);img02=(ImageView)findViewById(R.id.img02);img03=(ImageView)findViewById(R.id.img03);img04=(ImageView)findViewById(R.id.img04);img01.setOnClickListener(this);img02.setOnClickListener(this);img03.setOnClickListener(this);img04.setOnClickListener(this);}【例】補(bǔ)間動(dòng)畫關(guān)鍵代碼(MainActivity.java)publicvoidonClick(Viewv){switch(v.getId()){caseR.id.img01:Animationani1=AnimationUtils.loadAnimation(this,R.anim.alpha_animation);img01.startAnimation(ani1);break;caseR.id.img02:Animationani2=AnimationUtils.loadAnimation(this,R.anim.scale_animation);img02.startAnimation(ani2);break;…..}}}【例】補(bǔ)間動(dòng)畫9.4動(dòng)畫2.逐幀動(dòng)畫(FrameAnimation)

逐幀動(dòng)畫就是一張一張連續(xù)播放準(zhǔn)備好的靜態(tài)圖片。一般的設(shè)置步驟為將圖片放入res/drawable目錄下在res/drawable目錄下定義動(dòng)畫文件(XML文件)為指定控件綁定動(dòng)畫效果,并調(diào)用AnimationDrawable類的start()方法開啟動(dòng)畫例子中,單擊開始按鍵就能看到一系列圖片不停切換【例】逐幀動(dòng)畫關(guān)鍵代碼(frame.xml)<?xmlversion="1.0"encoding="utf-8"?><animation-listxmlns:android="/apk/res/android"><itemandroid:drawable="@drawable/img01"android:duration="200"></item><itemandroid:drawable="@drawable/img02"android:duration="200"></item><itemandroid:drawable="@drawable/img03"android:duration="200"></item><itemandroid:drawable="@drawable/img04"android:duration="200"></item><itemandroid:drawable="@drawable/img05"android:duration="200"></item><itemandroid:drawable="@drawable/img06"android:duration="200"></item></animation-list>【例】逐幀動(dòng)畫關(guān)鍵代碼(activity_main.xml)<RelativeLayoutxmlns:android="/apk/res/android"….tools:context=".MainActivity">

<ImageViewandroid:id="@+id/iv_flower"android:layout_width="150dp"android:layout_height="267dp"android:layout_centerHorizontal="true"android:layout_centerVertical="true"android:background="@drawable/frame"android:layout_marginBottom="20dp"/><Buttonandroid:id="@+id/btn_play"android:layout_width="70dp"android:layout_height="70dp"android:layout_centerInParent="true"android:background="@android:drawable/ic_media_play"/></RelativeLayout>【例】逐幀動(dòng)畫關(guān)鍵代碼(MainActivity.java)publicclassMainActivityextendsActivityimplementsOnClickListener{privateImageViewiv_flower;privateButtonbtn_start;privateAnimationDrawableanimation;@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);iv_flower=(ImageView)findViewById(R.id.iv_flower);btn_start=(Button)findViewById(R.id.btn_play);btn_start.setOnClickListener(this);//拿到AnimationDrawable對(duì)象animation=(AnimationDrawable)iv_flower.getBackground();}【例】逐幀動(dòng)畫關(guān)鍵代碼(MainActivity.java)publicvoidonClick(Viewv){//播放動(dòng)畫if(!animation.isRunning()){animation.start();btn_start.setBackgroundResource(android.R.drawable.ic_media_pause);}else{animation.stop();btn_start.setBackgroundResource(android.R.drawable.ic_media_play);}}}【例】逐幀動(dòng)畫9.5手勢識(shí)別所謂手勢識(shí)別,就是識(shí)別手指(或鼠標(biāo))在屏幕上劃動(dòng)時(shí)的軌跡。在Android系統(tǒng)中,android.gesture是用于創(chuàng)建、識(shí)別和保存觸摸屏手勢功能的包。在實(shí)現(xiàn)OnGesturePerformedListener接口時(shí),需要復(fù)蓋其方法:onGesturePerformed(GestureOverlayViewoverlay,Gesturegesture)類及接口功能Gesture觸摸屏的手勢類GestureLibraries手勢庫GestureLibrary手勢庫GestureOverlayView可輸入手勢的視圖Prediction手勢的預(yù)顯示類GestureStroke記錄在觸摸屏上手勢動(dòng)作的開始與結(jié)束類OnGestureListener手勢動(dòng)作的監(jiān)聽接口OnGesturePerformedListener可輸入手勢視圖GestureOverlayView的監(jiān)聽接口9.5手勢識(shí)別【例】手寫字體識(shí)別程序。要編寫一個(gè)手寫字體識(shí)別程序,必須先建立一個(gè)存放手寫字體的數(shù)據(jù)庫。在手機(jī)模擬器中已經(jīng)預(yù)裝了創(chuàng)建手寫字體數(shù)據(jù)庫的應(yīng)用程序GesturesBuilder,其圖標(biāo)如圖所示。

創(chuàng)建手勢庫如圖6.6所示。由手勢創(chuàng)建的手寫字體將被保存到/sdcard/gestures中,把文件gestures復(fù)制到項(xiàng)目/res/raw下,就可以在應(yīng)用程序里面使用這些手勢了?!纠渴謱懽煮w識(shí)別程序。關(guān)鍵代碼(activity_main.xml)<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android=/apk/res/android…android:orientation="vertical"><TextView….android:textSize="24sp"/>

<android.gesture.GestureOverlayViewandroid:id="@+id/gestureOverlayView1"android:layout_width="fill_parent"android:layout_height="fill_parent"></android.gesture.GestureOverlayView></LinearLayout>【例】手寫字體識(shí)別程序。關(guān)鍵代碼(MainActivity.java)publicclassMainActivityextendsActivityimplementsOnGesturePerformedListener{GestureLibrarymLibrary;GestureOverlayViewgesturesView;TextViewtxt;@Override

publicvoidonCreate(BundlesavedInstanceState)

{

super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);gesturesView=(GestureOverlayView)findViewById(R.id.gestureOverlayView1);gesturesView.addOnGesturePerformedListener(this);txt=(TextView)findViewById(R.id.textView1);mLibrary=GestureLibraries.fromRawResource(this,R.raw.gestures);

if(!mLibrary.load())finish();

}

【例】手寫識(shí)別程序關(guān)鍵代碼(MainActivity.java)@OverridepublicvoidonGesturePerformed(GestureOverlayViewoverlay,Gesturegesture){ArrayList<Prediction>predictions=mLibrary.recognize(gesture);if(predictions.size()>0)

{Predictionprediction=(Prediction)predictions.get(0);

if(prediction.score>1.0)

{//對(duì)話框Toast.makeText(this,,Toast.LENGTH_SHORT).show();txt.append();

}

}}}

【例】手寫識(shí)別程序9.6多媒體處理包類名或接口名說明MediaPlayer支持流媒體,用于播放音頻和視頻MediaRecorder用于錄制音頻和視頻Ringtone用于播放可用作鈴聲和提示音的短聲音片段AudioManager負(fù)責(zé)控制音量AudioRecord用于記錄從音頻輸入設(shè)備產(chǎn)生的數(shù)據(jù)JetPlayer用于存儲(chǔ)JET內(nèi)容的回放和控制RingtoneManager用于訪問響鈴、通知和其他類型的聲音Ringtone快速播放響鈴、通知或其他相同類型的聲音SoundPool用于管理和播放應(yīng)用程序的音頻資源android.media包中的主要類9.6.1多媒體處理播放器MediaPlayer1、MediaPlayer類的常用方法方法說明create()創(chuàng)建多媒體播放器。getCurrentPosition()獲得當(dāng)前播放位置getDuration()獲得播放文件的時(shí)間getVideoHeight()播放視頻高度getVideoWidth()播放視頻寬度isLooping()是否循環(huán)播放isPlaying()是否正在播放Pause()暫停Prepare()準(zhǔn)備播放文件,進(jìn)行同步處理prepareAsync()準(zhǔn)備播放文件,進(jìn)行異步處理release()釋放MediaPlayer對(duì)象reset()重置MediaPlayer對(duì)象seekTo()指定播放文件的播放位置setDataSource()設(shè)置多媒體數(shù)據(jù)來源setVolume()設(shè)置音量setOnCompletionListener()監(jiān)聽播放文件播放完畢start()開始播放stop()停止播放2、MediaPlayer對(duì)象的生命周期通常把一個(gè)對(duì)象從創(chuàng)建、使用、直到釋放該對(duì)象的過程稱為該對(duì)象的生命周期。9.6.2播放音頻文件通過媒體處理器MediaPlayer提供的方法不僅可以播放存放在SD卡上音樂文件而且還能播放資源中的音樂文件。這二者之間在設(shè)計(jì)方法上稍有不同。1、構(gòu)建MediaPlayer對(duì)象(1)使用new的方式創(chuàng)建MediaPlayer對(duì)象對(duì)于播放SD卡上的音樂文件需要使用new方式來創(chuàng)建MediaPlayer對(duì)象:

MediaPlayermplayer=newMediaPlayer();(2)使用create方法的方式創(chuàng)建MediaPlayer對(duì)象對(duì)于播放資源中的音樂需要使用create方法的方式來創(chuàng)建MediaPlayer對(duì)象,如:

MediaPlayermplayer=MediaPlayer.create(this,R.raw.test);2、設(shè)置播放文件MediaPlayer要播放的文件主要包括3個(gè)來源:(1)存儲(chǔ)在SD卡或其他文件路徑下的媒體文件對(duì)于存儲(chǔ)在SD卡或其他文件路徑下的媒體文件,需要調(diào)用setDataSource()方法,例如:

mplayer.setDataSource("/sdcard/test.mp3");(2)在編寫應(yīng)用程序時(shí)事先存放在res資源中的音樂文件播放事先存放在資源目錄res\raw中的音樂文件,需要在使用create()方法創(chuàng)建MediaPlayer對(duì)象時(shí),就指定資源路徑和文件名稱(不要帶擴(kuò)展名)。由于create()方法的源代碼中已經(jīng)封裝了調(diào)用setDataSource()方法,因此不必重復(fù)使用setDataSource()方法。(3)網(wǎng)絡(luò)上的媒體文件播放網(wǎng)絡(luò)上的音樂文件,需要調(diào)用setDataSource()方法,例如:mplayer.setDataSource("/music/confucius.mp3");3、對(duì)播放器進(jìn)行同步控制使用prepare()方法設(shè)置對(duì)播放器的同步控制,例如:

mplayer.prepare();如果MediaPlayer對(duì)象是由create方法創(chuàng)建的,由于create()方法的源代碼中已經(jīng)封裝了調(diào)用prepare()方法,因此可省略此步驟。4、播放音頻文件start()是真正啟動(dòng)音頻文件播放的方法,如:

mplayer.start();

如要暫停播放或停止播放,則調(diào)用pause()和stop()方法。5、釋放占用資源

音頻文件播放結(jié)束應(yīng)該調(diào)用release()釋放播放器占用的系統(tǒng)資源。如要重新播放音頻文件,需要調(diào)用reset()返回到空閑狀態(tài),再從第2步開始重復(fù)其他各步驟。【例】音樂播放器。

在本示例中,將分別播放存放在項(xiàng)目資源中的音樂文件和SD卡中的音頻文件,因此需要事先將準(zhǔn)備好的音頻文件保存在指定路徑下。(1)將測試的音頻文件mtest1.mp3復(fù)制到新建項(xiàng)目的“res\raw”目錄下;(2)將音頻文件mtest2.mp3復(fù)制到SD卡中,(在模擬器中使用SD卡,可以在Eclipse集成環(huán)境中,選擇“DDMS”調(diào)試工具,單擊“向設(shè)備導(dǎo)入文件”按鍵,將音頻文件復(fù)制到模擬器的“/mnt/sdcard/Music”目錄下,如圖6.9所示)。將音頻文件存放到模擬器的SD卡內(nèi)

【例】音樂播放器。通過界面選擇音樂的來源,就可以播放【例】音樂播放器。關(guān)鍵代碼(MainActivity.java)publicclassMainActivityextendsActivity{CheckBoxch1,ch2;TextViewtxt;ImageButtonmStopButton,mStartButton,mPauseButton;MediaPlayermMediaPlayer;intres_file=R.raw.mtest1;Stringsdcard_file=newString("/sdcard/music/mtest2.mp3");@Override

publicvoidonCreate(BundlesavedInstanceState)

{…..mStopButton.setOnClickListener(newmStopClick());mStartButton.setOnClickListener(newmStartClick());mPauseButton.setOnClickListener(newmPauseClick());

}

【例】音樂播放器關(guān)鍵代碼(MainActivi

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論