Android課件――第四章 Android 圖形圖像_第1頁
Android課件――第四章 Android 圖形圖像_第2頁
Android課件――第四章 Android 圖形圖像_第3頁
Android課件――第四章 Android 圖形圖像_第4頁
Android課件――第四章 Android 圖形圖像_第5頁
已閱讀5頁,還剩37頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第四章 Android 圖形圖像,4.1Drawable和ShapDrawable 4.2 NinePatchDrawable 4.3 Bitmap和BitmapFactory 4.4 繪圖-Canvas、Paint、Path 4.5 特效-Matrix、Shader 4.6 Tween動畫和Frame動畫 4.7 SurfaceView 4.8 OpenGL,4.1 Drawable和ShapDrawable,Drawable Drawable是一個通用的抽象類,它的目的是告訴你什么東西是可以畫的。你會發(fā)現(xiàn)基于Drawable類擴展出各種繪圖的類包括:BitmapDrawable、Shape

2、Drawable、PictureDrawable、LayerDrawable,當然你可以繼承它來創(chuàng)建你自己的繪圖類。 定義和實例化一個Drawable 從資源圖像文件中創(chuàng)建 從XML文件中創(chuàng)建,從資源圖像文件中創(chuàng)建 一個比較簡單的方法是添加一個圖片到你的程序中,然后通過資源文件引用這個文件,支持的文件類型有PNG(首選的) JPG(可接受的)GIF(不建議)。 圖片資源添加到res/drawable/目錄中 引用它到你的代碼或你的XML布局中 引用它也可以用資源編號,從XML文件中創(chuàng)建 圖片資源添加到res/drawable/目錄中 在XML中定義Drawable 引用它也可以用資源編號,Sh

3、apeDrawable 畫一些動態(tài)的2D圖片,ShapeDrawable繼承了Drawable,所以你可以調(diào)用Drawable里有的函數(shù),4.2 NinePatchDrawable,NinePatchDrawable 繪畫的是一個可以伸縮的位圖圖像,Android會自動調(diào)整大小來容納顯示的內(nèi)容。NinePatchDrawable是一個標準的PNG圖像,它包括額外的1個像素的邊界,你必須保存它后綴為.9.png,并且保持到工程的res/drawable目錄中。 Android提供繪制工具,4.3 Bitmap和BitmapFactory,Bitmap 方式1: 建立空的BitmapBitmapv

4、Bitmap=Bitmap.createBitmap(vWidth,vHeight,); 方式2: 取得Resource 的Bitmap BitmapvBitmap=BitmapFactory.decodeResource(vContext.getResources(),R.drawable.); 方式3: 取得圖檔的BitmapBitmapvBitmap=BitmapFactory.decodeStream(vContentResolver.openInputStream(uri);,要獲取位圖信息,比如位圖大小、像素、density、透明度、顏色格式等,獲取得到Bitmap就迎刃而解了,這

5、里只是輔助說明以下2點: 在Bitmap中對RGB顏色格式使用Bitmap.Config定義,僅包括ALPHA_8、ARGB_4444、ARGB_8888、RGB_565,缺少了一些其他的,比如說RGB_555,在開發(fā)中可能需要注意這個小問題; Bitmap還提供了compress()接口來壓縮圖片,不過AndroidSAK只支持PNG、JPG格式的壓縮;其他格式的需要Android開發(fā)人員自己補充了。,4.4 繪圖-Canvas、Paint、Path,Canvas,在Android中,把Canvas當做畫布,可以在畫布上繪制我們想要的任何東西。 方法: clipXXX 裁剪,通過Path,

6、Rect ,Region 的不同組合,幾乎可以支持任意現(xiàn)狀的裁剪區(qū)域。如: ClipPath, ClipRect, ClipRegion drawXXX 繪制,可繪制圖片,圖形等。如:drawBtimap、drawLine save() 方法作用:用來保存canvas狀態(tài)的。save()時可以得到一個返回值,是用來確定保存時間的。使用restoreToCount()方法時可以把此值當參數(shù)傳遞,可以還原到指定的保存時間。 restore() 方法作用:用來恢復canvas狀態(tài)的,還原到上一次savie()時的狀態(tài)。,translate() translate(floatdx,floatdy);

7、方法作用:移動canvas和它的原點到不同的位置上。默認原點坐標為(0,0) 參數(shù):dx,左右偏移量(正數(shù)是向右移動) dy,上下偏移量(正數(shù)是向下移動) rotate() rotate(floatdegrees); 方法作用:以原點為中心對canvas旋轉(zhuǎn)。默認原點坐標為(0,0) 參數(shù):degrees 旋轉(zhuǎn)弧度 Scale() scale(floatsx,floatsy); 方法作用:增減圖形在canvas中的像素數(shù)目,對形狀,位圖進行縮小或者放大。 參數(shù):sx,橫軸縮放大小 sy,數(shù)軸縮放大小 scale(floatsx,floatsy,floatpx,floatpy); px,設置原點

8、的位置(與rotate中的px正好相反,正數(shù)是向左移動) py,設置原點的位置(與rotate中的py正好相反,正數(shù)是向上移動),什么是Paint? Paint類包含樣式和顏色有關如何繪制幾何形狀,文本和位圖的信息。Canvas是一塊畫布,具體的文本和位圖如何顯示,這就是在Paint類中定義了。 Paint有哪些功能? 字體、大?。═extSize)、顏色 (TextColor)、對齊方式(TextAlign)、粗體(Bold)、斜體(Italic)、下劃線(Underline)等 字體類型:Typeface類(BOLD,BOLD_ITALIC,ITALIC,NORMAL) 使用Paint顯示

