細數PorterDuffXferMode的幾個坑, PorterDuffXferMode不正確的真正原因
菜雞wing遇敵PorterDuffXferMode,不料過於輕敵,應戰吃力。隨後與其大戰三天三夜,三百餘回合不分勝負。幸得 @咪咪控 相助,僥倖獲勝。
關鍵字:PorterDuffXferMode 錯誤 不正確 不達到預期 bug
上一篇帶來一個使用PorterDuffXferMode 做的 水波紋loadingview,中間遇到了點小困難。
(說人話) PorterDuffXferMode總是不能按照效果圖預期的效果執行。關於PorterDuffXferMode的錯誤顯示是一個對初學者十分深的坑,到底是bug呢,還是有需要注意的地方呢。這裡就跟隨我 帶上手電筒,去一探究竟。
轉載請註明出處:http://blog.csdn.net/wingichoy/article/details/50534175
首先,大家都知道有一個圖片:
然後,大部分時候 是看到了覺得很神奇,就躍躍欲試,尤其是src_in 和dstIn可以實現遮罩效果,例如圓角圖片 圓形圖片都用了這種模式。
於是就挨個測試各種模式是否生效,結果往往不能達到預期效果。我們來做個測試。
從最簡單的開始:
1.直接在canvas上面繪製圖形:
- @Override
-
protectedvoid onDraw(Canvas canvas) {
- //dst
- canvas.drawRect(20,20,80,80,mDstPaint);
- //src
- canvas.drawCircle(30,30,30,mSrcPaint);
- }
原圖效果是這樣的:
現在加一個mode上來,XOR
- @Override
- protectedvoid onDraw(Canvas canvas) {
- //dst
- canvas.drawRect(20,20,80,80,mDstPaint);
-
mSrcPaint.setXfermode(new
- //src
- canvas.drawCircle(30,30,30,mSrcPaint);
- }
WTF!!?? 這是什麼鬼。不應該是相交部分消失嗎。 網上說“硬體加速”對這個有影響,那麼在構造器裡關閉硬體加速試一下:
- public TestView(Context context, AttributeSet attrs, int defStyleAttr) {
- super(context, attrs, defStyleAttr);
- mDstPaint = new Paint();
- mSrcPaint = new Paint();
- mDstPaint.setColor(Color.YELLOW);
- mSrcPaint.setColor(Color.BLUE);
- setLayerType(View.LAYER_TYPE_SOFTWARE, null);
- }
執行的結果:
這下正常了。相交的部分消失了。
結論1:硬體加速對PorterDuffXferMode有影響,使用前請關閉硬體加速。
那麼這下真的天下太平了嗎?nonono~不要太天真,不然怎麼能叫萬丈深淵呢。
繼續試驗其他模式: 將模式改為SRC_IN
WTF?????跟效果圖根本不一致好嗎!!!! 在試試DST_IN
你確定你沒有在逗我???? 怎麼是這個鬼東西。 (當時鼓搗了我三天四夜,一直在日狗,不過先別急,慢慢來。)
為什麼一定要按照那個效果圖來呢。。。 因為特麼的那個圖是官方的一個demo。。 那麼我們就來看看這個demo長什麼樣!
- package io.appium.android.apis.graphics;
- import android.content.Context;
- import android.graphics.Bitmap;
- import android.graphics.BitmapShader;
- import android.graphics.Canvas;
- import android.graphics.Color;
- import android.graphics.Matrix;
- import android.graphics.Paint;
- import android.graphics.PorterDuff;
- import android.graphics.PorterDuffXfermode;
- import android.graphics.RectF;
- import android.graphics.Shader;
- import android.graphics.Xfermode;
- import android.os.Bundle;
- import android.view.View;
- publicclass Xfermodes extends GraphicsActivity {
- // create a bitmap with a circle, used for the "dst" image
- static Bitmap makeDst(int w, int h) {
- Bitmap bm = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
- Canvas c = new Canvas(bm);
- Paint p = new Paint(Paint.ANTI_ALIAS_FLAG);
- p.setColor(0xFFFFCC44);
- c.drawOval(new RectF(0, 0, w*3/4, h*3/4), p);
- return bm;
- }
- // create a bitmap with a rect, used for the "src" image
- static Bitmap makeSrc(int w, int h) {
- Bitmap bm = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
- Canvas c = new Canvas(bm);
- Paint p = new Paint(Paint.ANTI_ALIAS_FLAG);
- p.setColor(0xFF66AAFF);
- c.drawRect(w/3, h/3, w*19/20, h*19/20, p);
- return bm;
- }
- @Override
- protectedvoid onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(new SampleView(this));
- }
- privatestaticclass SampleView extends View {
- privatestaticfinalint W = 64;
- privatestaticfinalint H = 64;
- privatestaticfinalint ROW_MAX = 4; // number of samples per row
- private Bitmap mSrcB;
- private Bitmap mDstB;
- private Shader mBG; // background checker-board pattern
- privatestaticfinal Xfermode[] sModes = {
- new PorterDuffXfermode(PorterDuff.Mode.CLEAR),
- new PorterDuffXfermode(PorterDuff.Mode.SRC),
- new PorterDuffXfermode(PorterDuff.Mode.DST),
- new PorterDuffXfermode(PorterDuff.Mode.SRC_OVER),
- new PorterDuffXfermode(PorterDuff.Mode.DST_OVER),
- new PorterDuffXfermode(PorterDuff.Mode.SRC_IN),
- new PorterDuffXfermode(PorterDuff.Mode.DST_IN),
- new PorterDuffXfermode(PorterDuff.Mode.SRC_OUT),
-
相關推薦
細數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