日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

android 高级画布绘图

發布時間:2025/5/22 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android 高级画布绘图 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

11.4.3? 高級畫布繪圖(3)

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

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

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

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

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

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

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

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

  • 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方法,如下所示:

  • AvoidXfermode?avoid?=?new?AvoidXfermode(Color.BLUE,?10,?AvoidXfermode.Mode.?AVOID); ?
  • borderPen.setXfermode(avoid);?
  • 3. 使用抗鋸齒效果提高Paint質量

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

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

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

  • myPaint.setSubpixelText(true); ?
  • myPaint.setAntiAlias(true);?
  • 4. 2D圖形的硬件加速

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

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

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

  • 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,而不是手動地重新繪制。

    6. 高級指南針表盤的例子

    在第4章中,已經創建了一個簡單的指南針。而在上一章,你又回到了這個例子,對它進行了擴展從而使它夠使用加速計硬件來顯示橫向和縱向方向。

    那些例子中的UI都很簡單,從而保證了那些章節中的代碼都盡可能地清晰。

    在下面的例子中,將對CompassView的onDraw方法做一些重要的改動,從而把它從一個簡單的、平面的指南針,變成一個動態的航空地平儀(artificial horizon ),如圖11-2所示。

    ?
    圖11-2

    轉載于:https://www.cnblogs.com/zsw-1993/archive/2012/09/25/4880853.html

    總結

    以上是生活随笔為你收集整理的android 高级画布绘图的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。