咖啡伴侶

          呆在上海
          posts - 163, comments - 156, trackbacks - 0, articles - 2

          導航

          公告

          呆在上海 

          Java,Flex,Android,SVG等技術的 圖形UI

          Email:leooath@gmail.com

          QQ:35339893


          常用鏈接

          留言簿(5)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          script包源碼包括:
          sun\script\javascript
          script

          org\mozilla\javascript

          其中
          org\mozilla\javascript
          是真正的javascript實現 源碼1M多

          一起打包完大概860K

          posted @ 2011-08-01 11:08 oathleo 閱讀(1980) | 評論 (3)編輯 收藏

               摘要:   中文: http://www.chinaup.org/docs/toolbox/performance.html 英文: /android-sdk/docs/guide/guide_toc.html   盡量避免創建對象 使用自身方法 使用虛擬優于使用接口 使用靜態優于使用虛擬 避免內部使用Setter和Getter 緩沖屬性調用 聲明Final常量 慎重使...  閱讀全文

          posted @ 2011-07-31 08:31 oathleo 閱讀(456) | 評論 (0)編輯 收藏

          遇到的情況
          AsyncTask
          protected GAViewer doInBackground(Activity... params) {
              ......
              GAViewer viewer = new GAViewer(result, drawActivity.getApplicationContext());
              return viewer;
          }

          產生
          Can't create handler inside thread that has not called Looper.prepare()
          異常

          原因估計
          1.viewer 是個 SurfaceView ,而doInBackground是不允許操作UI的
          2.drawActivity.getApplicationContext() 已經操作了UI ?maybe

          posted @ 2011-07-30 10:04 oathleo 閱讀(4263) | 評論 (1)編輯 收藏

          3000行的多層次XML,
          環境2.2,Xoom

          XmlPullParser  2000ms 以上
          SAXParser       200ms 不到

          原因不知道~暫時沒空深層研究了
           

          posted @ 2011-07-30 10:00 oathleo 閱讀(1521) | 評論 (2)編輯 收藏

          高級畫布繪圖(3)

          DashPathEffect  可以使用DashPathEffect來創建一個虛線的輪廓(短橫線/小圓點),而不是使用實線。你還可以指定任意的虛/實線段的重復模式。

          DiscretePathEffect  與DashPathEffect相似,但是添加了隨機性。當繪制它的時候,需要指定每一段的長度和與原始路徑的偏離度。

          PathDashPathEffect  這種效果可以定義一個新的形狀(路徑)并將其用作原始路徑的輪廓標記。

          下面的效果可以在一個Paint中組合使用多個Path Effect。

          SumPathEffect  順序地在一條路徑中添加兩種效果,這樣每一種效果都可以應用到原始路徑中,而且兩種結果可以結合起來。

          ComposePathEffect  將兩種效果組合起來應用,先使用第一種效果,然后在這種效果的基礎上應用第二種效果。

          對象形狀的PathEffect的改變會影響到形狀的區域。這就能夠保證應用到相同形狀的填充效果將會繪制到新的邊界中。

          使用setPathEffect方法可以把PathEffect應用到Paint對象中,如下所示:

          1. borderPaint.setPathEffect(new CornerPathEffect(5)); 

          PathEffect API示例給出了如何應用每一種效果的指導說明。

          修改Xfermode

          可以通過修改Paint的Xfermode來影響在Canvas已有的圖像上面繪制新的顏色的方式。

          在正常的情況下,在已有的圖像上繪圖將會在其上面添加一層新的形狀。如果新的Paint是完全不透明的,那么它將完全遮擋住下面的Paint;如果它是部分透明的,那么它將會被染上下面的顏色。

          下面的Xfermode子類可以改變這種行為:

          AvoidXfermode  指定了一個顏色和容差,強制Paint避免在它上面繪圖(或者只在它上面繪圖)。

          PixelXorXfermode  當覆蓋已有的顏色時,應用一個簡單的像素XOR操作。

          PorterDuffXfermode  這是一個非常強大的轉換模式,使用它,可以使用圖像合成的16條Porter-Duff規則的任意一條來控制Paint如何與已有的Canvas圖像進行交互。

          要應用轉換模式,可以使用setXferMode方法,如下所示:

          1. AvoidXfermode avoid = new AvoidXfermode(Color.BLUE, 10, AvoidXfermode.Mode. AVOID);  
          2. borderPen.setXfermode(avoid); 

          3. 使用抗鋸齒效果提高Paint質量

          在繪制一個新的Paint對象時,可以通過傳遞給它一些標記來影響它被渲染的方式。ANTI_ALIAS_FLAG是其中一種很有趣的標記,它可以保證在繪制斜線的時候使用抗鋸齒效果來平滑該斜線的外觀。

          在繪制文本的時候,抗鋸齒效果尤為重要,因為經過抗鋸齒效果處理之后的文本非常容易閱讀。要創建更加平滑的文本效果,可以應用SUBPIXEL_TEXT_FLAG,它將會應用子像素抗鋸齒效果。

          也可以手工地使用setSubpixelText和setAntiAlias方法來設置這些標記,如下所示:

          1. myPaint.setSubpixelText(true);  
          2. myPaint.setAntiAlias(true); 

          4. 2D圖形的硬件加速

          在當前這個到處都是2D圖形愛好者的時代,Android允許你使用硬件加速來渲染你的應用程序。

          如果設備可以使用硬件加速,那么通過設置這個標記可以讓活動中的每一個View都能使用硬件渲染。盡管減少了系統處理程序的負載,但在極大地提高了圖像處理速度的同時,硬件加速也帶來了相應的負面效果。

          使用requestWindowFeature方法,可以在你的活動中應用Window.FEATURE_OPENGL標記來打開硬件加速,如下所示:

          1. myActivity.requestWindowFeature(Window.FEATURE_OPENGL); 

          遺憾的是,天上不會掉餡餅,這次也不例外。

          并不是Android中所有的2D繪圖基本圖形都被硬件支持(特別是前面描述的大部分PathEffect)。

          與此同時,由于整個活動實際上是作為一個Canvas進行渲染的,所以對任何View的無效請求都將會導致整個活動被重新繪制。

          5. Canvas繪圖最佳實踐經驗

          2D自繪操作是非常耗費處理程序資源的;低效的繪圖方法會阻塞GUI線程,并且會對應用程序的響應造成不利的影響。對于那些只有一個處理程序的資源受限的環境來說,這一點就更加現實了。

          這里需要注意onDraw方法的資源消耗以及CPU周期的耗費,這樣才能保證不會把一個看起來很吸引人的應用程序變得完全沒有響應。

          目前有很多技術可以幫助將與自繪控件相關的資源消耗最小化。我們關心的不是一般的原則,而是某些Android特定的注意事項,從而保證你可以創建外觀時尚、而且能夠保持交互的活動(注意,以下這個列表并不完整):

          考慮硬件加速  OpenGL硬件加速對2D圖形的支持是非常好的,所以你總是應該考慮它是否適合你的活動。另一種比較優秀的方法是只用一個單獨的View和迅速的、耗時的更新來組成活動。一定要保證你使用的基本圖形能夠被硬件支持。

          考慮大小和方向  當在設計View和布局的時候,一定要保證考慮(和測試)它們在不同的分辨率和大小下的外觀。

          只創建一次靜態對象  在Android中對象的創建是相當昂貴的。因此,在可能的地方,應用只創建一次像Paint對象、Path和Shader這樣的繪圖對象,而不是在View每次無效的時候都重新創建它們。

          記住onDraw是很消耗資源的  執行onDraw方法是很消耗資源的處理,它會強制Android執行多個圖片組合和位圖構建操作。下面有幾點建議可以讓你修改Canvas的外觀,而不用重新繪制它:

          使用Canvas轉換  可以使用像rotate和translate這樣的轉換,來簡化Canvas中元素復雜的相關位置。例如,相比放置和旋轉一個表盤周圍的每一個文本元素,你可以簡單地將canvas旋轉22.5?,然后在相同的位置繪制文本。

          使用動畫  可以考慮使用動畫來執行View的預設置的轉換,而不是手動地重新繪制它。在活動的View中可以執行縮放、旋轉和轉換動畫,并可以提供一種能夠有效利用資源的方式來提供縮放、旋轉或者抖動效果。

          考慮使用位圖和9 Patch  如果View使用了靜態背景,那么你應該考慮使用一個圖片,如位圖或者9 patch,而不是手動地重新繪制。

          posted @ 2011-07-26 11:35 oathleo 閱讀(448) | 評論 (0)編輯 收藏

          11.4.3  高級畫布繪圖(2)

          提示:

          圖11-1中沒有包含的是ComposerShader,它可以創建多個Shader和BitmapShader的組合,從而可以在一個位圖圖像的基礎上創建一個繪圖刷。

          要在繪圖的時候使用一個Shader,可以使用setShader方法將其應用到一個Paint中,如下面的代碼所示:

          1. Paint shaderPaint = new Paint();  
          2. shaderPaint.setShader(myLinearGradient); 

          你使用這個Paint所繪制的任何東西都將使用你指定的Shader進行填充,而不是使用Paint本身的顏色進行填充。

          定義漸變Shader

          如上所示,使用漸變Shader可以讓你使用交替改變的顏色來填充圖片;你可以將顏色漸變定義為兩種顏色的簡單交替,如下所示:

          1. int colorFrom = Color.BLACK;  
          2. int colorTo = Color.WHITE;  
          3.  
          4. LinearGradient linearGradientShader = new LinearGradient(x1, y1, x2, y2,  
          5.                                                          colorFrom,  
          6.                                                          colorTo,  
          7.                                                          TileMode.CLAMP); 

          或者,你還可以定義更復雜的按照設定比例進行分布的顏色序列,如下面的RadialGradientShader例子所示:

          1. int[] gradientColors = new int[3];  
          2. gradientColors[0] = Color.GREEN;  
          3. gradientColors[1] = Color.YELLOW;  
          4. gradientColors[2] = Color.RED;  
          5.  
          6. float[] gradientPositions = new float[3];  
          7. gradientPositions[0] = 0.0f;  
          8. gradientPositions[1] = 0.5f;  
          9. gradientPositions[2] = 1.0f;  
          10.  
          11. RadialGradient radialGradientShader=new RadialGradient(centerX,centerY, radius,  
          12.                                                          gradientColors,  
          13.                                                          gradientPositions,  
          14.                                                          TileMode.CLAMP); 

          每一種漸變Shader(線性的、輻射形的和掃描狀的)都可以使用以上這兩種技術來定義漸變填充。

          使用Shader TileModes

          漸變Shader的畫刷大小既可以顯式地使用有邊界的矩形來定義,也可以使用中心點和半徑長度來定義。Bitmap Shader可以通過它的位圖大小來決定它的畫刷大小。

          如果Shader畫刷所定義的區域比要填充的區域小,那么TileMode將會決定如何處理剩余的區域:

          CLAMP  使用Shader的邊界顏色來填充剩余的空間。

          MIRROR  在水平和垂直方向上拉伸Shader圖像,這樣每一個圖像就都能與上一個縫合了。

          REPEAT  在水平和垂直方向上重復Shader圖像,但不拉伸它。

          使用MaskFilter

          MaskFilter類可以為Paint分配邊緣效果。

          對MaskFilter的擴展可以對一個Paint邊緣的alpha通道應用轉換。Android包含了下面幾種MaskFilter:

          BlurMaskFilter   指定了一個模糊的樣式和半徑來處理Paint的邊緣。

          EmbossMaskFilter  指定了光源的方向和環境光強度來添加浮雕效果。

          要應用一個MaskFilter,可以使用setMaskFilter方法,并傳遞給它一個MaskFilter對象。下面的例子是對一個已經存在的Paint應用一個EmbossMaskFilter:

          1. // 設置光源的方向  
          2. float[] direction = new float[]{ 1, 1, 1 };  
          3. //設置環境光亮度  
          4. float light = 0.4f;  
          5. // 選擇要應用的反射等級  
          6. float specular = 6;  
          7. // 向mask應用一定級別的模糊  
          8. float blur = 3.5f;  
          9. EmbossMaskFilter emboss=new EmbossMaskFilter(direction,light,specular,blur);  
          10.  
          11. // 應用mask  
          12. myPaint.setMaskFilter(emboss); 

          SDK中包含的FingerPaint API demo是說明如何使用MaskFilter的一個非常好的例子。它展示了這兩種filter的效果。

          使用ColorFilter

          MaskFilter是對一個Paint的alpha通道的轉換,而ColorFilter則是對每一個RGB通道應用轉換。所有由ColorFilter所派生的類在執行它們的轉換時,都會忽略alpha通道。

          Android包含三個ColorFilter:

          ColorMatrixColorFilter  可以指定一個4×5的ColorMatrix并將其應用到一個Paint中。ColorMatrixes通常在程序中用于對圖像進行處理,而且由于它們支持使用矩陣相乘的方法來執行鏈接轉換,所以它們很有用。

          LightingColorFilter  乘以第一個顏色的RGB通道,然后加上第二個顏色。每一次轉換的結果都限制在0到255之間。

          PorterDuffColorFilter  可以使用數字圖像合成的16條Porter-Duff 規則中的任意一條來向Paint應用一個指定的顏色。

          使用setColorFilter方法應用ColorFilter,如下所示:

          myPaint.setColorFilter(new LightingColorFilter(Color.BLUE, Color.RED));

          API中的ColorMatrixSample是說明如何使用ColorFilter和Color Matrix的非常好的例子。

          使用PathEffect

          到目前為止,所有的效應都會影響到Paint填充圖像的方式;PathEffect是用來控制繪制輪廓(線條)的方式。

          PathEffect對于繪制Path基本圖形特別有用,但是它們也可以應用到任何Paint中從而影響線條繪制的方式。

          使用PathEffect,可以改變一個形狀的邊角的外觀并且控制輪廓的外表。Android包含了多個PathEffect,包括:

          CornerPathEffect  可以使用圓角來代替尖銳的角從而對基本圖形的形狀尖銳的邊角進行平滑。

          posted @ 2011-07-26 11:33 oathleo 閱讀(284) | 評論 (0)編輯 收藏

          11.4.3  高級畫布繪圖(1)

          我們已經在第4章中介紹了Canvas,在那里,已經學習了如何創建自己的View。在第7章中也使用了Canvas來為MapView標注覆蓋。

          畫布(Canvas)是圖形編程中一個很普通的概念,通常由三個基本的繪圖組件組成:

          Canvas  提供了繪圖方法,可以向底層的位圖繪制基本圖形。

          Paint  也稱為"刷子",Paint可以指定如何將基本圖形繪制到位圖上。

          Bitmap  繪圖的表面。

          這一章中描述的大部分高級技術都涉及到了對Paint對象的變化和修改,從而可以向那些平面的光柵圖片添加深度和紋理。

          Android繪圖API支持透明度、漸變填充、圓邊矩形和抗鋸齒。遺憾的是,由于資源限制,它還不支持矢量圖形,它使用的是傳統光柵樣式的重新繪圖。

          這種光柵方法的結果是提高了效率,但是改變一個Paint對象不會影響已經畫好的基本圖形,它只會影響新的元素。

          提示:

          如果你擁有Windows開發背景,那么Android的2D繪圖能力大致相當于GDI+的能力。

          1. 可以畫什么?

          Canvas類封裝了用作繪圖表面的位圖;它還提供了draw*方法來實現設計。

          下面的列表提供了對可用的基本圖形的簡要說明,但并沒有深入地探討每一個draw方法的詳細內容:

          drawARGB / drawRGB / drawColor  使用單一的顏色填充畫布。

          drawArc  在一個矩形區域的兩個角之間繪制一個弧。

          drawBitmap  在畫布上繪制一個位圖。可以通過指定目標大小或者使用一個矩陣來改變目標位圖的外觀。

          drawBitmapMesh  使用一個mesh(網)來繪制一個位圖,它可以通過移動網中的點來操作目標的外觀。

          drawCircle  以給定的點為圓心,繪制一個指定半徑的圓。

          drawLine(s)  在兩個點之間畫一條(多條)直線。

          drawOval  以指定的矩形為邊界,畫一個橢圓。

          drawPaint  使用指定的Paint填充整個Canvas

          drawPath  繪制指定的Path。Path對象經常用來保存一個對象中基本圖形的集合。

          drawPicture  在指定的矩形中繪制一個Picture對象。

          drawPosText  繪制指定了每一個字符的偏移量的文本字符串。

          drawRect  繪制一個矩形。

          drawRoundRect  繪制一個圓角矩形。

          drawText  在Canvas上繪制一個文本串。文本的字體、大小和渲染屬性都設置在用來渲染文本的Paint對象中。

          drawTextOnPath  在一個指定的path上繪制文本。

          drawVertices  繪制一系列三角形面片,通過一系列頂點來指定它們。

          這些繪圖方法中的每一個都需要指定一個Paint對象來渲染它。在下面的部分中,將學習如何創建和修改Paint對象,從而在繪圖中完成大部分工作。

          2. 從Paint中完成工作

          Paint類相當于一個筆刷和調色板。它可以選擇如何使用上面描述的draw方法來渲染繪制在畫布上的基本圖形。通過修改Paint對象,可以在繪 圖的時候控制顏色、樣式、字體和特殊效果。最簡單地,setColor可以讓你選擇一個Paint的顏色,而Paint對象的樣式(使用setStyle 控制)則可以決定是繪制繪圖對象的輪廓(STROKE),還是只填充每一部分(FILL),或者是兩者都做(STROKE_AND_FILL)

          除了這些簡單的控制之外,Paint類還支持透明度,另外,它也可以通過使用各種各樣的陰影、過濾器和效果進行修改,從而提供由更豐富的、復雜的畫筆和顏料組成的調色板。

          Android SDK包含了一些非常好的實例,它們說明了Paint類中可用的大部分功能。你可以在API demos的graphics子目錄中找到它們:

          1. [sdk root folder]\samples\ApiDemos\src\com\android\samples\graphics 

          在下面的部分中,將學習和使用其中的部分功能。這些部分只是簡單地羅列了它們能實現的效果(例如漸變和邊緣浮雕),而沒有詳細地列出所有可能的情況。

          使用透明度

          Android中的所有顏色都包含了一個不透明組件(alpha通道)。

          當創建一個顏色的時候,可以使用argb或者parseColor方法來定義它的alpha值,如下所示:

          1. // 使用紅色,并讓它50%透明  
          2. int opacity = 127;  
          3. int intColor = Color.argb(opacity, 255, 0, 0);  
          4. int parsedColor = Color.parseColor("#7FFF0000"); 

          或者,也可以使用setAlpha方法來設置已存在的Paint對象的透明度:

          1. // 讓顏色50%透明  
          2. int opacity = 127;  
          3. myPaint.setAlpha(opacity); 

          創建一個不是100%透明的顏色意味著,使用它繪制的任何基本圖形都將是部分透明的--也就是說,在它下面繪制的所有基本圖形都是部分可見的。

          可以在任何使用了顏色的類或者方法中使用透明效果,包括Paint、Shader和Mask Filter。

          Shader介紹

          Shader類的派生類可以創建允許使用多種固體顏色填充繪圖對象的Paint。

          對Shader最常見的使用是定義漸變填充;漸變是在2D圖像中添加深度和紋理的最佳方式之一。Android包含了一個Bitmap Shader和一個Compose Shader,同時,還包含了三個漸變的Shader。

          試圖用語言來描述繪圖的效果本來就是沒有意義的,所以看一下圖11-1就應該可以知道每一種Shader是如何工作的。圖中從左到右依次代表的是LinearGradient、RadialGradient和 SweepGradient.

           
          (點擊查看大圖)圖11-1

          posted @ 2011-07-26 11:14 oathleo 閱讀(344) | 評論 (0)編輯 收藏

            大家好,今天和大家分享的是Android中渲染圖像和圖形的類,這也是我第一次在Linux上寫Android程序,呵呵,感覺還不錯!

            切入正題:Shader有幾個直接子類:

            BitmapShader    : 圖像渲染

            LinearGradient  : 線性漸變

            RadialGradient  : 環形漸變

            SweepGradient   : 掃描漸變---圍繞一個中心點掃描漸變就像電影里那種雷達掃描

            ComposeShader   : 組合渲染

            先看效果圖:


            先保存好你要在BitmapShader中顯示的圖片.

             

            看代碼(代碼中帶有注釋):

            我采用的還是SurefaceView框架,

             

            1. package com.ldj.helloshader;  
            2. import android.content.Context;  
            3. import android.graphics.*;  
            4. import android.graphics.Shader.TileMode;  
            5. import android.graphics.drawable.BitmapDrawable;  
            6. import android.graphics.drawable.ShapeDrawable;  
            7. import android.graphics.drawable.shapes.OvalShape;  
            8. import android.view.*;  
            9. public class ShaderView extends SurfaceView implements SurfaceHolder.Callback,Runnable{  
            10.     //聲明漸變的顏色數組  
            11.     private int[] color =   
            12.         new int[]{Color.GREEN,Color.GRAY,Color.MAGENTA,Color.RED,Color.WHITE};  
            13.     private boolean loop = false;  
            14.     private SurfaceHolder surfaceHolder;  
            15.       
            16.     private Bitmap bitPic = null;  
            17.       
            18.     int bitPicWidth = 0;  
            19.     int bitPicHeight = 0;  
            20.       
            21.     //聲明一個圖片渲染  
            22.     BitmapShader bitmapShader = null;  
            23.     //聲明一個線性漸變  
            24.     LinearGradient linearGradient = null;  
            25.     //聲明一個環形漸變  
            26.     RadialGradient radialGradient = null;  
            27.     //聲明一個掃描漸變  
            28.     //-圍繞一個中心點掃描漸變就像電影里那種雷達掃描  
            29.     SweepGradient sweepGradient = null;  
            30.     //聲明一個組合渲染  
            31.     ComposeShader composeShader = null;  
            32.     //定義畫筆  
            33.     Paint paint = null;  
            34.     //利用這個類也可以實現繪制圖像的功能  
            35.     ShapeDrawable shapeDrawable = null;  
            36.       
            37.     public ShaderView(Context context) {  
            38.         super(context);  
            39.         surfaceHolder = this.getHolder();  
            40.         //增加回調  
            41.         surfaceHolder.addCallback(this);  
            42.         loop = true;  
            43.         paint = new Paint();  
            44.         //獲取圖像資源  
            45.         bitPic =   
            46.             ((BitmapDrawable)this.getResources().getDrawable(R.drawable.screenshot))  
            47.             .getBitmap();  
            48.         //將圖片的長和高的值賦給變量  
            49.         bitPicWidth = bitPic.getWidth();  
            50.         bitPicHeight = bitPic.getHeight();  
            51.         /* 
            52.          * ~~~BitmapShader(Bitmap,TileMode,TileMode)~~~ 
            53.          */  
            54.         bitmapShader = new BitmapShader(bitPic, TileMode.REPEAT, TileMode.MIRROR);  
            55.         /* 
            56.          * ~~~LinearGradient(x0,y0,x1,y1,int[Color],float[],TileMode)~~~ 
            57.          */  
            58.         linearGradient = new LinearGradient(0,0,100,100,color,null,TileMode.REPEAT);  
            59.         /* 
            60.          * ~~~RadialGradient~~~ 
            61.          */  
            62.         radialGradient = new RadialGradient(160,240,66,color,null,TileMode.MIRROR);  
            63.         /* 
            64.          * ~~~SweepGradient~~~ 
            65.          */  
            66.         sweepGradient = new SweepGradient(100,350,color,null);  
            67.         //~~~ComposeShader(shaderA,shaderB,Mode)~~~  
            68.         //組合線性和環形兩種漸變,當然其他的也可以的  
            69.         composeShader   
            70.             = new ComposeShader(linearGradient,radialGradient,PorterDuff.Mode.DARKEN);  
            71.     }  
            72.     @Override  
            73.     public void run() {  
            74.         while(loop) {  
            75.             draw();  
            76.             try {  
            77.                 Thread.sleep(100);  
            78.             } catch (InterruptedException e) {  
            79.                 e.printStackTrace();  
            80.             }  
            81.         }  
            82.     }  
            83.     @Override  
            84.     public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {  
            85.     }  
            86.     @Override  
            87.     public void surfaceCreated(SurfaceHolder arg0) {  
            88.         new Thread(this).start();  
            89.     }  
            90.     @Override  
            91.     public void surfaceDestroyed(SurfaceHolder arg0) {  
            92.         loop = false;  
            93.     }  
            94.       
            95.     private void draw() {  
            96.         Canvas canvas = surfaceHolder.lockCanvas();  
            97.         /* 
            98.          * ~~~BitmapShader 
            99.          */  
            100.         //構造形狀為橢圓的shapeDrawable對象  
            101.         shapeDrawable = new ShapeDrawable(new OvalShape());  
            102.         //設置顯示的圖片  
            103.         shapeDrawable.getPaint().setShader(bitmapShader);  
            104.         //設置顯示的長和高  
            105.         shapeDrawable.setBounds(0, 0, bitPicWidth, bitPicHeight);  
            106.         //繪制圖像  
            107.         shapeDrawable.draw(canvas);  
            108.         //~~~LinearGradient~~~  
            109.         //設置畫筆的渲染類型  
            110.         paint.setShader(linearGradient);  
            111.         canvas.drawRect(0, bitPicHeight, 320, 150, paint);  
            112.         //~~~RadialGradient~~~  
            113.         paint.setShader(radialGradient);  
            114.         canvas.drawCircle(160, 240, 66, paint);  
            115.         //~~~SweepGradient  
            116.         paint.setShader(sweepGradient);  
            117.         canvas.drawCircle(100, 350, 66, paint);  
            118.         //~~~ComposeShader~~~  
            119.         paint.setShader(composeShader);  
            120.         canvas.drawRect(bitPicWidth, 320, 320, 480, paint);  
            121.         surfaceHolder.unlockCanvasAndPost(canvas);  
            122.     }  
            123. }  

             

            總結:

            配色弄的不是很好看,大家可別見怪,大體來說渲染圖像或圖形三步:

            首先是聲明渲染或漸變類。

            然后將畫筆setShader為聲明的類。

            最后繪制的時候用此畫筆即可。

            好了,今天到這里了,謝謝大家閱讀。


          posted @ 2011-07-25 11:41 oathleo 閱讀(1210) | 評論 (0)編輯 收藏

           void  setARGB(int a, int r, int g, int b)  設置Paint對象顏色,參數一為alpha透明通道

          void  setAlpha(int a)  設置alpha不透明度,范圍為0~255

          void  setAntiAlias(boolean aa)  //是否抗鋸齒

          void  setColor(int color)  //設置顏色,這里Android內部定義的有Color類包含了一些常見顏色定義
           .
          void  setFakeBoldText(boolean fakeBoldText)  //設置偽粗體文本
            
          void  setLinearText(boolean linearText)  //設置線性文本
           
          PathEffect  setPathEffect(PathEffect effect)  //設置路徑效果
           
          Rasterizer  setRasterizer(Rasterizer rasterizer) //設置光柵化
           
          Shader  setShader(Shader shader)  //設置陰影 

          void  setTextAlign(Paint.Align align)  //設置文本對齊

          void  setTextScaleX(float scaleX)  //設置文本縮放倍數,1.0f為原始
           
          void  setTextSize(float textSize)  //設置字體大小
           
          Typeface  setTypeface(Typeface typeface)  //設置字體,Typeface包含了字體的類型,粗細,還有傾斜、顏色等。

           void  setUnderlineText(boolean underlineText)  //設置下劃線


          Paint paint = new Paint();
           
                 paint.setAntiAlias(true);          //防鋸齒
                  paint.setDither(true);            //防抖動
                  paint.setStyle(Paint.Style.STROKE);          //畫筆類型 STROKE空心 FILL 實心

          posted @ 2011-07-25 10:52 oathleo 閱讀(2534) | 評論 (0)編輯 收藏

          觸發
           android.view.SurfaceHolder.Callback
          1.surfaceDestroyed
          2.surfaceCreated
          3.surfaceChanged

          posted @ 2011-07-21 15:18 oathleo 閱讀(454) | 評論 (0)編輯 收藏

          僅列出標題
          共17頁: First 上一頁 5 6 7 8 9 10 11 12 13 下一頁 Last 
          主站蜘蛛池模板: 西乌珠穆沁旗| 邯郸市| 安阳县| 高雄市| 贵州省| 吉水县| 色达县| 石景山区| 剑阁县| 积石山| 乌拉特前旗| 蚌埠市| 华容县| 泰和县| 正安县| 新郑市| 泌阳县| 台州市| 承德市| 兰坪| 嘉禾县| 江西省| 吴桥县| 平乐县| 南宫市| 紫阳县| 阿鲁科尔沁旗| 孟连| 灌南县| 若尔盖县| 屏南县| 龙山县| 班玛县| 铁岭县| 荔浦县| 小金县| 加查县| 白朗县| 新丰县| 错那县| 涪陵区|