自定义View基础:Android中的颜色和颜色混合
一.簡(jiǎn)單介紹Android中的顏色
安卓支持的顏色模式:
PS:其中字母表示通道類型,數(shù)值表示該類型用多少位二進(jìn)制來(lái)描述。如ARGB8888則表示有四個(gè)通道(ARGB),每個(gè)對(duì)應(yīng)的通道均用8位來(lái)描述。
注意:我們常用的是ARGB8888和ARGB4444,而在所有的安卓設(shè)備屏幕上默認(rèn)的模式都是RGB565,請(qǐng)留意這一點(diǎn)。
以ARGB8888為例介紹顏色定義:
A 從ox00到oxff表示從透明到不透明。
RGB 從0x00到0xff表示顏色從淺到深。
二、Android中創(chuàng)建和使用顏色的方法
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>
詳解: 在以上x(chóng)ml文件中定義了兩個(gè)顏色,紅色和藍(lán)色,是沒(méi)有alpha(透明)通道的。
定義顏色以‘#’開(kāi)頭,后面跟十六進(jìn)制的值,有如下幾種定義方式:
#f00 //低精度 - 不帶透明通道紅色#af00 //低精度 - 帶透明通道紅色#ff0000 //高精度 - 不帶透明通道紅色#aaff0000 //高精度 - 帶透明通道紅色
3.在java文件中引用xml中定義的顏色:
4.在xml文件(layout或style)中引用或者創(chuàng)建顏色
四.顏色混合模式(Alpha通道相關(guān))
我們前邊的介紹中說(shuō)明了顏色的透明度是根據(jù)Alpha通道的值來(lái)確定的,但是我們的手機(jī)屏幕并不是透明的,所以我們的界面顏色其實(shí)也可以看做不是透明的,那么我們的透明度效果是如何實(shí)現(xiàn)的呢,就是我們的顏色合成。
(RGB通道) 最終顏色 = 繪制的顏色 + (1 - 繪制顏色的透明度) × Canvas上的原有顏色。
Android為我們提供了用于合成的api
Paint.setXfermode(mXfermode);下面貼出來(lái)一張官網(wǎng)的圖,原理自己理解吧,不是很清楚。
五、我們每一種模式都測(cè)試一下。
圖層和合成,到底合成的是什么?這個(gè)要理解清楚,其實(shí)合成的是兩個(gè)界面交叉的部分。比如一個(gè)圖片上覆蓋了另外一層圖。那么合成處理的就是這個(gè)交叉覆蓋的部分。下面有兩個(gè)概念:目標(biāo)圖是先繪制的圖,源圖就是后繪制的圖。
首先看一段完整的代碼:
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);//背景色設(shè)為白色,方便比較效果canvas.drawColor(Color.WHITE);//將繪制操作保存到新的圖層,因?yàn)閳D像合成是很昂貴的操作,將用到硬件加速,這里將圖像合成的處理放到離屏緩存中進(jìn)行RectF rectF = new RectF(0,0,1000,1000);int saveCount = canvas.saveLayer(rectF, mPaint, Canvas.ALL_SAVE_FLAG);//繪制目標(biāo)圖RectF DErectF = new RectF(0,0,500,500);canvas.drawBitmap(dstBmp, null, DErectF, mPaint);//設(shè)置混合模式// mPaint.setXfermode(mXfermode);//繪制源圖RectF RSrectF = new RectF(250,250,800,800);canvas.drawBitmap(srcBmp, null, RSrectF, mPaint);//清除混合模式mPaint.setXfermode(null);//還原畫布canvas.restoreToCount(saveCount);}}此段代碼是沒(méi)有使用混合模式的代碼,就是繪制兩個(gè)圖到屏幕上。其中有一些重要的地方需要提前說(shuō)明一下,canVas.saveLayer(),此方法為設(shè)置一個(gè)新的圖層,因?yàn)锳ndroid系統(tǒng)本身就會(huì)有背景圖和背景顏色,所以我們?cè)O(shè)置一個(gè)新的透明圖層來(lái)處理我們的圖像合成,代碼最后一段還原一下就OK了,如果不這樣會(huì)遇到各種各樣的問(wèn)題,不能正確的顯示我們合成的效果。下面看一下我們沒(méi)有合成效果的界面效果:
ADD模式交叉的部分相互融合高亮。
CLEAR模式清除交叉部分的圖像,以及上層的圖片。很多博文片面的說(shuō)是清除所有,是不客觀的。
DARKEN模式?jīng)]看到什么效果:
DST模式只顯示目標(biāo)圖:
DST_ATOP模式:只顯示交叉部分以外的目標(biāo)圖
DST_IN顯示目標(biāo)圖交叉的部分以及沒(méi)有被覆蓋部分的圖
篇幅有限,各種模式大家可以一個(gè)一個(gè)的去實(shí)驗(yàn)。最后提醒一點(diǎn),由于擺放的位置不同同樣會(huì)產(chǎn)生不同的效果。網(wǎng)上流傳的很廣的一張ApiDemos/Graphics/XferModes的圖,其實(shí)很好理解其中的一些模式,但是不要只看圖,一定要親自測(cè)試,否則你會(huì)理解錯(cuò)了它所表示的意思。
博客已經(jīng)移步:chaodongyang.com
關(guān)注微信公眾號(hào)獲取更多資訊:
總結(jié)
以上是生活随笔為你收集整理的自定义View基础:Android中的颜色和颜色混合的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 人工智能的创业方向到底怎么选?
- 下一篇: android动态分区AB升级,Andr