日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

自定义View基础:Android中的颜色和颜色混合

發布時間:2023/12/8 Android 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 自定义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中定義的顏色:

int color = getResources().getColor(R.color.mycolor);int color = getColor(R.color.myColor); //API 23 及以上支持該方法


4.在xml文件(layout或style)中引用或者創建顏色

<!--在style文件中引用--><style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"><item name="colorPrimary">@color/red</item></style> <!--在layout文件中的引用 -->android:background="@color/red" //引用在/res/values/color.xml 中定義的顏色android:background="#ff0000" //創建并使用顏色

四.顏色混合模式(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中的颜色和颜色混合的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。