Android 颜色

一.简单介绍Android中的颜色

安卓支持的颜色模式:

PS:其中字母表示通道类型,数值表示该类型用多少位二进制来描述。如ARGB8888则表示有四个通道(ARGB),每个对应的通道均用8位来描述。

注意:我们常用的是ARGB8888和ARGB4444,而在所有的安卓设备屏幕上默认的模式都是RGB565,请留意这一点。

以ARGB8888为例介绍颜色定义:

A 从ox00到oxff表示从透明到不透明。

RGB 从0x00到0xff表示颜色从浅到深。

二、Android中创建和使用颜色的方法

1.Java中定义颜色

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. int color = Color.RED;  
  2. int colorARGB = Color.argb(123,50,50,50);  
  3. int colorNumber = 0xaabbccdd;  


2.在xml文件中定义颜色

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <strong><?xml version="1.0" encoding="utf-8"?>  
  2. <resources>  
  3.     <color name="colorPrimary">#3F51B5</color>  
  4.     <color name="colorPrimaryDark">#303F9F</color>  
  5.     <color name="colorAccent">#FF4081</color>  
  6. </resources></strong>  

详解: 在以上xml文件中定义了两个颜色,红色和蓝色,是没有alpha(透明)通道的。

定义颜色以‘#’开头,后面跟十六进制的值,有如下几种定义方式:

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <strong>    #f00            //低精度 - 不带透明通道红色  
  2.     #af00           //低精度 - 带透明通道红色  
  3.   
  4.     #ff0000         //高精度 - 不带透明通道红色  
  5.     #aaff0000       //高精度 - 带透明通道红色</strong>  


3.在java文件中引用xml中定义的颜色:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. int color = getResources().getColor(R.color.mycolor);  
  2.   
  3. int color = getColor(R.color.myColor);    //API 23 及以上支持该方法  


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

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <strong>  <!--在style文件中引用-->  
  2.     <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">  
  3.         <item name="colorPrimary">@color/red</item>  
  4.     </style></strong>  
[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <strong>  <!--在layout文件中的引用 -->  
  2.   android:background="@color/red"     //引用在/res/values/color.xml 中定义的颜色  
  3.     
  4.   android:background="#ff0000"        //创建并使用颜色</strong>  

四.颜色混合模式(Alpha通道相关)

我们前边的介绍中说明了颜色的透明度是根据Alpha通道的值来确定的,但是我们的手机屏幕并不是透明的,所以我们的界面颜色其实也可以看做不是透明的,那么我们的透明度效果是如何实现的呢,就是我们的颜色合成。

(RGB通道) 最终颜色 = 绘制的颜色 + (1 - 绘制颜色的透明度) × Canvas上的原有颜色。

Android为我们提供了用于合成的api

Paint.setXfermode(mXfermode);

下面贴出来一张官网的图,原理自己理解吧,不是很清楚。

五、我们每一种模式都测试一下。

图层和合成,到底合成的是什么?这个要理解清楚,其实合成的是两个界面交叉的部分。比如一个图片上覆盖了另外一层图。那么合成处理的就是这个交叉覆盖的部分。下面有两个概念:目标图是先绘制的图,源图就是后绘制的图。

首先看一段完整的代码:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. package net.fitrun.mysvg;  
  2.   
  3. import android.content.Context;  
  4. import android.graphics.Bitmap;  
  5. import android.graphics.BitmapFactory;  
  6. import android.graphics.Canvas;  
  7. import android.graphics.Color;  
  8. import android.graphics.Paint;  
  9. import android.graphics.PorterDuff;  
  10. import android.graphics.PorterDuffXfermode;  
  11. import android.graphics.RectF;  
  12. import android.graphics.Xfermode;  
  13. import android.view.View;  
  14.   
  15. /** 
  16.  * Created by 晁东洋 on 2017/3/23. 
  17.  */  
  18.   
  19. public class PorterDuffXfermodeView extends View{  
  20.     private Paint mPaint;  
  21.     private Bitmap dstBmp, srcBmp;  
  22.     private RectF dstRect, srcRect;  
  23.   
  24.     private Xfermode mXfermode;  
  25.     private PorterDuff.Mode mPorterDuffMode = PorterDuff.Mode.ADD;  
  26.   
  27.     public PorterDuffXfermodeView(Context context) {  
  28.         super(context);  
  29.         mPaint = new Paint(Paint.ANTI_ALIAS_FLAG|Paint.FILTER_BITMAP_FLAG);  
  30.         dstBmp = BitmapFactory.decodeResource(getResources(), R.mipmap.tu);  
  31.         srcBmp = BitmapFactory.decodeResource(getResources(), R.mipmap.yangying);  
  32.         mXfermode = new PorterDuffXfermode(mPorterDuffMode);  
  33.     }  
  34.   
  35.     @Override  
  36.     protected void onDraw(Canvas canvas) {  
  37.         super.onDraw(canvas);  
  38.         //背景色设为白色,方便比较效果  
  39.         canvas.drawColor(Color.WHITE);  
  40.         //将绘制操作保存到新的图层,因为图像合成是很昂贵的操作,将用到硬件加速,这里将图像合成的处理放到离屏缓存中进行  
  41.         RectF rectF = new RectF(0,0,1000,1000);  
  42.         int saveCount = canvas.saveLayer(rectF, mPaint, Canvas.ALL_SAVE_FLAG);  
  43.         //绘制目标图  
  44.         RectF DErectF = new RectF(0,0,500,500);  
  45.         canvas.drawBitmap(dstBmp, null, DErectF, mPaint);  
  46.         //设置混合模式  
  47.        // mPaint.setXfermode(mXfermode);  
  48.         //绘制源图  
  49.         RectF RSrectF = new RectF(250,250,800,800);  
  50.         canvas.drawBitmap(srcBmp, null, RSrectF, mPaint);  
  51.         //清除混合模式  
  52.         mPaint.setXfermode(null);  
  53.   
  54.         //还原画布  
  55.         canvas.restoreToCount(saveCount);  
  56.     }  
  57.   
  58. }  

此段代码是没有使用混合模式的代码,就是绘制两个图到屏幕上。其中有一些重要的地方需要提前说明一下,canVas.saveLayer(),此方法为设置一个新的图层,因为Android系统本身就会有背景图和背景颜色,所以我们设置一个新的透明图层来处理我们的图像合成,代码最后一段还原一下就OK了,如果不这样会遇到各种各样的问题,不能正确的显示我们合成的效果。下面看一下我们没有合成效果的界面效果:


ADD模式交叉的部分相互融合高亮。

CLEAR模式清除交叉部分的图像,以及上层的图片。很多博文片面的说是清除所有,是不客观的。

DARKEN模式没看到什么效果:

DST模式只显示目标图:

DST_ATOP模式:只显示交叉部分以外的目标图

DST_IN显示目标图交叉的部分以及没有被覆盖部分的图

篇幅有限,各种模式大家可以一个一个的去实验。最后提醒一点,由于摆放的位置不同同样会产生不同的效果。网上流传的很广的一张ApiDemos/Graphics/XferModes的图,其实很好理解其中的一些模式,但是不要只看图,一定要亲自测试,否则你会理解错了它所表示的意思。


转载自:http://blog.csdn.net/hnzcdy/article/details/65449453;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值