<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    咖啡伴侶

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

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

    org\mozilla\javascript

    其中
    org\mozilla\javascript
    是真正的javascript實(shí)現(xiàn) 源碼1M多

    一起打包完大概860K

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

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

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

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

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

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

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

    3000行的多層次XML,
    環(huán)境2.2,Xoom

    XmlPullParser  2000ms 以上
    SAXParser       200ms 不到

    原因不知道~暫時(shí)沒空深層研究了
     

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

    高級畫布繪圖(3)

    DashPathEffect  可以使用DashPathEffect來創(chuàng)建一個(gè)虛線的輪廓(短橫線/小圓點(diǎn)),而不是使用實(shí)線。你還可以指定任意的虛/實(shí)線段的重復(fù)模式。

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

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

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

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

    ComposePathEffect  將兩種效果組合起來應(yīng)用,先使用第一種效果,然后在這種效果的基礎(chǔ)上應(yīng)用第二種效果。

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

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

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

    PathEffect API示例給出了如何應(yīng)用每一種效果的指導(dǎo)說明。

    修改Xfermode

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

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

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

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

    PixelXorXfermode  當(dāng)覆蓋已有的顏色時(shí),應(yīng)用一個(gè)簡單的像素XOR操作。

    PorterDuffXfermode  這是一個(gè)非常強(qiáng)大的轉(zhuǎn)換模式,使用它,可以使用圖像合成的16條Porter-Duff規(guī)則的任意一條來控制Paint如何與已有的Canvas圖像進(jìn)行交互。

    要應(yīng)用轉(zhuǎn)換模式,可以使用setXferMode方法,如下所示:

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

    3. 使用抗鋸齒效果提高Paint質(zhì)量

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

    在繪制文本的時(shí)候,抗鋸齒效果尤為重要,因?yàn)榻?jīng)過抗鋸齒效果處理之后的文本非常容易閱讀。要?jiǎng)?chuàng)建更加平滑的文本效果,可以應(yīng)用SUBPIXEL_TEXT_FLAG,它將會(huì)應(yīng)用子像素抗鋸齒效果。

    也可以手工地使用setSubpixelText和setAntiAlias方法來設(shè)置這些標(biāo)記,如下所示:

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

    4. 2D圖形的硬件加速

    在當(dāng)前這個(gè)到處都是2D圖形愛好者的時(shí)代,Android允許你使用硬件加速來渲染你的應(yīng)用程序。

    如果設(shè)備可以使用硬件加速,那么通過設(shè)置這個(gè)標(biāo)記可以讓活動(dòng)中的每一個(gè)View都能使用硬件渲染。盡管減少了系統(tǒng)處理程序的負(fù)載,但在極大地提高了圖像處理速度的同時(shí),硬件加速也帶來了相應(yīng)的負(fù)面效果。

    使用requestWindowFeature方法,可以在你的活動(dòng)中應(yīng)用Window.FEATURE_OPENGL標(biāo)記來打開硬件加速,如下所示:

    1. myActivity.requestWindowFeature(Window.FEATURE_OPENGL); 

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

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

    與此同時(shí),由于整個(gè)活動(dòng)實(shí)際上是作為一個(gè)Canvas進(jìn)行渲染的,所以對任何View的無效請求都將會(huì)導(dǎo)致整個(gè)活動(dòng)被重新繪制。

    5. Canvas繪圖最佳實(shí)踐經(jīng)驗(yàn)

    2D自繪操作是非常耗費(fèi)處理程序資源的;低效的繪圖方法會(huì)阻塞GUI線程,并且會(huì)對應(yīng)用程序的響應(yīng)造成不利的影響。對于那些只有一個(gè)處理程序的資源受限的環(huán)境來說,這一點(diǎn)就更加現(xiàn)實(shí)了。

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

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

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

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

    只創(chuàng)建一次靜態(tài)對象  在Android中對象的創(chuàng)建是相當(dāng)昂貴的。因此,在可能的地方,應(yīng)用只創(chuàng)建一次像Paint對象、Path和Shader這樣的繪圖對象,而不是在View每次無效的時(shí)候都重新創(chuàng)建它們。

    記住onDraw是很消耗資源的  執(zhí)行onDraw方法是很消耗資源的處理,它會(huì)強(qiáng)制Android執(zhí)行多個(gè)圖片組合和位圖構(gòu)建操作。下面有幾點(diǎn)建議可以讓你修改Canvas的外觀,而不用重新繪制它:

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

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

    考慮使用位圖和9 Patch  如果View使用了靜態(tài)背景,那么你應(yīng)該考慮使用一個(gè)圖片,如位圖或者9 patch,而不是手動(dòng)地重新繪制。

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

    11.4.3  高級畫布繪圖(2)

    提示:

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

    要在繪圖的時(shí)候使用一個(gè)Shader,可以使用setShader方法將其應(yīng)用到一個(gè)Paint中,如下面的代碼所示:

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

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

    定義漸變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); 

    或者,你還可以定義更復(fù)雜的按照設(shè)定比例進(jìn)行分布的顏色序列,如下面的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(線性的、輻射形的和掃描狀的)都可以使用以上這兩種技術(shù)來定義漸變填充。

    使用Shader TileModes

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

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

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

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

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

    使用MaskFilter

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

    對MaskFilter的擴(kuò)展可以對一個(gè)Paint邊緣的alpha通道應(yīng)用轉(zhuǎn)換。Android包含了下面幾種MaskFilter:

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

    EmbossMaskFilter  指定了光源的方向和環(huán)境光強(qiáng)度來添加浮雕效果。

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

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

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

    使用ColorFilter

    MaskFilter是對一個(gè)Paint的alpha通道的轉(zhuǎn)換,而ColorFilter則是對每一個(gè)RGB通道應(yīng)用轉(zhuǎn)換。所有由ColorFilter所派生的類在執(zhí)行它們的轉(zhuǎn)換時(shí),都會(huì)忽略alpha通道。

    Android包含三個(gè)ColorFilter:

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

    LightingColorFilter  乘以第一個(gè)顏色的RGB通道,然后加上第二個(gè)顏色。每一次轉(zhuǎn)換的結(jié)果都限制在0到255之間。

    PorterDuffColorFilter  可以使用數(shù)字圖像合成的16條Porter-Duff 規(guī)則中的任意一條來向Paint應(yīng)用一個(gè)指定的顏色。

    使用setColorFilter方法應(yīng)用ColorFilter,如下所示:

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

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

    使用PathEffect

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

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

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

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

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

    11.4.3  高級畫布繪圖(1)

    我們已經(jīng)在第4章中介紹了Canvas,在那里,已經(jīng)學(xué)習(xí)了如何創(chuàng)建自己的View。在第7章中也使用了Canvas來為MapView標(biāo)注覆蓋。

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

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

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

    Bitmap  繪圖的表面。

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

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

    這種光柵方法的結(jié)果是提高了效率,但是改變一個(gè)Paint對象不會(huì)影響已經(jīng)畫好的基本圖形,它只會(huì)影響新的元素。

    提示:

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

    1. 可以畫什么?

    Canvas類封裝了用作繪圖表面的位圖;它還提供了draw*方法來實(shí)現(xiàn)設(shè)計(jì)。

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

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

    drawArc  在一個(gè)矩形區(qū)域的兩個(gè)角之間繪制一個(gè)弧。

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

    drawBitmapMesh  使用一個(gè)mesh(網(wǎng))來繪制一個(gè)位圖,它可以通過移動(dòng)網(wǎng)中的點(diǎn)來操作目標(biāo)的外觀。

    drawCircle  以給定的點(diǎn)為圓心,繪制一個(gè)指定半徑的圓。

    drawLine(s)  在兩個(gè)點(diǎn)之間畫一條(多條)直線。

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

    drawPaint  使用指定的Paint填充整個(gè)Canvas

    drawPath  繪制指定的Path。Path對象經(jīng)常用來保存一個(gè)對象中基本圖形的集合。

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

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

    drawRect  繪制一個(gè)矩形。

    drawRoundRect  繪制一個(gè)圓角矩形。

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

    drawTextOnPath  在一個(gè)指定的path上繪制文本。

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

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

    2. 從Paint中完成工作

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

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

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

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

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

    使用透明度

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

    當(dāng)創(chuàng)建一個(gè)顏色的時(shí)候,可以使用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方法來設(shè)置已存在的Paint對象的透明度:

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

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

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

    Shader介紹

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

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

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

     
    (點(diǎn)擊查看大圖)圖11-1

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

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

      切入正題:Shader有幾個(gè)直接子類:

      BitmapShader    : 圖像渲染

      LinearGradient  : 線性漸變

      RadialGradient  : 環(huán)形漸變

      SweepGradient   : 掃描漸變---圍繞一個(gè)中心點(diǎn)掃描漸變就像電影里那種雷達(dá)掃描

      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.     //聲明漸變的顏色數(shù)組  
      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.     //聲明一個(gè)圖片渲染  
      22.     BitmapShader bitmapShader = null;  
      23.     //聲明一個(gè)線性漸變  
      24.     LinearGradient linearGradient = null;  
      25.     //聲明一個(gè)環(huán)形漸變  
      26.     RadialGradient radialGradient = null;  
      27.     //聲明一個(gè)掃描漸變  
      28.     //-圍繞一個(gè)中心點(diǎn)掃描漸變就像電影里那種雷達(dá)掃描  
      29.     SweepGradient sweepGradient = null;  
      30.     //聲明一個(gè)組合渲染  
      31.     ComposeShader composeShader = null;  
      32.     //定義畫筆  
      33.     Paint paint = null;  
      34.     //利用這個(gè)類也可以實(shí)現(xiàn)繪制圖像的功能  
      35.     ShapeDrawable shapeDrawable = null;  
      36.       
      37.     public ShaderView(Context context) {  
      38.         super(context);  
      39.         surfaceHolder = this.getHolder();  
      40.         //增加回調(diào)  
      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.         //組合線性和環(huán)形兩種漸變,當(dāng)然其他的也可以的  
      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.         //構(gòu)造形狀為橢圓的shapeDrawable對象  
      101.         shapeDrawable = new ShapeDrawable(new OvalShape());  
      102.         //設(shè)置顯示的圖片  
      103.         shapeDrawable.getPaint().setShader(bitmapShader);  
      104.         //設(shè)置顯示的長和高  
      105.         shapeDrawable.setBounds(0, 0, bitPicWidth, bitPicHeight);  
      106.         //繪制圖像  
      107.         shapeDrawable.draw(canvas);  
      108.         //~~~LinearGradient~~~  
      109.         //設(shè)置畫筆的渲染類型  
      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. }  

       

      總結(jié):

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

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

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

      最后繪制的時(shí)候用此畫筆即可。

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


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

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

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

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

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

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

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

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


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

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

    觸發(fā)
     android.view.SurfaceHolder.Callback
    1.surfaceDestroyed
    2.surfaceCreated
    3.surfaceChanged

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

    僅列出標(biāo)題
    共17頁: First 上一頁 5 6 7 8 9 10 11 12 13 下一頁 Last 
    主站蜘蛛池模板: 极品美女一级毛片免费| 在线观看91精品国产不卡免费| 在线观看亚洲免费视频| 亚洲综合色一区二区三区小说| 国产亚洲?V无码?V男人的天堂| 日韩激情淫片免费看| 99视频全部免费精品全部四虎| 免费人成在线观看视频高潮| 美女无遮挡免费视频网站| 亚洲综合在线一区二区三区| 亚洲伊人tv综合网色| 亚洲日韩精品无码一区二区三区| 国产无遮挡色视频免费视频| 插B内射18免费视频| 日本zzzzwww大片免费| 可以免费观看的毛片| 中文字幕免费观看视频| 全部一级一级毛片免费看| 精品亚洲成a人在线观看| 国产 亚洲 中文在线 字幕| 亚洲美免无码中文字幕在线| 亚洲AV成人无码久久精品老人| 亚洲综合熟女久久久30p| 亚洲精品在线视频| 亚洲精品无码专区2| 亚洲午夜精品一级在线播放放| 亚洲JIZZJIZZ中国少妇中文| 国产精品极品美女免费观看| 永久黄网站色视频免费观看| 在线免费观看污网站| 岛国大片免费在线观看| 成全视频免费高清| 男女交性永久免费视频播放| 日韩电影免费在线| 免费人成网站在线播放| 亚洲高清无码在线观看| 亚洲日韩在线第一页| 国产亚洲精品自在线观看| 亚洲午夜国产精品无码老牛影视| 亚洲熟妇丰满多毛XXXX| 亚洲AV无码专区亚洲AV伊甸园|