1. 程式人生 > >細數PorterDuffXferMode的幾個坑, PorterDuffXferMode不正確的真正原因

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

菜雞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(PorterDuff.Mode.DST_IN),  
  55.             new PorterDuffXfermode(PorterDuff.Mode.SRC_OUT),  
  56. 相關推薦

    PorterDuffXferMode PorterDuffXferMode正確真正原因

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

    備註一下

    1、ROS下的libboost只能是1.5.4的,更新1.5.5會使得RoS安裝出現各種問題,如PCL無法安裝等。 2、CAFFE下liboost是1.55的,如果用cmake ..編譯,則有些增加內容如MPI無法編譯,pycaffe也無法編譯。只能手動改make con

    初學Java學員千萬不要踩這

    2019即將到來,我們的程式設計界的大佬不由得發表一波感慨,新的一年將會有哪些語言上榜,不過小編還是相信Java不會落榜的。今天我們來談一下那寫年學習Java踩的坑。 一、敲程式碼追求速度,沒有正確率 相信看過很多大神打程式碼速度非常快,自己也想擁有那樣的速度,但是敲完程式碼一執行,你只會有

    Java日常開發的21你踩過

    ### 前言 最近看了極客時間的《Java業務開發常見錯誤100例》,再結合平時踩的一些程式碼坑,寫寫總結,希望對大家有幫助,感謝閱讀~ ### 1. 六類典型空指標問題 - 包裝型別的空指標問題 - 級聯呼叫的空指標問題 - Equals方法左邊的空指標問題 - ConcurrentHashMap 這樣

    前端還原設計圖常遇到的

    自己 而且 滾動 設備 背景 body -s 解決 back 1.問題:一張背景圖,適應大小不一的設備,而且不出現滾動條,圖片不會變形。 解決方法:body{background-size:cover}就可以搞定。 2.問題:背景圖顯示在頁面上非常大,或非常小,顯得頁面很不

    學習Java分為階段分別是什麽?

    java hiberna 我不 參加 file類 循環 堆外 read 網絡 多年前我自學的時候是很茫然,上網問問題,總是一堆外行的人說很難啊,你需要這樣需要那樣,不然就是,一堆人說一些空話,多看多寫,買好書,我很無語,除了這些就沒有自己的一些想法嗎? 首先很多人認為學JA

    互聯網大咖都要收藏的網站純幹貨

    發現 分析 選擇 ppt 咨詢 描述 意思 官方 img 有句俗話說的好:裝逼首選豆瓣,吹牛當然還是上知乎!這句話從側面反映出了網民朋友們在互聯網上的”淘樂樂“的心態!如今,誰的pc上沒有幾個收藏夾,估計沒有的人都會覺得不好意思吧。 如今,大家發現好的網站都會第一時間放到自

    Java踩筆記:ObjectIOStream與IOStream的各種裝飾器(先挖以後再來詳細填)

    ted objects lose val read thread 環境 valid 序列化對象 Java的序列化和ObjectStream真是一個大坑。。 先不說多線程環境下的問題,在單線程裏,一個Socket只能保持一個ObjectOutputStream,原因好像是

    C語言中可變參的函(三“...”)

    stdarg url title amp 至少 關閉 .com temp () C語言中可變參數的函數(三個點,“...”)   本文主要介紹va_start和va_end的使用及原理。   在以前的一篇帖子Format MessageBox 詳解中曾使用到va_st

    寫一個Spring+SpringMVC+Mybatis的項目

    pri 自己 什麽 空間 ati 並且 servle 用戶註冊 留言板   想挖個坑督促自己練技術,有時候想到一個項目,大概想了一些要實現的功能,怎麽實現。現在覺得自己差不多能完成QQ空間的主要功能了。準備立個牌坊,寫一個類似功能的網站。並且把進度放到這裏來。   初步計劃

    Python:print()函常用參

    com file open 默認 strong 其他 end 空格 文件的 1.參數sep:設置輸出字符產之間的字符串。默認是空格 1 name=‘Tomwenxing‘ 2 age=‘23‘ 3 job=‘student‘ 4 print(name,age,job) 5

    【項目管理】經驗之談 | 資深項目經理都避免的5你中招了嗎?

    尊重 最終 fail 同方 快速 這就是 tro 理解 動力 哈嘍!大家好! 那天看到最有趣的一句話就是 為了填坑,一位項目經理胖了20斤 。。。。。 今天就給大家介紹一下 項目經理要註意的那些“坑” 項目經理“誤踩雷區” 1 未告知成員工作目標 作為項目經理

    電腦配置太低?使用這網站你的電腦軟件要少裝一半!

    atp 一周 即使 exc 你們的 不用 過多 電腦軟件 提升 你還在為你的電腦配置太低導致軟件過多而卡頓感到煩惱?還是電腦遊戲太多,無法運行一些其他軟件而不開心?其實不用難過,小編教你們使用一些在線網站,可以輕松的將你的電腦上的軟件少安裝一半!你們準備好了嗎! 一.創客

    CSS響應式:根據分辨路加載不同CSS的方法親測可用

    響應 col 但是 max-width width media 總結 屏幕 link 有時候你需要把同一個頁面在手機和pc同時打開,其中有一個辦法就是判斷不同分辨路加載不同的css 小編總結了幾種分別加載css的方法: 1.比較復雜的使用js判斷加載不同css (親

    使用箭頭函註意事項

    def this 阮一峰 gpo -- asc 報錯 註意點 一個 剛才寫一個需要遞歸操作的函數,在使用arguments.callee的時候,報錯undefined,因為arguments.callee在嚴格模式下會失效,以為是使用了=>箭頭函數後,函數內部環境會以

    python 函屬性 func_name, func_code等

    pytho test cts als size attribute odin put lob   直接見代碼: 1 #!/usr/bin/env python 2 # -*- coding: utf-8 -*- 3 # @Time : 2018/07/25 1

    匿名函和匿名函相互合作

    作業 code NPU != 行為 一個 lines 偶數 根據 匿名函數 lambda 函數體: lambda 參數: 返回值 1 ret = lambda x :x*2 2 print(ret(2)) 和匿名函數相互合作多的內置函數 1.map ---------

    (轉)Amazon AWS 的

    亞馬遜的AWS服務,比阿里雲好太多〜講服務的文章太多了,就不多說,主機教程也是一大堆~~在這裡只說說我遇到的幾個“免費”坑。   1.首先友情提示,選擇好自己主機的地址,這對訪問速度來說十分重要。 如果主要面向大陸地區,選擇東京和首爾都是很好的,比美國東部,西部訪問國內的速度

    學習程式設計的25你踩到了嗎?

    0、忽視了程式設計終究是以人為本的。是的,機器的確會執行你的程式碼,但程式設計是為人們解決問題的,將他們的需求轉換為由其他人(或你自己線下)讀取,維護和修改的程式碼。 1、未能花充足的時間練習程式設計。 根據工作或日程安排,你可能會花費大量時間在與程式設計相關的任務上,但實際上這些並非程式設計本

    xorm中的

    專案中使用的是xorm,雖然用了很順手了,可是還是會遇到一些坑,這裡紀錄一些。 結構體自動忽略空欄位 在xorm中,結構體會自動忽略空欄位(或則說預設值,比如int 的0 ,string的""),這個時候,怎麼解決呢? 把結構體中的欄位,提到where語句的條件中,比如: orm.Get(&Us