1. 程式人生 > >PorterDuffXferMode不正確的真正原因PorterDuffXferMode深入試驗

PorterDuffXferMode不正確的真正原因PorterDuffXferMode深入試驗

原文地址:http://blog.csdn.net/wingichoy/article/details/50534175

感謝博主“郵電三精-大精wing”,不小心踩坑加班,還好解決了。

菜雞wing遇敵PorterDuffXferMode,不料過於輕敵,應戰吃力。隨後與其大戰三天三夜,三百餘回合不分勝負。幸得 @咪咪控 相助,僥倖獲勝。

關鍵字:PorterDuffXferMode  錯誤 不正確  不達到預期  bug

上一篇帶來一個使用PorterDuffXferMode  做的 水波紋loadingview,中間遇到了點小困難。

(說人話)  PorterDuffXferMode總是不能按照效果圖預期的效果執行。關於PorterDuffXferMode的錯誤顯示是一個對初學者十分深的坑,到底是bug呢,還是有需要注意的地方呢。這裡就跟隨我 帶上手電筒,去一探究竟。

轉載請註明出處:http://blog.csdn.NET/wingichoy/article/details/50534175

首先,大家都知道有一個圖片:


然後,大部分時候 是看到了覺得很神奇,就躍躍欲試,尤其是src_in  和dstIn可以實現遮罩效果,例如圓角圖片 圓形圖片都用了這種模式。

於是就挨個測試各種模式是否生效,結果往往不能達到預期效果。我們來做個測試。

從最簡單的開始:

1.直接在canvas上面繪製圖形

  1. @Override
  2.   protectedvoid onDraw(Canvas canvas) {  
  3.       //dst
  4.       canvas.drawRect(20,20,80,80,mDstPaint);  
  5.       //src
  6.       canvas.drawCircle(30,30,30,mSrcPaint);  
  7.   }  

原圖效果是這樣的:


現在加一個mode上來,XOR

  1. @Override
  2. protectedvoid onDraw(Canvas canvas) {  
  3.     //dst
  4.     canvas.drawRect(20,20,80,80,mDstPaint);  
  5.     mSrcPaint.setXfermode(new
     PorterDuffXfermode(PorterDuff.Mode.XOR));  
  6.     //src
  7.     canvas.drawCircle(30,30,30,mSrcPaint);  
  8. }  
跑起來的結果是這樣的:

WTF!!?? 這是什麼鬼。不應該是相交部分消失嗎。 網上說“硬體加速”對這個有影響,那麼在構造器裡關閉硬體加速試一下:

  1. public TestView(Context context, AttributeSet attrs, int defStyleAttr) {  
  2.        super(context, attrs, defStyleAttr);  
  3.        mDstPaint = new Paint();  
  4.        mSrcPaint = new Paint();  
  5.        mDstPaint.setColor(Color.YELLOW);  
  6.        mSrcPaint.setColor(Color.BLUE);  
  7.        setLayerType(View.LAYER_TYPE_SOFTWARE, null);  
  8.    }  

執行的結果:

這下正常了。相交的部分消失了。

結論1:硬體加速對PorterDuffXferMode有影響,使用前請關閉硬體加速。

那麼這下真的天下太平了嗎?nonono~不要太天真,不然怎麼能叫萬丈深淵呢。

繼續試驗其他模式:  將模式改為SRC_IN


WTF?????跟效果圖根本不一致好嗎!!!! 在試試DST_IN


你確定你沒有在逗我????  怎麼是這個鬼東西。  (當時鼓搗了我三天四夜,一直在日狗,不過先別急,慢慢來。)