9、String Paint p = new Paint();String familyName = “宋體”;Typeface font = Typeface.create(familyName,Typeface.BOLD);p.setColor(Color.RED);p.setTypeface(font);p.setTextSize(22);canvas.drawText(mstrTitle,0,100,p);,Path,對于Android游戲開發(fā)或者說2D繪圖中來講Path 路徑可以用強大這個詞來形容。在Photoshop中我們可能還記得使用鋼筆工具繪制路徑的方法。Path路徑類在位于 an

10、droid .graphics.Path中,Path的構(gòu)造方法比較簡單,如下 Path cwj=new Path(); /構(gòu)造方法 下面我們畫一個封閉的原型路徑,我們使用Path類的addCircle方法 cwj.addCircle(10,10,50,Direction.CW); /參數(shù)一為x軸水平位置,參數(shù)二為y軸垂直位置,第三個參數(shù)為圓形的半徑,最后是繪制的方向,CW為順時針方向,而CCW是逆時針方向cwj.addCircle(10,10,50,Direction.CW); /參數(shù)一為x軸水平位置,參數(shù)二為y軸垂直位置,第三個參數(shù)為圓形的半徑,最后是繪制的方向,CW為順時針方向,而CCW是

11、逆時針方向,結(jié)合Android上次提到的Canvas類中的繪制方法drawPath和drawTextOnPath,我們繼續(xù)可以在onDraw中加入。 canvas.drawPath(cwj,paintPath); /大家這里paintPath為路徑的畫刷顏色,可以見下文完整的源代碼。 canvas.drawTextOnPath(“The9- CWJ,cwj,0,15,paintText); /將文字繪制到路徑中去 canvas.drawPath(cwj,paintPath); /大家這里paintPath為路徑的畫刷顏色。 canvas.drawTextOnPath(“The9- CWJ,cw

12、j, 0, 15,paintText); /將文字繪制到路徑中去,4.5 特效-Matrix、Shader,Matrix,Matrix類擁有一個3x3矩陣轉(zhuǎn)換坐標。它必須被顯式初始化的使用復位()或者-構(gòu)造一個矩陣函數(shù)(如setTranslate,setRotate等)。 Matrix的操作,總共分為translate(平移),rotate(旋轉(zhuǎn)),scale(縮放)和skew(傾斜)四種 Matrix 提供set, post和pre三種操作方式,除了translate,其他三種操作都可以指定中心點。 set是直接設置Matrix的值,每次set一次,整個Matrix的數(shù)組都會變掉。 post

13、是后乘,當前的矩陣乘以參數(shù)給出的矩陣??梢赃B續(xù)多次使用post,來完成所需的整個變換。例如,要將一個圖片旋轉(zhuǎn)30度,然后平移到(100,100)的地方,那么可以這樣做:,Matrixm=newMatrix(); m.postRotate(30); m.postTranslate(100,100); pre是前乘,參數(shù)給出的矩陣乘以當前的矩陣。所以操作是在當前矩陣的最前面發(fā)生的。例如上面的例子,如果用pre的話,就要這樣: Matrixm=newMatrix(); m.setTranslate(100,100); m.preRotate(30); 旋轉(zhuǎn)、縮放和傾斜都可以圍繞一個中心點來進行,如果

