自定义View基础:Android中的颜色和颜色混合
一.簡單介紹Android中的顏色
安卓支持的顏色模式:
PS:其中字母表示通道類型,數值表示該類型用多少位二進制來描述。如ARGB8888則表示有四個通道(ARGB),每個對應的通道均用8位來描述。
注意:我們常用的是ARGB8888和ARGB4444,而在所有的安卓設備屏幕上默認的模式都是RGB565,請留意這一點。
以ARGB8888為例介紹顏色定義:
A 從ox00到oxff表示從透明到不透明。
RGB 從0x00到0xff表示顏色從淺到深。
二、Android中創建和使用顏色的方法
1.java中定義顏色
int color = Color.RED;int colorARGB = Color.argb(123,50,50,50);int colorNumber = 0xaabbccdd;
2.在xml文件中定義顏色
<?xml version="1.0" encoding="utf-8"?> <resources><color name="colorPrimary">#3F51B5</color><color name="colorPrimaryDark">#303F9F</color><color name="colorAccent">#FF4081</color> </resources>
詳解: 在以上xml文件中定義了兩個顏色,紅色和藍色,是沒有alpha(透明)通道的。
定義顏色以‘#’開頭,后面跟十六進制的值,有如下幾種定義方式:
#f00 //低精度 - 不帶透明通道紅色#af00 //低精度 - 帶透明通道紅色#ff0000 //高精度 - 不帶透明通道紅色#aaff0000 //高精度 - 帶透明通道紅色
3.在java文件中引用xml中定義的顏色:
4.在xml文件(layout或style)中引用或者創建顏色
四.顏色混合模式(Alpha通道相關)
我們前邊的介紹中說明了顏色的透明度是根據Alpha通道的值來確定的,但是我們的手機屏幕并不是透明的,所以我們的界面顏色其實也可以看做不是透明的,那么我們的透明度效果是如何實現的呢,就是我們的顏色合成。
(RGB通道) 最終顏色 = 繪制的顏色 + (1 - 繪制顏色的透明度) × Canvas上的原有顏色。
Android為我們提供了用于合成的api
Paint.setXfermode(mXfermode);下面貼出來一張官網的圖,原理自己理解吧,不是很清楚。
五、我們每一種模式都測試一下。
圖層和合成,到底合成的是什么?這個要理解清楚,其實合成的是兩個界面交叉的部分。比如一個圖片上覆蓋了另外一層圖。那么合成處理的就是這個交叉覆蓋的部分。下面有兩個概念:目標圖是先繪制的圖,源圖就是后繪制的圖。
首先看一段完整的代碼:
package net.fitrun.mysvg;import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.PorterDuff; import android.graphics.PorterDuffXfermode; import android.graphics.RectF; import android.graphics.Xfermode; import android.view.View;/*** Created by 晁東洋 on 2017/3/23.*/public class PorterDuffXfermodeView extends View{private Paint mPaint;private Bitmap dstBmp, srcBmp;private RectF dstRect, srcRect;private Xfermode mXfermode;private PorterDuff.Mode mPorterDuffMode = PorterDuff.Mode.ADD;public PorterDuffXfermodeView(Context context) {super(context);mPaint = new Paint(Paint.ANTI_ALIAS_FLAG|Paint.FILTER_BITMAP_FLAG);dstBmp = BitmapFactory.decodeResource(getResources(), R.mipmap.tu);srcBmp = BitmapFactory.decodeResource(getResources(), R.mipmap.yangying);mXfermode = new PorterDuffXfermode(mPorterDuffMode);}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);//背景色設為白色,方便比較效果canvas.drawColor(Color.WHITE);//將繪制操作保存到新的圖層,因為圖像合成是很昂貴的操作,將用到硬件加速,這里將圖像合成的處理放到離屏緩存中進行RectF rectF = new RectF(0,0,1000,1000);int saveCount = canvas.saveLayer(rectF, mPaint, Canvas.ALL_SAVE_FLAG);//繪制目標圖RectF DErectF = new RectF(0,0,500,500);canvas.drawBitmap(dstBmp, null, DErectF, mPaint);//設置混合模式// mPaint.setXfermode(mXfermode);//繪制源圖RectF RSrectF = new RectF(250,250,800,800);canvas.drawBitmap(srcBmp, null, RSrectF, mPaint);//清除混合模式mPaint.setXfermode(null);//還原畫布canvas.restoreToCount(saveCount);}}此段代碼是沒有使用混合模式的代碼,就是繪制兩個圖到屏幕上。其中有一些重要的地方需要提前說明一下,canVas.saveLayer(),此方法為設置一個新的圖層,因為Android系統本身就會有背景圖和背景顏色,所以我們設置一個新的透明圖層來處理我們的圖像合成,代碼最后一段還原一下就OK了,如果不這樣會遇到各種各樣的問題,不能正確的顯示我們合成的效果。下面看一下我們沒有合成效果的界面效果:
ADD模式交叉的部分相互融合高亮。
CLEAR模式清除交叉部分的圖像,以及上層的圖片。很多博文片面的說是清除所有,是不客觀的。
DARKEN模式沒看到什么效果:
DST模式只顯示目標圖:
DST_ATOP模式:只顯示交叉部分以外的目標圖
DST_IN顯示目標圖交叉的部分以及沒有被覆蓋部分的圖
篇幅有限,各種模式大家可以一個一個的去實驗。最后提醒一點,由于擺放的位置不同同樣會產生不同的效果。網上流傳的很廣的一張ApiDemos/Graphics/XferModes的圖,其實很好理解其中的一些模式,但是不要只看圖,一定要親自測試,否則你會理解錯了它所表示的意思。
博客已經移步:chaodongyang.com
關注微信公眾號獲取更多資訊:
總結
以上是生活随笔為你收集整理的自定义View基础:Android中的颜色和颜色混合的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 人工智能的创业方向到底怎么选?
- 下一篇: android动态分区AB升级,Andr