為什麼一定要按照那個效果圖來呢。。。 因為特麼的那個圖是官方的一個demo。。 那麼我們就來看看這個demo長什麼樣!

  1. package io.appium.android.apis.graphics;  
  2. import android.content.Context;  
  3. import android.graphics.Bitmap;  
  4. import android.graphics.BitmapShader;  
  5. import android.graphics.Canvas;  
  6. import android.graphics.Color;  
  7. import android.graphics.Matrix;  
  8. import android.graphics.Paint;  
  9. import android.graphics.PorterDuff;  
  10. import android.graphics.PorterDuffXfermode;  
  11. import android.graphics.RectF;  
  12. import android.graphics.Shader;  
  13. import android.graphics.Xfermode;  
  14. import android.os.Bundle;  
  15. import android.view.View;  
  16. publicclass Xfermodes extends GraphicsActivity {  
  17.     // create a bitmap with a circle, used for the "dst" image
  18.     static Bitmap makeDst(int w, int h) {  
  19.         Bitmap bm = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);  
  20.         Canvas c = new Canvas(bm);  
  21.         Paint p = new Paint(Paint.ANTI_ALIAS_FLAG);  
  22.         p.setColor(0xFFFFCC44);  
  23.         c.drawOval(new RectF(00, w*3/4, h*3/4), p);  
  24.         return bm;  
  25.     }  
  26.     // create a bitmap with a rect, used for the "src" image
  27.     static Bitmap makeSrc(int w, int h) {  
  28.         Bitmap bm = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);  
  29.         Canvas c = new Canvas(bm);  
  30.         Paint p = new Paint(Paint.ANTI_ALIAS_FLAG);  
  31.         p.setColor(0xFF66AAFF);  
  32.         c.drawRect(w/3, h/3, w*19/20, h*19/20, p);  
  33.         return bm;  
  34.     }  
  35.     @Override
  36.     protectedvoid onCreate(Bundle savedInstanceState) {  
  37.         super.onCreate(savedInstanceState);  
  38.         setContentView(new SampleView(this));  
  39.     }  
  40.     privatestaticclass SampleView extends View {  
  41.         privatestaticfinalint W = 64;  
  42.         privatestaticfinalint H = 64;  
  43.         privatestaticfinalint ROW_MAX = 4;   // number of samples per row
  44.         private Bitmap mSrcB;  
  45.         private Bitmap mDstB;  
  46.         private Shader mBG;     // background checker-board pattern
  47.         privatestaticfinal Xfermode[] sModes = {  
  48.             new PorterDuffXfermode(PorterDuff.Mode.CLEAR),  
  49.             new PorterDuffXfermode(PorterDuff.Mode.SRC),  
  50.             new PorterDuffXfermode(PorterDuff.Mode.DST),  
  51.             new PorterDuffXfermode(PorterDuff.Mode.SRC_OVER),  
  52.             new PorterDuffXfermode(PorterDuff.Mode.DST_OVER),  
  53.             new PorterDuffXfermode(PorterDuff.Mode.SRC_IN),  
  54.             new

    相關推薦

    PorterDuffXferMode正確真正原因PorterDuffXferMode深入試驗

    原文地址:http://blog.csdn.net/wingichoy/article/details/50534175 感謝博主“郵電三精-大精wing”,不小心踩坑加班,還好解決了。 菜雞wing遇敵PorterDuffXferMode,不料過於輕

    細數PorterDuffXferMode的幾個坑, PorterDuffXferMode正確真正原因

    菜雞wing遇敵PorterDuffXferMode,不料過於輕敵,應戰吃力。隨後與其大戰三天三夜,三百餘回合不分勝負。幸得 @咪咪控 相助,僥倖獲勝。 關鍵字:PorterDuffXferMode  錯誤 不正確  不達到預期  bug 上一篇帶來一

    modelsim仿真正確FPGA運行正確的可能原因

    仿真 warn bsp pga del 自己的 編譯器優化 綜合 log 困住整整一周了,工作進行不下去,中午偶遇導師,指導意見是有兩種可能: 1. FPGA編譯器優化代碼,可以考慮把綜合過程中所有的warning排查一下 2. verilog裏有不可綜合的語句。 又及

    C#調用dll提示"試圖加載格式正確的程序"原因及解決方法

    strong str 調用 http 解決 操作系統 就會 項目設計 utm 轉載:https://blog.csdn.net/songyi160/article/details/51354660 程序在32位操作系統上運行正常,在64位操作系統上運行讀卡功能提示”試圖加載

    struts2的action是執行緒安全的,struts1的action是執行緒安全的真正原因

    為什麼struts2的action是執行緒安全的,struts1的action不是執行緒安全的? 先對struts1和struts2的原理做一個簡單的講解 對於struts1 ,當第一次**.do的請求過來時,在記憶體中的actionmapping中找到相對應的action,然後new出

    Oracle:ORA-01789: 查詢塊具有正確的結果列數 分析原因和解決辦法

    一、分析原因 union指令的目的是將兩個sql語句的查詢結果合併起來, 可以檢視你要的查詢結果 。 但是要注意使用union連線的兩個sql 語句的欄位型別 、 欄位個數 、 欄位名要求完全匹配 。 union在進行表連線後會對產生的結果進行排序運算 , 刪除重複資料後返回結

    Python中檔名、目錄名或卷標語法正確。: '\u202aE:的錯誤原因

    一般出現這個錯誤是因為在路徑中出現了這個Unicode 202a字元,這個字元的含義是left to right,也就是從左到右的閱讀順序,在寫程式碼的時候顯示不出來,但是在命令列中可以顯示出來:。 那麼它是哪裡來的?我這裡是複製windows檔案屬性的時候複製下圖中的路徑

    電腦公司特別版8.5出現 fastfat.sys檔案正確及藍屏錯誤的原因之一

    昨天晚上用電腦公司特別版8.5進行裝機, 是幾年有的老機子,結果克隆完成後,提示fastfat.sys檔案損壞,真的很奇怪。這張光碟有是剛剛用刻錄的,應該不會有問題。 我開始還真以為檔案壞了, 用xp的原版盤進行的expand還原,結果沒用。然後再刪除分割槽重建,也沒用。後來

    常用的幾種清除float浮動的方法 一、浮動產生原因 簡單地說,浮動是因為使用了float:left或float:right或兩者都有而產生的浮動,導致樣式缺失或者正確顯示等問題; 二、浮動產生

    一、浮動產生原因 簡單地說,浮動是因為使用了float:left或float:right或兩者都有而產生的浮動,導致樣式缺失或者不正確顯示等問題;二、浮動產生負作用1、背景不能顯示由於浮動產生,如果對父級設定了(CSS background背景)CSS背景顏色或CSS背景圖片,而父級不能被撐開,所以導致CSS

    用phpstudy正確配置阿里伺服器 網站就是能瀏覽原因

    用phpstudy 配置PHP+MYSQL阿里雲伺服器, 所有配置都正確,伺服器本地上也正常瀏覽, 但是用繫結伺服器的域名開啟瀏覽就是不行。 原因是阿里雲伺服器上的安全設定問題 阿里雲伺服器預設不能

    [轉貼]顯示卡驅動正確導致黑屏原因

    故障現象:電腦啟動後能正常顯示Windows啟動介面,到了顯示Windows桌面時突然黑屏。  分析解決:經仔細觀查,發現黑屏時顯示器的各個指示燈不停閃爍,這說明顯示器無訊號輸入。因在開機自檢時顯示器能夠正常顯示,同時幾次黑屏的時間均在顯示Windows桌面前,故排除了顯示器與顯示卡接觸不良的可能,初步判斷為

    jsp導出身份證到excel時候格式正確

    excel導出 jsb 沒有 顯示 art num 找到 size 一個 今天早上客戶跟我說excel導出身份證的時候顯示有的對有的不對,我一看原來身份證以X結尾的能夠,其他都顯示不對。身份正顯示如圖所看到的: 在網上搜了一下發現,原來excel看你數

    漢諾塔學習筆記,有正確的地方請小夥伴們指正~·~

    學習 順序執行 == cab -1 nbsp 什麽 猜想 abc 1* n=3.abc; 2* n-1=2,acb; 3* n-1=1,abc 1* n=3,執行hanoi(n-1,A,C,B); =>2* n-1=2,acb執行hanoi

    未能加載文件或程序集“XXXXXX”或它的某一個依賴項。試圖加載格式正確的程序。

    link 依賴項 search 操作系統 true 應用程序 swe clas 格式不正確 原因:操作系統是64位的,但發布的程序引用了一些32位的ddl,所以出現了兼容性的問題解決方案一:如果是64位機器,IIS——應用程序池——高級設置——啟用32位應用程序 :true

    SQL Server 檢測到基於一致性的邏輯 I/O 錯誤 pageid正確、數據庫日誌文 件丟失

    日誌文件 科技 文件丟失 i/o 處理 企業管理 eid dbcc 無法連接 客戶名稱:深圳某科技信息有限公司 數據庫類型:sql2000 數據庫大小:20g 故障經過 電腦突然斷電,軟件就顯示某數據庫錯誤,無法連接,打開企業管理器,顯示數 據庫質疑,DBCC查詢顯示“ S

    修改hosts立即生效原因分析

    real 專註 開始 image 下載 when 顯示 方法 做了 我們經常也遇到修改hosts不生效的情況,而且有時生效,有時不生效的情況也有發生,這到底是為什麽呢? 起:DNS緩存機制 關於DNS緩存的機制,有一篇非常詳細的文章What really happens w

    未能加載文件或程序集“file:///D:/Program Files (x86)/ArcGIS/DeveloperKit10.0/DotNet/ESRI.ArcGIS.3DAnalyst.dll”或它的某一個依賴項。試圖加載格式正確的程序。 行 129,位置 5。

    config onf gac mil runt 方案 htm 添加 conf 能加載文件或程序集“file:///C:/Program Files (x86)/ArcGIS/DeveloperKit10.0/DotNet/ESRI.ArcGIS.ADF.Loca

    CSS 中first-child和last-child起作用原因

    clas 第一個 元素 col 沒有 XML last 發的 n) 今天開發的時候,發現last-child不起作用,看了下原因順便給自己學習CSS選擇器,我們這裏舉個例子,如下代碼:<div><h1>title</h1> <p&g

    【轉】未能加載文件或程序集“XXX”或它的某一個依賴項。試圖加載格式正確的程序。

    平臺 文件 導致 啟用 方法 位置 一個 nbsp cpu “/xxxxx”應用程序中的服務器錯誤。 -------------------------------------------------------------------------------- 未能加載文

    未能加載文件或程序集 或它的某一個依賴項。試圖加載格式正確的程序。問題解決

    啟用 base font 平臺 問題解決 發布 .dll 路徑 article 未能加載文件或程序集 或它的某一個依賴項。試圖加載格式不正確的程序。問題解決 一般情況下出現這樣的問題是因為.dll文件不存在或者路徑不正確。但今天我遇到的情況都不在這兩個內。我確定.dll