14、不指定,默認情況下,是圍繞(0,0)點來進行。,Shader Android中提供了Shader類專門用來渲染圖像以及一些幾何圖形 Shader shader = new BitmapShader(.) Shader shader = new LinearGradient(.) Paint paint = new Paint(); Paint.setShader(shader);,4.6 Tween動畫和Frame動畫,Android平臺提供了兩類動畫,分別是Tween動畫和Frame動畫。 Tween通過場景里的對象不斷的進行圖片的變換,比如平移、漸變、縮放、旋轉(zhuǎn)等來產(chǎn)生動畫效果; Fram

15、e動畫叫做順序播放實現(xiàn)做好的圖像和電影類似。另外加上gif動畫,因為如果直接使用Bitmap或其他方法直接調(diào)用gif圖片資源的話,顯示的是靜態(tài)的,如果要做成動態(tài)的,就需要一些其他的方法來實現(xiàn)。 Tween動畫 Alpha:漸變透明度動畫 Scale:漸變尺寸伸縮動畫 Translate:畫面轉(zhuǎn)換位置移動動畫 Rotate:畫面轉(zhuǎn)移旋轉(zhuǎn)動畫,AlphaAnimation(float fromAlpha, float toAlpha) 功能:創(chuàng)建一個透明度漸變的動畫 參數(shù)說明:fromAlpha是動畫起始時透明度;toAlpha是動畫結(jié)束時透明度 注:0.0表示完全透明,1.0表示完全不透明 1、

16、直接在程序中創(chuàng)建動畫 /創(chuàng)建Alpha動畫 Animation alpha = new AlphaAnimation(0.1f, 1.0f); alpha.setDuration(5000);/設置動畫時間為5秒 img.startAnimation(alpha); /開始播放 2、通過XML來創(chuàng)建動畫 alpha_anim.xml。在res/anim目錄下 ,java調(diào)用 Animation scale = AnimationUtils.loadAnimation(TweenActivity.this, R.anim.scale_anim); img.startAnimation(scale

17、); /開始動畫 ScaleAnimation(float fromX, float toX, float fromY, float toY, int pivotXType, floatXValue, int pivotYType, float pivotYValue) 功能:創(chuàng)建一個漸變尺寸伸縮動畫參數(shù):fromX,toX分別是起始和結(jié)束時x坐標上的伸縮尺寸。fromY,toY分別是起始和結(jié)束時ye坐標上的伸縮尺寸。pivotXValue,pivotYValue分別為伸縮動畫相對于x,y坐標開始的位置,pivotXType,pivotYType分別為x,y的伸縮模式。 1、直接在程序中實現(xiàn)的

18、方式java代碼:Animation scale = new ScaleAnimation(0f, 1f, 0f, 1f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); scale.setDuration(5000);/設置動畫持續(xù)時間 img.startAnimation(scale); /開始動畫,2、在XML中是創(chuàng)建動畫scale_anim.xml,在res/anim目錄下 Java調(diào)用 Animation scale = AnimationUtils.loadAnimation(TweenAct

19、ivity.this, R.anim.scale_anim); img.startAnimation(scale);,TranslateAnimation(float fromXDelta, float toXDelta, float YDelta, float toYDelta) 功能:創(chuàng)建一個移動畫面位置的動畫 參數(shù):fromXDelta,fromYDelta分別是其實坐標;toXDelta,toYDelta分別是結(jié)束坐標 1、直接在程序中實現(xiàn)java代碼: Animation translate = new TranslateAnimation(10, 100, 10, 100); tr

