Android使用PorterDuffXfermode实现遮罩效果
當我們在程序里需要做遮罩效果時,可以PorterDuffXfermode類實現。
例如有一副圖片,需要使用一個圖形(一般是可以使用Canvas畫出來的圖形),圖形覆蓋到的地方在圖片上才顯示出來,可以使用PorterDuff.Mode.SRC_IN屬性實現,常見的有圓形頭像的實現。
先創建圖片Bitmap一樣大小的Canvas,再設置將圖形畫到Canvas里,再畫圖片bitmap畫到Canvas里。
例子:
private Bitmap createDoneImage() {if (mDoneDegrees < 0 || mDoneBitmap == null) {return null;}int width = mDoneBitmap.getWidth();int height = mDoneBitmap.getHeight();Paint paint = new Paint();paint.setAntiAlias(true);Bitmap target = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);Canvas canvas = new Canvas(target);canvas.drawRect(0, 0, width * mDoneDegrees, height, paint);paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));canvas.drawBitmap(mDoneBitmap, 0, 0, paint);return target;}如果想在圖片不顯示圖形所在的地方,可以使用PorterDuff.Mode.SRC_OUT屬性實現。
例子:
private Bitmap createUpImage() {if (mUpBitmap == null || mAnimHeight == -1 || mUpAlpha < 0) {return null;}int width = mUpBitmap.getWidth();int height = mUpBitmap.getHeight();Paint paint = new Paint();paint.setAntiAlias(true);Bitmap target = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);Canvas canvas = new Canvas(target);canvas.drawRect(0, mAnimHeight - mHeight, width, mAnimHeight, paint);paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_OUT));canvas.drawBitmap(mUpBitmap, 0, 0, paint);return target;}在Android的PorterDuff.Mode類中列舉了他們制定的規則:
PorterDuff.Mode.SRC :只繪制源圖像
PorterDuff.Mode.DST :只繪制目標圖像
PorterDuff.Mode.DST_OVER :在源圖像的頂部繪制目標圖像
PorterDuff.Mode.DST_IN :只在源圖像和目標圖像相交的地方繪制目標圖像
PorterDuff.Mode.DST_OUT :只在源圖像和目標圖像不相交的地方繪制目標圖像
PorterDuff.Mode.DST_ATOP :在源圖像和目標圖像相交的地方繪制目標圖像,在不相交的地方繪制源圖像
PorterDuff.Mode.SRC_OVER :在目標圖像的頂部繪制源圖像
PorterDuff.Mode.SRC_IN :只在源圖像和目標圖像相交的地方繪制源圖像
PorterDuff.Mode.SRC_OUT :只在源圖像和目標圖像不相交的地方繪制源圖像
PorterDuff.Mode.SRC_ATOP :在源圖像和目標圖像相交的地方繪制源圖像,在不相交的地方繪制目標圖像
PorterDuff.Mode.XOR :在源圖像和目標圖像重疊之外的任何地方繪制他們,而在不重疊的地方不繪制任何內容
PorterDuff.Mode.LIGHTEN :獲得每個位置上兩幅圖像中最亮的像素并顯示
PorterDuff.Mode.DARKEN :獲得每個位置上兩幅圖像中最暗的像素并顯示
PorterDuff.Mode.MULTIPLY :將每個位置的兩個像素相乘,除以255,然后使用該值創建一個新的像素進行顯示。結果顏色=頂部顏色*底部顏色/255
PorterDuff.Mode.SCREEN :反轉每個顏色,執行相同的操作(將他們相乘并除以255),然后再次反轉。結果顏色=255-(((255-頂部顏色)*(255-底部顏色))/255)
總結
以上是生活随笔為你收集整理的Android使用PorterDuffXfermode实现遮罩效果的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: laravel 递归 无限层级分类
- 下一篇: Android自定义属性动画