




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
Android開(kāi)發(fā)與實(shí)踐課件第11章圖像與動(dòng)畫(huà)處理技術(shù)11.1常用繪圖類(lèi)11.2繪制2D圖像11.3為圖像添加特效11.4Android中的動(dòng)畫(huà)11.5綜合實(shí)例——忐忑的精靈第11章
圖像與動(dòng)畫(huà)處理技術(shù)圖形與動(dòng)畫(huà)處理技術(shù)在Android中非常重要,特別是在開(kāi)發(fā)益智類(lèi)游戲或者2D游戲時(shí),都離不開(kāi)圖形與動(dòng)畫(huà)處理技術(shù)的支持。本章將對(duì)Android中的圖形與動(dòng)畫(huà)處理技術(shù)進(jìn)行詳細(xì)介紹。第11章
圖像與動(dòng)畫(huà)處理技術(shù)11.1.1Paint類(lèi)11.1.2Canvas類(lèi)11.1.3Bitmap類(lèi)11.1.4BitmapFactory類(lèi)11.1常用繪圖類(lèi)在Android中,繪制圖像時(shí),最常應(yīng)用的就是Paint類(lèi)、Canvas類(lèi)、Bitmap類(lèi)和BitmapFactory類(lèi)。其中Paint類(lèi)代表畫(huà)筆,Canvas類(lèi)代表畫(huà)布。在現(xiàn)實(shí)生活中,有畫(huà)筆和畫(huà)布我們就可以正常作畫(huà)了,在Android中,也是如此,通過(guò)Paint類(lèi)和Canvas類(lèi)就可繪制圖像了。下面將對(duì)這4個(gè)類(lèi)進(jìn)行詳細(xì)介紹。11.1常用繪圖類(lèi)Paint類(lèi)代表畫(huà)筆,用來(lái)描述圖形的顏色和風(fēng)格,如線寬、顏色、透明度和填充效果等信息。使用Paint類(lèi)時(shí),需要先創(chuàng)建該類(lèi)的對(duì)象,這可以通過(guò)該類(lèi)提供的構(gòu)造方法來(lái)實(shí)現(xiàn)。通常情況下,只需要使用Paint()方法來(lái)創(chuàng)建一個(gè)使用默認(rèn)設(shè)置的Paint對(duì)象,具體代碼如下:Paintpaint=newPaint();創(chuàng)建Paint類(lèi)的對(duì)象后,還可以通過(guò)該對(duì)象提供的方法來(lái)對(duì)畫(huà)筆的默認(rèn)設(shè)置進(jìn)行改變,例如,改變畫(huà)筆的顏色、筆觸寬度等。用于改變畫(huà)筆設(shè)置的常用方法如表11-1所示。表11-1Paint類(lèi)的常用方法11.1.1Paint類(lèi)方法描述setARGB(inta,intr,intg,intb)用于設(shè)置顏色,各參數(shù)值均為0~255之間的整數(shù),分別用于表示透明度、紅色、綠色和藍(lán)色值setColor(intcolor)用于設(shè)置顏色,參數(shù)color可以通過(guò)Color類(lèi)提供的顏色常量指定,也可以通過(guò)Color.rgb(intred,intgreen,intblue)方法指定setAlpha(inta)用于設(shè)置透明度,值為0~255之間的整數(shù)setAntiAlias(booleanaa)用于指定是否使用抗鋸齒功能,如果使用會(huì)使繪圖速度變慢setDither(booleandither)用于指定是否使用圖像抖動(dòng)處理,如果使用會(huì)使圖像顏色更加平滑和飽滿,更加清晰setPathEffect(PathEffecteffect)用于設(shè)置繪制路徑時(shí)的路徑效果,例如點(diǎn)畫(huà)線setShader(Shadershader)用于設(shè)置漸變,可以使用LinearGradient(線性漸變)、RadialGradient(徑向漸變)或者SweepGradient(角度漸變)setShadowLayer(floatradius,floatdx,floatdy,intcolor)用于設(shè)置陰影,參數(shù)radius為陰影的角度,dx和dy為陰影在x軸和y軸上的距離,color為陰影的顏色。如果參數(shù)radius的值為0,那么將沒(méi)有陰影setStrokeCap(Paint.Capcap)用于當(dāng)畫(huà)筆的填充樣式為STROKE或FILL_AND_STROKE時(shí),設(shè)置筆刷的圖形樣式,參數(shù)值可以是Cap.BUTT、Cap.ROUND或Cap.SQUARE。主要體現(xiàn)在線的端點(diǎn)上setStrokeJoin(Paint.Joinjoin)用于設(shè)置畫(huà)筆轉(zhuǎn)彎處的連接風(fēng)格,參數(shù)值為Join.BEVEL、Join.MITER或Join.ROUNDsetStrokeWidth(floatwidth)用于設(shè)置筆觸的寬度setStyle(Paint.Stylestyle)用于設(shè)置填充風(fēng)格,參數(shù)值為Style.FILL、Style.FILL_AND_STROKE或Style.STROKEsetTextAlign(Paint.Alignalign)用于設(shè)置繪制文本時(shí)的文字對(duì)齊方式,參數(shù)值為Align.CENTER、Align.LEFT或Align.RIGHTsetTextSize(floattextSize)用于設(shè)置繪制文本時(shí)的文字的大小setFakeBoldText(booleanfakeBoldText)用于設(shè)置是否為粗體文字setXfermode(Xfermodexfermode)用于設(shè)置圖形重疊時(shí)的處理方式,例如合并、取交集或并集,經(jīng)常用來(lái)制作橡皮的擦除效果例如,要定義一個(gè)畫(huà)筆,指定該畫(huà)筆的顏色為綠色,帶一個(gè)淺灰色的陰影,可以使用下面的代碼。Paintpaint=newPaint();paint.setColor(Color.RED);paint.setShadowLayer(2,3,3,Color.rgb(180,180,180));應(yīng)用該畫(huà)筆,在畫(huà)布上繪制一個(gè)帶陰影的矩形的效果如圖11-1所示。圖11-1繪制帶陰影的矩形 圖11-2繪制以漸變色填充的矩形【例11-1】分別定義一個(gè)線性漸變、徑向漸變和角度漸變的畫(huà)筆,并應(yīng)用這“3只畫(huà)筆”繪制3個(gè)矩形。(實(shí)例位置:光盤(pán)\MR\源碼\第11章\11-1)關(guān)鍵代碼如下:Paintpaint=newPaint(); //定義一個(gè)默認(rèn)的畫(huà)筆//線性漸變Shadershader=newLinearGradient(0,0,50,50,Color.RED,Color.GREEN,Shader.TileMode.MIRROR);paint.setShader(shader); //為畫(huà)筆設(shè)置漸變器 canvas.drawRect(10,70,100,150,paint); //繪制矩形//徑向漸變shader=newRadialGradient(160,110,50,Color.RED,Color.GREEN,Shader.TileMode.MIRROR);paint.setShader(shader); //為畫(huà)筆設(shè)置漸變器 canvas.drawRect(115,70,205,150,paint); //繪制矩形//角度漸變shader=newSweepGradient(265,110,newint[]{Color.RED,Color.GREEN,Color.BLUE},null);paint.setShader(shader); //為畫(huà)筆設(shè)置漸變器 canvas.drawRect(220,70,310,150,paint); //繪制矩形運(yùn)行本實(shí)例,將顯示如圖11-2所示的運(yùn)行結(jié)果。Canvas類(lèi)代表畫(huà)布,通過(guò)該類(lèi)提供的方法,我們可以繪制各種圖形(例如,矩形、圓形和線條等)。通常情況下,要在Android中繪圖,需要先創(chuàng)建一個(gè)繼承自View類(lèi)的視圖,并且在該類(lèi)中重寫(xiě)它的onDraw(Canvascanvas)方法,然后在顯示繪圖的Activity中添加該視圖。下面將通過(guò)一個(gè)具體的實(shí)例來(lái)說(shuō)明如何創(chuàng)建用于繪圖的畫(huà)布?!纠?1-2】在Eclipse中創(chuàng)建Android項(xiàng)目,實(shí)現(xiàn)創(chuàng)建繪圖畫(huà)布功能。(實(shí)例位置:光盤(pán)\MR\源碼\第11章\11-2)(1)創(chuàng)建一個(gè)名稱(chēng)為DrawView的類(lèi),該類(lèi)繼承自android.view.View類(lèi),并添加構(gòu)造方法和重寫(xiě)onDraw(Canvascanvas)方法,關(guān)鍵代碼如下:publicclassDrawViewextendsView{ /** *功能:構(gòu)造方法 */ publicDrawView(Contextcontext,AttributeSetattrs){ super(context,attrs); } /*11.1.2Canvas類(lèi)*功能:重寫(xiě)onDraw()方法 */ @Override protectedvoidonDraw(Canvascanvas){ super.onDraw(canvas); }}說(shuō)明:上面加粗的代碼為重寫(xiě)onDraw()方法的代碼。在重寫(xiě)的onDraw()方法中,可以編寫(xiě)繪圖代碼,參數(shù)canvas就是我們要進(jìn)行繪圖的畫(huà)布。(2)修改新建項(xiàng)目的res/layout目錄下的布局文件main.xml,將默認(rèn)添加的線性布局管理器和TextView組件刪除,然后添加一個(gè)幀布局管理器,并在幀布局管理器中添加步驟(1)創(chuàng)建的自定義視圖。修改后的代碼如下:<?xmlversion="1.0"encoding="utf-8"?><FrameLayoutxmlns:android="/apk/res/android"android:layout_width="fill_parent"android:layout_height="fill_parent"android:orientation="vertical"><com.mingrisoft.DrawViewandroid:id="@+id/drawView1"android:layout_width="wrap_content"android:layout_height="wrap_content"/></FrameLayout>(3)在DrawView的onDraw()方法中,添加以下代碼用于繪制一個(gè)帶陰影的紅色矩形。Paintpaint=newPaint(); //定義一個(gè)采用默認(rèn)設(shè)置的畫(huà)筆paint.setColor(Color.RED); //設(shè)置顏色為紅色paint.setShadowLayer(2,3,3,Color.rgb(180,180,180)); //設(shè)置陰影canvas.drawRect(40,40,200,100,paint); //繪制矩形 運(yùn)行本實(shí)例,將顯示如圖11-3所示的運(yùn)行結(jié)果。圖11-3創(chuàng)建繪圖畫(huà)布并繪制帶陰影的矩形Bitmap類(lèi)代表位圖,它是Android系統(tǒng)中圖像處理的最重要類(lèi)之一,使用它不僅可以獲取圖像文件信息,進(jìn)行圖像剪切、旋轉(zhuǎn)、縮放等操作,而且還可以指定格式保存圖像文件。Bitmap類(lèi)提供的常用方法如表11-2所示。表11-2Bitmap類(lèi)的常用方法11.1.3Bitmap類(lèi)方法描述
compress(Bitmap.CompressFormatformat,intquality,OutputStreamstream)用于將Bitmap對(duì)象壓縮為指定格式并保存到指定的文件輸出流中,其中format參數(shù)值可以是Bitmap.CompressFormat.PNG、Bitmap.CompressFormat.JPEG和Bitmap.CompressFormat.WEBP
createBitmap(Bitmapsource,intx,inty,intwidth,intheight,Matrixm,booleanfilter)用于從源位圖的指定坐標(biāo)點(diǎn)開(kāi)始,“挖取”指定寬度和高度的一塊圖像來(lái)創(chuàng)建新的Bitmap對(duì)象,并按Matrix指定規(guī)則進(jìn)行變換
createBitmap(intwidth,intheight,Bitmap.Configconfig)用于創(chuàng)建一個(gè)指定寬度和高度的新的Bitmap對(duì)象
createBitmap(Bitmapsource,intx,inty,intwidth,intheight)用于從源位圖的指定坐標(biāo)點(diǎn)開(kāi)始,“挖取”指定寬度、和高度的一塊圖像來(lái)創(chuàng)建新的Bitmap對(duì)象
createBitmap(int[]colors,intwidth,intheight,Bitmap.Configconfig)使用顏色數(shù)組創(chuàng)建一個(gè)指定寬度和高度的新Bitimap對(duì)象,其中,數(shù)組元素的個(gè)數(shù)為width*height
createBitmap(Bitmapsrc)用于使用源位圖創(chuàng)建一個(gè)新的Bitmap對(duì)象
說(shuō)明:表11-2中給出的方法不包括對(duì)圖像進(jìn)行縮放和旋轉(zhuǎn)的方法,關(guān)于如何使用Bitmap類(lèi)對(duì)圖像進(jìn)行縮放和旋轉(zhuǎn)將在11-3節(jié)進(jìn)行介紹。例如,創(chuàng)建一個(gè)包括4個(gè)像素(每個(gè)像素對(duì)應(yīng)一種顏色)的Bitmap對(duì)象的代碼如下:Bitmapbitmap=Bitmap.createBitmap(newint[]{Color.RED,Color.GREEN,Color.BLUE,Color.MAGENTA},4,1,Config.RGB_565);createScaledBitmap(Bitmapsrc,intdstWidth,intdstHeight,booleanfilter)用于將源位圖縮放為指定寬度和高度的新的Bitmap對(duì)象
isRecycled()用于判斷Bitmap對(duì)象是否被回收
recycle()強(qiáng)制回收Bitmap對(duì)象
在Android中,還提供了一個(gè)BitmapFactory類(lèi),該類(lèi)為一個(gè)工具類(lèi),用于從不同的數(shù)據(jù)源來(lái)解析、創(chuàng)建Bitmap對(duì)象。BitmapFactory類(lèi)提供的創(chuàng)建Bitmap對(duì)象的常用方法如表11-3所示。表11-3BitmapFactory類(lèi)的常用方法例如,要解析SD卡上的圖片文件img01.jpg,并創(chuàng)建對(duì)應(yīng)的Bitmap對(duì)象可以使用下面的代碼:Stringpath="/sdcard/pictures/bccd/img01.jpg";Bitmapbm=BitmapFactory.decodeFile(path);要解析Drawable資源中保存的圖片文件img02.jpg,并創(chuàng)建對(duì)應(yīng)的Bitmap對(duì)象,可以使用下面的代碼:Bitmapbm=BitmapFactory.decodeResource(MainActivity.this.getResources(),R.drawable.img02);11.1.4BitmapFactory類(lèi)方法描述decodeFile(StringpathName)用于從給定的路徑所指定的文件中解析、創(chuàng)建Bitmap對(duì)象decodeFileDescriptor(FileDescriptorfd)用于從FileDescriptor對(duì)應(yīng)的文件中解析、創(chuàng)建Bitmap對(duì)象decodeResource(Resourcesres,intid)用于根據(jù)給定的資源ID從指定的資源中解析、創(chuàng)建Bitmap對(duì)象decodeStream(InputStreamis)用于從指定的輸入流中解析、創(chuàng)建Bitmap對(duì)象11.2繪制2D圖像11.2.1繪制幾何圖形11.2.2繪制文本11.2.3繪制路徑11.2.4繪制圖片在Android中,提供了非常強(qiáng)大的本機(jī)二維圖形庫(kù),用于繪制2D圖像。在Android應(yīng)用中,比較常用的是繪制幾何圖形、繪制文本、路徑和圖片等。下面分別進(jìn)行介紹。11.2繪制2D圖像比較常見(jiàn)的幾何圖形包括點(diǎn)、線、弧、圓形、矩形等。在Android中,Canvas類(lèi)提供了豐富的繪制幾何圖形的方法,通過(guò)這些方法可以繪制出各種幾何圖形。常用的繪制幾何圖形的方法如表11-4所示。表11-4Canvas類(lèi)提供的繪制幾何圖形的方法11.2.1繪制幾何圖形方法描述舉例繪圖效果drawArc(RectFoval,floatstartAngle,floatsweepAngle,booleanuseCenter,Paintpaint)繪制弧RectFrectf=newRectF(10,20,100,110);canvas.drawArc(rectf,0,60,true,paint);RectFrectf1=newRectF(10,20,100,110);canvas.drawArc(rectf1,0,60,false,paint);drawCircle(floatcx,floatcy,floatradius,Paintpaint)繪制圓形paint.setStyle(Style.STROKE);canvas.drawCircle(50,50,15,paint);drawLine(floatstartX,floatstartY,floatstopX,floatstopY,Paintpaint)繪制一條線canvas.drawLine(100,10,150,10,paint);drawLines(float[]pts,Paintpaint)繪制多條線canvas.drawLines(newfloat[]{10,10,30,10,30,10,15,30,15,30,10,10},paint);drawOval(RectFoval,Paintpaint)繪制橢圓RectFrectf=newRectF(40,20,80,40);canvas.drawOval(rectf,paint);drawPoint(floatx,floaty,Paintpaint)繪制一個(gè)點(diǎn)canvas.drawPoint(10,10,paint);Paintpaint=newPaint(); //創(chuàng)建一個(gè)采用默認(rèn)設(shè)置的畫(huà)筆paint.setAntiAlias(true); //使用抗鋸齒功能paint.setColor(Color.RED); //設(shè)置顏色為紅色paint.setStrokeWidth(2); //筆觸的寬度為2像素paint.setStyle(Style.STROKE); //填充樣式為描邊【例11-3】在Eclipse中創(chuàng)建Android項(xiàng)目,實(shí)現(xiàn)繪制5個(gè)不同顏色的圓形組成的圖案。(實(shí)例位置:光盤(pán)\MR\源碼\第11章\11-3)(1)修改新建項(xiàng)目的res/layout目錄下的布局文件main.xml,將默認(rèn)添加的線性布局管理器和TextView組件刪除,然后添加一個(gè)幀布局管理器,用于顯示自定義的繪圖類(lèi)。修改后的代碼如下:<?xmlversion="1.0"encoding="utf-8"?><FrameLayoutxmlns:android="/apk/res/android"android:id="@+id/frameLayout1"android:layout_width="fill_parent"drawPoints(float[]pts,Paintpaint)繪制多個(gè)點(diǎn)canvas.drawPoints(newfloat[]{10,10,15,10,20,15,25,10,30,10},paint);drawRect(floatleft,floattop,floatright,floatbottom,Paintpaint)繪制矩形canvas.drawRect(10,10,40,30,paint);drawRoundRect(RectFrect,floatrx,floatry,Paintpaint)繪制圓角矩形RectFrectf=newRectF(40,20,80,40);canvas.drawRoundRect(rectf,6,6,paint);android:layout_height="fill_parent"android:orientation="vertical"></FrameLayout>(2)打開(kāi)默認(rèn)創(chuàng)建的MainActivity,在該文件中,創(chuàng)建一個(gè)名稱(chēng)為MyView的內(nèi)部類(lèi),該類(lèi)繼承自android.view.View類(lèi),并添加構(gòu)造方法和重寫(xiě)onDraw(Canvascanvas)方法,關(guān)鍵代碼如下:publicclassMyViewextendsView{ publicMyView(Contextcontext){ super(context); } @Override protectedvoidonDraw(Canvascanvas){ super.onDraw(canvas); } }(3)在MainActivity的onCreate()方法中,獲取布局文件中添加的幀布局管理器,并將步驟(2)中創(chuàng)建的MyView視圖添加到該幀布局管理器中,關(guān)鍵代碼如下://獲取布局文件中添加的幀布局管理器FrameLayoutll=(FrameLayout)findViewById(R.id.frameLayout1);ll.addView(newMyView(this)); //將自定義的MyView視圖添加到幀布局管理器中(4)在DrawView的onDraw()方法中,首先指定畫(huà)布的背景色,然后創(chuàng)建一個(gè)采用默認(rèn)設(shè)置的畫(huà)筆,并設(shè)置該畫(huà)筆使用抗鋸齒功能,以及筆觸的寬度,再設(shè)置填充樣式為描邊,最后設(shè)置畫(huà)筆顏色并繪制圓形。具體代碼如下:canvas.drawColor(Color.WHITE); //指定畫(huà)布的背景色為白色Paintpaint=newPaint(); //創(chuàng)建采用默認(rèn)設(shè)置的畫(huà)筆paint.setAntiAlias(true); //使用抗鋸齒功能paint.setStrokeWidth(3); //設(shè)置筆觸的寬度paint.setStyle(Style.STROKE); //設(shè)置填充樣式為描邊paint.setColor(Color.BLUE);canvas.drawCircle(50,50,30,paint); //繪制藍(lán)色的圓形paint.setColor(Color.YELLOW);canvas.drawCircle(100,50,30,paint); //繪制黃色的圓形paint.setColor(Color.BLACK);canvas.drawCircle(150,50,30,paint); //繪制黑色的圓形paint.setColor(Color.GREEN);canvas.drawCircle(75,90,30,paint); //繪制綠色的圓形paint.setColor(Color.RED);canvas.drawCircle(125,90,30,paint); //繪制紅色的圓形運(yùn)行本實(shí)例,將顯示如圖11-4所示的運(yùn)行結(jié)果。圖11-4繪制5個(gè)不同顏色的圓形在Android中,雖然可以通過(guò)TextView或是圖片顯示文本,但是在開(kāi)發(fā)游戲時(shí),特別是開(kāi)發(fā)RPG(角色)類(lèi)游戲時(shí),會(huì)包含很多文字,使用TextView和圖片顯示文本不太合適,這時(shí),就需要通過(guò)繪制文本的方式來(lái)實(shí)現(xiàn)。Canvas類(lèi)提供了一系列的繪制文本的方法,下面分別進(jìn)行介紹。1.drawText()方法drawText()方法用于在畫(huà)布的指定位置繪制文字。該方法比較常用的語(yǔ)法格式如下:drawText(Stringtext,floatx,floaty,Paintpaint)在該語(yǔ)法中,參數(shù)text用于指定要繪制的文字;x用于指定文字的起始位置的x軸坐標(biāo);y用于指定文字的起始位置的y軸坐標(biāo);paint用于指定使用的畫(huà)筆。例如,要在畫(huà)布上輸出文字“明日科技”可以使用下面的代碼:PaintpaintText=newPaint();paintText.setTextSize(20);canvas.drawText("明日科技",165,65,paintText);2.drawPosText()方法drawPosText()方法也是用于在畫(huà)布上繪制文字,與drawText()方法不同的時(shí),11.2.2繪制文本使用該方法繪制字符串時(shí),需要為每個(gè)字符指定一個(gè)位置。該方法比較常用的語(yǔ)法格式如下:drawPosText(Stringtext,float[]pos,Paintpaint)在該語(yǔ)法中,參數(shù)text用于指定要繪制的文字;post用于指定每一個(gè)字符的位置;paint用于指定要使用的畫(huà)筆。例如,要在畫(huà)布上分兩行輸出文字“”,可以使用下面的代碼。PaintpaintText=newPaint();paintText.setTextSize(24);float[]pos=newfloat[]{80,215,105,215,130,215,80,240,105,240,130,240};canvas.drawPosText("很高興見(jiàn)到你",pos,paintText);【例11-4】在Eclipse中創(chuàng)建Android項(xiàng)目,實(shí)現(xiàn)繪制一個(gè)游戲?qū)Π捉缑?。(?shí)例位置:光盤(pán)\MR\源碼\第11章\11-4)(1)修改新建項(xiàng)目的res/layout目錄下的布局文件main.xml,將默認(rèn)添加的線性布局管理器和TextView組件刪除,然后添加一個(gè)幀布局管理器,并為其設(shè)置背景,用于顯示自定義的繪圖類(lèi),修改后的代碼如下:<FrameLayoutxmlns:android="/apk/res/android"android:id="@+id/frameLayout1"android:layout_width="fill_parent"android:layout_height="fill_parent“android:background="@drawable/background"android:orientation="vertical"></FrameLayout>(2)打開(kāi)默認(rèn)創(chuàng)建的MainActivity,在該文件中,創(chuàng)建一個(gè)名稱(chēng)為MyView的內(nèi)部類(lèi),該類(lèi)繼承自android.view.View類(lèi),并添加構(gòu)造方法和重寫(xiě)onDraw(Canvascanvas)方法,關(guān)鍵代碼如下:publicclassMyViewextendsView{ publicMyView(Contextcontext){ super(context); } @Override protectedvoidonDraw(Canvascanvas){ super.onDraw(canvas); } }(3)在MainActivity的onCreate()方法中,獲取布局文件中添加的幀布局管理器,并將步驟(2)中創(chuàng)建的MyView視圖添加到該幀布局管理器中,關(guān)鍵代碼如下:FrameLayoutll=(FrameLayout)findViewById(R.id.frameLayout1);ll.addView(newMyView(this)); //將自定義的MyView視圖添加到幀布局管理器中(4)在MyView的onDraw()方法中,首先創(chuàng)建一個(gè)采用默認(rèn)設(shè)置的畫(huà)筆,然后設(shè)置畫(huà)筆顏色,以及對(duì)齊方式、文字大小和使用抗鋸齒功能,再通過(guò)drawText()方法繪制一段文字,最后通過(guò)drawPosText()方法繪制文字。具體代碼如下:PaintpaintText=newPaint(); //創(chuàng)建一個(gè)采用默認(rèn)設(shè)置的畫(huà)筆paintText.setColor(0xFFFF6600); //設(shè)置畫(huà)筆顏色paintText.setTextAlign(Align.LEFT); //設(shè)置文字左對(duì)齊paintText.setTextSize(24); //設(shè)置文字大小paintText.setAntiAlias(true); //使用抗鋸齒功能canvas.drawText("不,我不想去!",520,75,paintText);//通過(guò)drawText()方法繪制文字//定義代表文字位置的數(shù)組float[]pos=newfloat[]{400,260,425,260,450,260,475,260, 363,290,388,290,413,290,438,290,463,290,488,290,513,290};canvas.drawPosText("你想和我一起去探險(xiǎn)嗎?",pos,paintText);//繪制文字運(yùn)行本實(shí)例,將顯示如圖11-5所示的運(yùn)行結(jié)果。圖11-5在畫(huà)布上繪制文字說(shuō)明:運(yùn)行本實(shí)例時(shí),需要將Android模擬器(AVD)修改為WSVGA模式。在Android中提供了繪制路徑的功能。繪制一條路徑可以分為創(chuàng)建路徑和繪制定義好的路徑兩部分,下面分別進(jìn)行介紹。1.創(chuàng)建路徑要?jiǎng)?chuàng)建路徑可以使用android.graphics.Path類(lèi)來(lái)實(shí)現(xiàn)。Path類(lèi)包含一組矢量繪圖方法,例如,繪制圓、矩形、弧、線條等。常用的繪圖方法如表11-5所示。表11-5Path類(lèi)的常用方法11.2.3繪制路徑方法描述
addArc(RectFoval,floatstartAngle,floatsweepAngle)添加弧形路徑
addCircle(floatx,floaty,floatradius,Path.Directiondir)添加圓形路徑
addOval(RectFoval,Path.Directiondir)添加橢圓形路徑
addRect(RectFrect,Path.Directiondir)添加矩形路徑
addRoundRect(RectFrect,floatrx,floatry,Path.Directiondir)添加圓角矩形路徑
說(shuō)明:在使用addCircle()、addOval()、addRect()和addRoundRect()方法時(shí),需要指定Path.Direction類(lèi)型的常量,可選值為Path.Direction.CW(順時(shí)針)和Path.Direction.CCW(逆時(shí)針)。例如,要?jiǎng)?chuàng)建一個(gè)順時(shí)針旋轉(zhuǎn)的圓形路徑可以使用下面的代碼。Pathpath=newPath(); //創(chuàng)建并實(shí)例化一個(gè)path對(duì)象path.addCircle(150,200,60,Path.Direction.CW); //在path對(duì)象中添加一個(gè)圓形路徑2.將定義好的路徑繪制在畫(huà)布上使用Canvas類(lèi)提供的drawPath()方法可以將定義好的路徑繪制在畫(huà)布上。說(shuō)明:在Android的Canvas類(lèi)中,還提供了另一個(gè)應(yīng)用路徑的方法drawTextOnPath(),也就是沿著指定的路徑繪制字符串。使用該方法可繪制環(huán)型文字。moveTo(floatx,floaty)設(shè)置開(kāi)始繪制直線的起始點(diǎn)
lineTo(floatx,floaty)在moveTo()方法設(shè)置的起始點(diǎn)與該方法指定的結(jié)束點(diǎn)之間畫(huà)一條直線,如果在調(diào)用該方法之前沒(méi)使用moveTo()方法設(shè)置起始點(diǎn),那么將從(0,0)點(diǎn)開(kāi)始繪制直線
quadTo(floatx1,floaty1,floatx2,floaty2)用于根據(jù)指定的的參數(shù)繪制一條線段軌跡
close()閉合路徑
【例11-5】在Eclipse中創(chuàng)建Android項(xiàng)目,實(shí)現(xiàn)在屏幕上繪制圓形路徑、折線路徑、三角形路徑,以及繞路徑的環(huán)形文字。(實(shí)例位置:光盤(pán)\MR\源碼\第11章\11-5)(1)修改新建項(xiàng)目的res/layout目錄下的布局文件main.xml,將默認(rèn)添加的線性布局管理器和TextView組件刪除,然后添加一個(gè)幀布局管理器,用于顯示自定義的繪圖類(lèi)。(2)打開(kāi)默認(rèn)創(chuàng)建的MainActivity,在該文件中,首先創(chuàng)建一個(gè)名稱(chēng)為MyView的內(nèi)部類(lèi),該類(lèi)繼承自android.view.View類(lèi),并添加構(gòu)造方法和重寫(xiě)onDraw(Canvascanvas)方法,然后在onCreate()方法中,獲取布局文件中添加的幀布局管理器,并將MyView視圖添加到該幀布局管理器中。(3)在MyView的onDraw()方法中,首先創(chuàng)建一個(gè)畫(huà)筆,并設(shè)置畫(huà)筆的相關(guān)屬性,然后創(chuàng)建并繪制一個(gè)圓形路徑、折線路徑和三角形路徑,最后再繪制繞路徑的環(huán)形文字。具體代碼如下:Paintpaint=newPaint(); //創(chuàng)建一個(gè)畫(huà)筆paint.setAntiAlias(true); //設(shè)置使用抗鋸齒功能paint.setColor(0xFFFF6600); //設(shè)置畫(huà)筆顏色paint.setTextSize(18); //設(shè)置文字大小paint.setStyle(Style.STROKE); //設(shè)置填充方式為描邊//繪制圓形路徑PathpathCircle=newPath(); //創(chuàng)建并實(shí)例化一個(gè)path對(duì)象pathCircle.addCircle(70,70,40,Path.Direction.CCW); //添加逆時(shí)針的圓形路徑canvas.drawPath(pathCircle,paint); //繪制路徑//繪制折線路徑PathpathLine=newPath(); //創(chuàng)建并實(shí)例化一個(gè)Path對(duì)象pathLine.moveTo(150,100); //設(shè)置起始點(diǎn)pathLine.lineTo(200,45); //設(shè)置第一段直線的結(jié)束點(diǎn)pathLine.lineTo(250,100); //設(shè)置第二段直線的結(jié)束點(diǎn)pathLine.lineTo(300,80); //設(shè)置第3段直線的結(jié)束點(diǎn)canvas.drawPath(pathLine,paint); //繪制路徑//繪制三角形路徑PathpathTr=newPath(); //創(chuàng)建并實(shí)例化一個(gè)path對(duì)象pathTr.moveTo(350,80); //設(shè)置起始點(diǎn)pathTr.lineTo(400,30); //設(shè)置第一條邊的結(jié)束點(diǎn),也是第二條邊的起始點(diǎn)pathTr.lineTo(450,80); //設(shè)置第二條邊的結(jié)束點(diǎn),也是第3條邊的起始點(diǎn)pathTr.close(); //閉合路徑canvas.drawPath(pathTr,paint); //繪制路徑//繪制繞路徑的環(huán)形文字Stringstr="風(fēng)蕭蕭兮易水寒,壯士一去兮不復(fù)還";Pathpath=newPath(); //創(chuàng)建并實(shí)例化一個(gè)path對(duì)象path.addCircle(550,100,48,Path.Direction.CW); //添加順時(shí)針的圓形路徑paint.setStyle(Style.FILL); //設(shè)置畫(huà)筆的填充方式canvas.drawTextOnPath(str,path,0,-18,paint); //繪制繞路徑文字運(yùn)行本實(shí)例,將顯示如圖11-6所示的運(yùn)行結(jié)果。圖11-6繪制路徑及繞路徑文字在Android中,Canvas類(lèi)不僅可以繪制幾何圖形、文件和路徑,還可用來(lái)繪制圖片。要想使用Canvas類(lèi)繪制圖片,只需要使用Canvas類(lèi)提供的如表14.6所示的方法來(lái)將Bitmap對(duì)象中保存的圖片繪制到畫(huà)布上即可。表11-6Canvas類(lèi)提供的繪制圖片的常用方法例如,從源位圖上“挖取”從(0,0)點(diǎn)到(500,300)點(diǎn)的一塊圖像,然后繪制到畫(huà)布的(50,50)點(diǎn)到(450,350)點(diǎn)所指區(qū)域,可以使用下面的代碼。Rectsrc=newRect(0,0,500,300); //設(shè)置挖取的區(qū)域Rectdst=newRect(50,50,450,350); //設(shè)置繪制的區(qū)域canvas.drawBitmap(bm,src,dst,paint); //繪制圖片11.2.4繪制圖片方法描述drawBitmap(Bitmapbitmap,Rectsrc,RectFdst,Paintpaint)用于從指定點(diǎn)繪制從源位圖中“挖取”的一塊drawBitmap(Bitmapbitmap,floatleft,floattop,Paintpaint)用于在指定點(diǎn)繪制位圖drawBitmap(Bitmapbitmap,Rectsrc,Rectdst,Paintpaint)用于從指定點(diǎn)繪制從源位圖中“挖取”的一塊11.3為圖像添加特效11.3.1旋轉(zhuǎn)圖像11.3.2縮放圖像11.3.3傾斜圖像11.3.4平移圖像11.3.5使用BitmapShader渲染圖像在Android中,不僅可以繪制圖形,還可以為圖形添加特效。例如,對(duì)圖形進(jìn)行旋轉(zhuǎn)、縮放、傾斜、扭曲和渲染等。下面將分別介紹如何為圖形添加這些特效。11.3為圖像添加特效使用Android提供的android.graphics.Matrix類(lèi)的setRotate()、postRotate()和preRotate()方法,可以對(duì)圖像進(jìn)行旋轉(zhuǎn)。說(shuō)明:在AndroidAPI中,提供了3種方式,即setXXX()、postXXX()和preXXX()方法,其中,setXXX()方法用于直接設(shè)置Matrix的值,每使用一次setXXX()方法,整個(gè)Matrix都會(huì)變掉;postXXX()方法用于采用后乘的方式為Matrix設(shè)置值,可以連續(xù)多次使用post完成多個(gè)變換;preXXX()方法用于采用前乘的方式為Matrix設(shè)置值,使用preXXX()方法設(shè)置的操作最先發(fā)生。由于這3個(gè)方法除了方法名不同外,其他語(yǔ)法格式均相同,下面將以setRotate()方法為例來(lái)介紹其語(yǔ)法格式。setRotate()方法有以下兩種語(yǔ)法格式。setRotate(floatdegrees)使用該語(yǔ)法格式可以控制Matrix進(jìn)行旋轉(zhuǎn),float類(lèi)型的參數(shù)用于指定旋轉(zhuǎn)的角度。例如,創(chuàng)建一個(gè)Matrix的對(duì)象,并將它旋轉(zhuǎn)30度,可以使用下面的代碼。Matrixmatrix=newMatrix(); //創(chuàng)建一個(gè)Matrix的對(duì)象matrix.setRotate(30); //將Matrix的對(duì)象旋轉(zhuǎn)30度11.3.1旋轉(zhuǎn)圖像setRotate(floatdegrees,floatpx,floatpy)使用該語(yǔ)法格式可以控制Matrix以參數(shù)px和py為軸心進(jìn)行旋轉(zhuǎn),float類(lèi)型的參數(shù)用于指定旋轉(zhuǎn)的角度。例如,創(chuàng)建一個(gè)Matrix的對(duì)象,并將它以(10,10)為軸心旋轉(zhuǎn)30度,可以使用下面的代碼。Matrixmatrix=newMatrix(); //創(chuàng)建一個(gè)Matrix的對(duì)象matrix.setRotate(30,10,10); //將Matrix的對(duì)象旋轉(zhuǎn)30度創(chuàng)建Matrix的對(duì)象,并對(duì)其進(jìn)行旋轉(zhuǎn)后,還需要應(yīng)用該Matrix對(duì)圖像或組件進(jìn)行控制。在Canvas類(lèi)中提供了一個(gè)drawBitmap(Bitmapbitmap,Matrixmatrix,Paintpaint)方法,可以在繪制圖像的同時(shí)應(yīng)用Matrix上的變化。例如,我們需要將一個(gè)圖像旋轉(zhuǎn)30度后,再繪制到畫(huà)布上可以使用下面的代碼。Paintpaint=newPaint();Bitmapbitmap=BitmapFactory.decodeResource(MainActivity.this.getResources(),R.drawable.rabbit);Matrixmatrix=newMatrix();matrix.setRotate(30);canvas.drawBitmap(bitmap,matrix,paint);【例11-6】在Eclipse中創(chuàng)建Android項(xiàng)目,實(shí)現(xiàn)應(yīng)用Matrix旋轉(zhuǎn)圖像。(實(shí)例位置:光盤(pán)\MR\源碼\第11章\11-6)(1)修改新建項(xiàng)目的res/layout目錄下的布局文件main.xml,將默認(rèn)添加的線性布局管理器和TextView組件刪除,然后添加一個(gè)幀布局管理器,用于顯示自定義的繪圖類(lèi)。(2)打開(kāi)默認(rèn)創(chuàng)建的MainActivity,在該文件中,首先創(chuàng)建一個(gè)名稱(chēng)為MyView的內(nèi)部類(lèi),該類(lèi)繼承自android.view.View類(lèi),并添加構(gòu)造方法和重寫(xiě)onDraw(Canvascanvas)方法,然后在onCreate()方法中,獲取布局文件中添加的幀布局管理器,并將MyView視圖添加到該幀布局管理器中。(3)在MyView的onDraw()方法中,首先定義一個(gè)畫(huà)筆,并繪制一張背景圖像,然后在(0,0)點(diǎn)的位置繪制要旋轉(zhuǎn)圖像的原圖,再繪制以(0,0)點(diǎn)為軸心旋轉(zhuǎn)30度的圖像,最后繪制以(87,87)點(diǎn)為軸心旋轉(zhuǎn)90度的圖像,具體代碼如下:Paintpaint=newPaint(); //定義一個(gè)畫(huà)筆Bitmapbitmap_bg=BitmapFactory.decodeResource(MainActivity.this.getResources(),R.drawable.background);canvas.drawBitmap(bitmap_bg,0,0,paint); //繪制背景圖像Bitmapbitmap_rabbit=BitmapFactory.decodeResource(MainActivity.this.getResources(),R.drawable.rabbit);canvas.drawBitmap(bitmap_rabbit,0,0,paint); //繪制原圖//應(yīng)用setRotate(floatdegrees)方法旋轉(zhuǎn)圖像Matrixmatrix=newMatrix();matrix.setRotate(30); //以(0,0)點(diǎn)為軸心轉(zhuǎn)換30度canvas.drawBitmap(bitmap_rabbit,matrix,paint); //繪制圖像并應(yīng)用matrix的變換//應(yīng)用setRotate(floatdegrees,floatpx,floatpy)方法旋轉(zhuǎn)圖像Matrixm=newMatrix();m.setRotate(90,87,87); //以(87,87)點(diǎn)為軸心轉(zhuǎn)換90度canvas.drawBitmap(bitmap_rabbit,m,paint); //繪制圖像并應(yīng)用matrix的變換運(yùn)行本實(shí)例,將顯示如圖11-7所示的運(yùn)行結(jié)果。圖11-7旋轉(zhuǎn)圖像使用Android提供的android.graphics.Matrix類(lèi)的setScale()、postScale()和、preScale()方法,可對(duì)圖像進(jìn)行縮放。由于這3個(gè)方法除了方法名不同外,其他語(yǔ)法格式均相同,下面將以setScale()方法為例來(lái)介紹其語(yǔ)法格式。setScale()方法有以下兩種語(yǔ)法格式。setScale(floatsx,floatsy)使用該語(yǔ)法格式可以控制Matrix進(jìn)行縮放,參數(shù)sx和sy用于指定X軸和Y軸的縮放比例。例如,創(chuàng)建一個(gè)Matrix的對(duì)象,并將它在X軸上縮放30%,Y軸上縮放20%,可以使用下面的代碼。Matrixmatrix=newMatrix(); //創(chuàng)建一個(gè)Matrix的對(duì)象matrix.setScale(0.3f,0.2f); //縮放Matrix對(duì)象setScale(floatsx,floatsy,floatpx,floatpy)使用該語(yǔ)法格式可以控制Matrix以參數(shù)px和py為軸心進(jìn)行縮放,參數(shù)sx和sy用于指定X軸和Y軸的縮放比例。例如,創(chuàng)建一個(gè)Matrix的對(duì)象,并將它以(100,100)為軸心,在X軸和Y軸均縮放30%,可以使用下面的代碼。Matrixmatrix=newMatrix(); //創(chuàng)建一個(gè)Matrix的對(duì)象matrix.setScale(30,30,100,100); //縮放Matrix對(duì)象11.3.2縮放圖像創(chuàng)建Matrix的對(duì)象,并對(duì)其進(jìn)行縮放后,還需要應(yīng)用該Matrix對(duì)圖像或組件進(jìn)行控制。同旋轉(zhuǎn)圖像一樣,也可應(yīng)用Canvas類(lèi)中提供的drawBitmap(Bitmapbitmap,Matrixmatrix,Paintpaint)方法,在繪制圖像的同時(shí)應(yīng)用Matrix上的變化。下面我們將通過(guò)一個(gè)具體的實(shí)例來(lái)說(shuō)明如何對(duì)圖像進(jìn)行縮放?!纠?1-7】在Eclipse中創(chuàng)建Android項(xiàng)目,實(shí)現(xiàn)應(yīng)用Matrix縮放圖像。。(實(shí)例位置:光盤(pán)\MR\源碼\第11章\11-7)(1)修改新建項(xiàng)目的res/layout目錄下的布局文件main.xml,將默認(rèn)添加的線性布局管理器和TextView組件刪除,然后添加一個(gè)幀布局管理器,用于顯示自定義的繪圖類(lèi)。(2)打開(kāi)默認(rèn)創(chuàng)建的MainActivity,在該文件中,首先創(chuàng)建一個(gè)名稱(chēng)為MyView的內(nèi)部類(lèi),該類(lèi)繼承自android.view.View類(lèi),并添加構(gòu)造方法和重寫(xiě)onDraw(Canvascanvas)方法,然后在onCreate()方法中,獲取布局文件中添加的幀布局管理器,并將MyView視圖添加到該幀布局管理器中。(3)在MyView的onDraw()方法中,首先定義一個(gè)畫(huà)筆,并繪制一張背景圖像,然后繪制以(0,0)點(diǎn)為軸心在X軸和Y軸上均縮放200%的圖像,再繪制以(156,156)點(diǎn)為軸心在X軸和Y軸上均縮放80%的圖像,最后在(0,0)點(diǎn)的位置繪制要縮放圖像的原圖,具體代碼如下:Paintpaint=newPaint(); //定義一個(gè)畫(huà)筆paint.setAntiAlias(true);Bitmapbitmap_bg=BitmapFactory.decodeResource(MainActivity.this.getResources(),R.drawable.background);canvas.drawBitmap(bitmap_bg,0,0,paint); //繪制背景Bitmapbitmap_rabbit=BitmapFactory.decodeResource(MainActivity.this.getResources(),R.drawable.rabbit);//應(yīng)用setScale(floatsx,floatsy)方法縮放圖像Matrixmatrix=newMatrix();matrix.setScale(2f,2f); //以(0,0)點(diǎn)為軸心將圖像在X軸和Y軸均縮放200%canvas.drawBitmap(bitmap_rabbit,matrix,paint); //繪制圖像并應(yīng)用matrix的變換//應(yīng)用setScale(floatsx,floatsy,floatpx,floatpy)方法縮放圖像Matrixm=newMatrix();m.setScale(0.8f,0.8f,156,156); //以(156,156)點(diǎn)為軸心將圖像在X軸和Y軸均縮放80%canvas.drawBitmap(bitmap_rabbit,m,paint); //繪制圖像并應(yīng)用matrix的變換canvas.drawBitmap(bitmap_rabbit,0,0,paint); //繪制原圖運(yùn)行本實(shí)例,將顯示如圖11-8所示的運(yùn)行結(jié)果。圖11-8縮放圖像使用Android提供的android.graphics.Matrix類(lèi)的setSkew()、postSkew()和、preSkew()方法,可對(duì)圖像進(jìn)行傾斜。由于這3個(gè)方法除了方法名不同外,其他語(yǔ)法格式均相同,下面將以setSkew()方法為例來(lái)介紹其語(yǔ)法格式。setSkew()方法有以下兩種語(yǔ)法格式。setSkew(floatkx,floatky)使用該語(yǔ)法格式可以控制Matrix進(jìn)行傾斜,參數(shù)sx和sy用于指定X軸和Y軸的傾斜量。例如,創(chuàng)建一個(gè)Matrix的對(duì)象,并將它在X軸上傾斜0.3,Y軸上不傾斜,可以使用下面的代碼。Matrixmatrix=newMatrix(); //創(chuàng)建一個(gè)Matrix的對(duì)象matrix.setScale(0.3f,0); //傾斜Matrix對(duì)象setSkew(floatkx,floatky,floatpx,floatpy)使用該語(yǔ)法格式可以控制Matrix以參數(shù)px和py為軸心進(jìn)行傾斜,參數(shù)sx和sy用于指定X軸和Y軸的傾斜量。例如,創(chuàng)建一個(gè)Matrix的對(duì)象,并將它以(100,100)為軸心,在X軸和Y軸均傾斜0.1,可以使用下面的代碼。Matrixmatrix=newMatrix(); //創(chuàng)建一個(gè)Matrix的對(duì)象matrix.setScale(0.1f,0.1f,100,100); //縮放Matrix對(duì)象創(chuàng)建Matrix的對(duì)象,并對(duì)其進(jìn)行傾斜后,還需要應(yīng)用該Matrix對(duì)圖像或組件11.3.3傾斜圖像進(jìn)行控制。同旋轉(zhuǎn)圖像一樣,也可應(yīng)用Canvas類(lèi)中提供的drawBitmap(Bitmapbitmap,Matrixmatrix,Paintpaint)方法,在繪制圖像的同時(shí)應(yīng)用Matrix上的變化。下面我們將通過(guò)一個(gè)具體的實(shí)例來(lái)說(shuō)明如何對(duì)圖像進(jìn)行傾斜?!纠?1-8】在Eclipse中創(chuàng)建Android項(xiàng)目,實(shí)現(xiàn)應(yīng)用Matrix傾斜圖像。。(實(shí)例位置:光盤(pán)\MR\源碼\第11章\11-8)(1)修改新建項(xiàng)目的res/layout目錄下的布局文件main.xml,將默認(rèn)添加的線性布局管理器和TextView組件刪除,然后添加一個(gè)幀布局管理器,用于顯示自定義的繪圖類(lèi)。(2)打開(kāi)默認(rèn)創(chuàng)建的MainActivity,在該文件中,首先創(chuàng)建一個(gè)名稱(chēng)為MyView的內(nèi)部類(lèi),該類(lèi)繼承自android.view.View類(lèi),并添加構(gòu)造方法和重寫(xiě)onDraw(Canvascanvas)方法,然后在onCreate()方法中,獲取布局文件中添加的幀布局管理器,并將MyView視圖添加到該幀布局管理器中。(3)在MyView的onDraw()方法中,首先定義一個(gè)畫(huà)筆,并繪制一張背景圖像,然后繪制以(0,0)點(diǎn)為軸心在X軸上傾斜2,在Y軸上傾斜1的圖像,再繪制以(78,69)點(diǎn)為軸心在X軸上傾斜-0.5的圖像,最后在(0,0)點(diǎn)的位置繪制要縮放圖像的原圖,具體代碼如下:Paintpaint=newPaint(); //定義一個(gè)畫(huà)筆paint.setAntiAlias(true);Bitmapbitmap_bg=BitmapFactory.decodeResource(MainActivity.this.getResources(),R.drawable.background);canvas.drawBitmap(bitmap_bg,0,0,paint); //繪制背景Bitmapbitmap_rabbit=BitmapFactory.decodeResource(MainActivity.this.getResources(),R.drawable.rabbit);//應(yīng)用setSkew(floatsx,floatsy)方法傾斜圖像Matrixmatrix=newMatrix();matrix.setSkew(2f,1f); //以(0,0)點(diǎn)為軸心將圖像在X軸上傾斜2,在Y軸上傾斜1canvas.drawBitmap(bitmap_rabbit,matrix,paint);//繪制圖像并應(yīng)用matrix的變換//應(yīng)用setSkew(floatsx,floatsy,floatpx,floatpy)方法傾斜圖像Matrixm=newMatrix();m.setSkew(-0.5f,0f,78,69); //以(78,69)點(diǎn)為軸心將圖像在X軸上傾斜-0.5canvas.drawBitmap(bitmap_rabbit,m,paint); //繪制圖像并應(yīng)用matrix的變換canvas.drawBitmap(bitmap_rabbit,0,0,paint); //繪制原圖運(yùn)行本實(shí)例,將顯示如圖11-9所示的運(yùn)行結(jié)果。圖11-9傾斜圖像使用Android提供的android.graphics.Matrix類(lèi)的setTranslate()、postTranslate()和、preTranslate()方法,可對(duì)圖像進(jìn)行平移。由于這3個(gè)方法除了方法名不同外,其他語(yǔ)法格式均相同,下面將以setTranslate()方法為例來(lái)介紹其語(yǔ)法格式。setTranslate()方法的語(yǔ)法格式如下:setTranslate(floatdx,floatdy)在該語(yǔ)法中,參數(shù)dx和dy用于指定將Matrix移動(dòng)到的位置的X和Y坐標(biāo)。例如,創(chuàng)建一個(gè)Matrix的對(duì)象,并將它平移到(100,100)的位置,可以使用下面的代碼。Matrixmatrix=newMatrix(); //創(chuàng)建一個(gè)Matrix的對(duì)象matrix.setTranslate(100,50); //將matrix平移到(100,50)的位置創(chuàng)建Matrix的對(duì)象,并對(duì)其進(jìn)行平移后,還需要應(yīng)用該Matrix對(duì)圖像或組件進(jìn)行控制。同旋轉(zhuǎn)圖像一樣,也可應(yīng)用Canvas類(lèi)中提供的drawBitmap(Bitmapbitmap,Matrixmatrix,Paintpaint)方法,在繪制圖像的同時(shí)應(yīng)用Matrix上的變化。下面我們將通過(guò)一個(gè)具體的實(shí)例來(lái)說(shuō)明如何對(duì)圖像進(jìn)行傾斜。11.3.4平移圖像【例11-9】在Eclipse中創(chuàng)建Android項(xiàng)目,實(shí)現(xiàn)應(yīng)用Matrix將圖像旋轉(zhuǎn)后再平移。(實(shí)例位置:光盤(pán)\MR\源碼\第11章\11-9)(1)修改新建項(xiàng)目的res/layout目錄下的布局文件main.xml,將默認(rèn)添加的線性布局管理器和TextView組件刪除,然后添加一個(gè)幀布局管理器,用于顯示自定義的繪圖類(lèi)。(2)打開(kāi)默認(rèn)創(chuàng)建的MainActivity,在該文件中,首先創(chuàng)建一個(gè)名稱(chēng)為MyView的內(nèi)部類(lèi),該類(lèi)繼承自android.view.View類(lèi),并添加構(gòu)造方法和重寫(xiě)onDraw(Canvascanvas)方法,然后在onCreate()方法中,獲取布局文件中添加的幀布局管理器,并將MyView視圖添加到該幀布局管理器中。(3)在MyView的onDraw()方法中,首先定義一個(gè)畫(huà)筆,并繪制一張背景圖像,然后在(0,0)點(diǎn)的位置繪制要縮放圖像的原圖,再創(chuàng)建一個(gè)Matrix的對(duì)象,并將其旋轉(zhuǎn)30度后,再將其平移動(dòng)指定位置,最后繪制應(yīng)用Matrix變換的圖像,具體代碼如下:Paintpaint=newPaint(); //定義一個(gè)畫(huà)筆paint.setAntiAlias(true); //使用抗鋸齒功能Bitmapbitmap_bg=BitmapFactory.decodeResource(MainActivity.this.getResources(),R.drawable.background);canvas.drawBitmap(bitmap_bg,0,0,paint); //繪制背景Bitmapbitmap_rabbit=BitmapFactory.decodeResource(MainActivity.this.getResources(),R.drawable.rabbit);canvas.drawBitmap(bitmap_rabbit,0,0,paint); //繪制原圖Matrixmatrix=newMatrix(); //創(chuàng)建一個(gè)Matrix的對(duì)象matrix.setRotate(30); //將matrix旋轉(zhuǎn)30度matrix.postTranslate(100,50); //將matrix平移到(100,50)的位置canvas.drawBitmap(bitmap_rabbit,matrix,paint);//繪制圖像并應(yīng)用matrix的變換運(yùn)行本實(shí)例,將顯示如圖11-10所示的運(yùn)行結(jié)果。圖11-10旋轉(zhuǎn)并平移圖像11.3.5使用BitmapShader渲染圖像在Android中,提供的BitmapShader類(lèi)主要用來(lái)渲染圖像。如果需要將一張圖片裁剪成橢圓或圓形等形狀顯示到屏幕上時(shí),就可以使用BitmapShader類(lèi)來(lái)實(shí)現(xiàn)。使用BitmapShader來(lái)渲染圖像的基本步驟如下。(1)創(chuàng)建BitmapShader類(lèi)的對(duì)象,可以通過(guò)以下的構(gòu)造方法進(jìn)行創(chuàng)建。BitmapShader(Bitmapbitmap,Shader.TileModetileX,Shader.TileModetileY)其中的bitmap參數(shù)用于指定一個(gè)位圖對(duì)象,通常是要用來(lái)渲染的原圖像;tileX參數(shù)用于指定在水平方向上圖像的重復(fù)方式;tileX參數(shù)用于指定在垂直方向上圖像的重復(fù)方式。例如,要?jiǎng)?chuàng)建一個(gè)在水平方向上重復(fù)、在垂直方向上鏡像的BitmapShader對(duì)象可以使用下面的代碼:BitmapShaderbitmapshader=newBitmapShader(bitmap_bg,TileMode.REPEAT,TileMode.MIRROR);說(shuō)明:Shader.TileMode類(lèi)型的參數(shù)包括CLAMP、MIRROR和REPEAT3個(gè)可選值,其中,CLAMP為使用邊界顏色來(lái)填充剩余的空間;MIRROR為采用鏡像方式;REPEAT為采用復(fù)復(fù)方式。(2)通過(guò)Paint的setShader()方法來(lái)設(shè)置渲染對(duì)象。(3)在繪制圖像時(shí),使用已經(jīng)設(shè)置了setShader()方法的畫(huà)筆。下面通過(guò)一個(gè)具體的實(shí)例來(lái)說(shuō)明如何使用BitmapShader渲染圖像?!纠?1-10】在Eclipse中創(chuàng)建Android項(xiàng)目,應(yīng)用BitmapShader實(shí)現(xiàn)平鋪的畫(huà)布背景和橢圓形的圖片。(實(shí)例位置:光盤(pán)\MR\源碼\第11章\11-10)(1)修改新建項(xiàng)目的res/layout目錄下的布局文件main.xml,將默認(rèn)添加的線性布局管理器和TextView組件刪除,然后添加一個(gè)幀布局管理器,用于顯示自定義的繪圖類(lèi)。(2)打開(kāi)默認(rèn)創(chuàng)建的MainActivity,在該文件中,首先創(chuàng)建一個(gè)名稱(chēng)為MyView的內(nèi)部類(lèi),該類(lèi)繼承自android.view.View類(lèi),并添加構(gòu)造方法和重寫(xiě)onDraw(Canvascanvas)方法,然后在onCreate()方法中,獲取布局文件中添加的幀布局管理器,并將MyView視圖添加到該幀布局管理器中。(3)在MyView的onDraw()方法中,首先定義一個(gè)畫(huà)筆,并設(shè)置其使用抗鋸齒功能,然后應(yīng)用BitmapShader實(shí)現(xiàn)平鋪的畫(huà)布背景,這里使用的是一張機(jī)器人圖片,接下來(lái)再繪制一張橢圓形的圖片,具體代碼如下:Paintpaint=newPaint(); //定義一個(gè)畫(huà)筆paint.setAntiAlias(true); //使用抗鋸齒功能Bitmapbitmap_
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025商住樓項(xiàng)目節(jié)能評(píng)估報(bào)告表-圖文
- 2025年中國(guó)環(huán)境監(jiān)測(cè)用χγ吸收劑量率儀行業(yè)市場(chǎng)全景分析及投資策略研究報(bào)告
- “專(zhuān)屬生活”個(gè)性化定制服務(wù)商業(yè)計(jì)劃書(shū)
- 以問(wèn)題為導(dǎo)向:高中語(yǔ)文泰微課設(shè)計(jì)與應(yīng)用探索
- 2025年中國(guó)棉籽油行業(yè)市場(chǎng)發(fā)展監(jiān)測(cè)及投資方向研究報(bào)告
- 以賽促教:首屆全國(guó)大學(xué)英語(yǔ)教學(xué)比賽獲獎(jiǎng)教師課堂語(yǔ)用知識(shí)教學(xué)剖析
- 2025年中國(guó)玉石玻璃行業(yè)市場(chǎng)調(diào)研分析及投資戰(zhàn)略規(guī)劃報(bào)告
- 以詞塊為翼展高一英語(yǔ)寫(xiě)作新程:理論、實(shí)踐與成效探究
- 重慶金屬置物架項(xiàng)目實(shí)施方案
- 綦江區(qū)智能電網(wǎng)項(xiàng)目投資分析報(bào)告
- 工期的保證體系及保證措施
- 食用油儲(chǔ)存期品質(zhì)變化的太赫茲光譜無(wú)損識(shí)別
- 胎盤(pán)早剝預(yù)案演練腳本
- 五山文學(xué)全集第一卷
- 聚磷腈功能高分子材料的合成及應(yīng)用
- 中國(guó)鐵路總公司《鐵路技術(shù)管理規(guī)程》(高速鐵路部分)2014年7月
- 鈣加維生素Dppt課件(PPT 14頁(yè))
- TRD深基坑止水帷幕施工方案(22頁(yè))
- 企業(yè)組織架構(gòu)圖模板
- 藏醫(yī)院制劑中心建設(shè)項(xiàng)目建議書(shū)寫(xiě)作模板-定制
- 鋼結(jié)構(gòu)舞臺(tái)施工方案
評(píng)論
0/150
提交評(píng)論