20、anslate.setDuration(3000);/設置動畫持續(xù)時間 img.startAnimation(translate); /開始動畫 2、在XML中創(chuàng)建動畫 ,java調(diào)用 Animation translate = AnimationUtils.loadAnimation(TweenActivity.this, R.anim.translate_anim); img.startAnimation(translate); /開始動畫 Rotate(float fromDegrees, float toDegrees, int pivotXType, float pivotXValu

21、e, int pivotYType,float pivotYValue) 功能:創(chuàng)建一個旋轉(zhuǎn)畫面的動畫 參數(shù):fromDegrees為開始的角度;toDegrees為結(jié)束的角度。pivotXValue、pivotYType分別為x,y的伸縮模式。pivotXValue,pivotYValue分別為伸縮動畫相對于x,y的坐標開始位置 1、直接在程序中創(chuàng)建動畫java代碼: Animation rotate = new RotateAnimation(0f,+360f, Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF, 0.5f

22、); rotate.setDuration(3000); img.startAnimation(rotate);,2、在XML中創(chuàng)建動畫 rotate_anim.xml 在res/anim目錄下 Java調(diào)用 Animation rotate = AnimationUtils.loadAnimation(TweenActivity.this, R.anim.rotate_anim); img.startAnimation(rotate);,Frame動畫,Interpolator 類及其子類Interpolator 定義了動畫的變化速度,可以實現(xiàn)勻速、正加速、負加速、無規(guī)則變加速等;Inter

23、polator 是基類,封裝了所有 Interpolator 的共同方法,它只有一個方法,LinearInerpolator、AccelerateInterpolator, DecelerateInterpolator,AccelerateDecelerateInterpolator,CycleInterpolator 是 Interpolator的子類,分別實現(xiàn)了勻速、加速、減速、變速、循環(huán)等效果。,第一種 AnimationDrawable frameAnimation = new AnimationDrawable(); for(int i=0;iimgList.length;i+) b

24、itmapDraw =getResources().getDrawable(imgListi); frameAnimation.addFrame(drawab le, 80);/drawab le為單幀圖片,此句需循環(huán) imgView.setBackgroundDrawable(frameAnimation); frameAnimation.setOneShot(isLoop); /設置是否循環(huán) frameAnimation.start(); 第二種 添加幀圖片方式發(fā)生變化 for(int i=0;i7;i+) int id = getResources().getIdentifier(img

25、+i, drawable, getPackageName(); bitmapDraw = getResources().getDrawable(id); frameAnimation.addFrame(bitmapDraw, 80); ,第三種 在res文件下面創(chuàng)建一個文件夾anim,在anim文件下面創(chuàng)建frame_animation.xml文件。 調(diào)用方法1 imgView.setBackgroundResource(R.anim.picture_animation); frameAnimation = (AnimationDrawable) imgView.getBackground(,

26、調(diào)用方法2 frameAnimation = (AnimationDrawable) imgView.getDrawable();,4.7 SurfaceView,從事復雜的圖像繪制或者對程序的執(zhí)行效率要求比較高的產(chǎn)物 當需要快速地更新View的UI,或者當渲染代碼阻塞GUI線程的時間過長的時候,SurfaceView就是解決上述問題的最佳選擇。 使用時需要對其進行創(chuàng)建、銷毀、情況改變時進行監(jiān) 視,這個需要實現(xiàn)SurfaceHolder.Callback接口。如果要對被繪制的畫布進行裁剪,控制其大小時都需要用SurfaceHolder來 完成處理。,基本方法: surfaceChanged :

27、在surfaceview的大小發(fā)生改變的時候調(diào)用。 surfaceCreated : 在創(chuàng)建Surface時激發(fā)。 surfacedestroyed:在銷毀Surface時激發(fā)。 addCallback:給SurfaceView添加一個回調(diào)函數(shù)。 lockCanvas :鎖定畫布。繪圖之前必須鎖定畫布才能夠得到畫布對象。 unlockCanvasAndPost:開始繪制時鎖定了畫布,繪制完成之后解鎖畫布。 removeCallback:從SurfaceView中移除回調(diào)函數(shù)。 創(chuàng)建SurfaceView 要創(chuàng)建一個新的SurfaceView,需要創(chuàng)建一個新的擴展了SurfaceView的類,并實現(xiàn)SurfaceHolder.Callback。 一個典型的Surface View設計模型包括一個由Thread所派生的類,它可以接收對當前的SurfaceHolder的引用,并獨立地更新它。,4.8 OpenGL,OpenGL定義了一個跨編程語言、跨平臺的編程接口的性能卓越的三維圖形標準。 1992年7月, SGI公司發(fā)布OpenGL1.0 1995年,OpenGL 1.1 版本面試。 1997年,Windows95下的3D大量涌現(xiàn)。 2003年7月, SGI和ARB公布OpenGL 1.5。 2004年8月,Op

溫馨提示

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

評論

0/150

提交評論