Android 颜色渲染(十) ComposeShader组合渲染

目录(?)[+]

Android 颜色处理(十) ComposeShader组合渲染

 

public ComposeShader(Shader shaderA,Shader shaderB, Xfermode mode)

Parameters
shaderA 渲染器A,Shader及其子类对象
shaderB 渲染器B,Shader及其子类对象
mode  两种渲染器组合的模式,Xfermode对象

public ComposeShader(Shader shaderA,Shader shaderB, PorterDuff.Mode mode)

Parameters
shaderA 渲染器A,Shader及其子类对象
shaderB 渲染器B,Shader及其子类对象
mode .两种渲染器组合的模式,ProterDuff.Mode对象

Xfermode及ProterBuff.Mode具体含义见上一篇:

Android 颜色渲染(八) PorterDuff及Xfermode详解

  ComposeShader,和AnimationSet的用法相似.是可以将两种颜色渲染器的效果进行组合:

                                            

以上图像由BimtmapShader和LinearGradient两种效果组合绘制,其中位图渲染 平铺模式使用的为镜像模式,  组合渲染使用了ProterDuff叠加模式,具体见如下代码:

MainActivity:

  1. package com.tony.testshader;  
  2.   
  3. import android.os.Bundle;  
  4. import android.app.Activity;  
  5. import android.graphics.Bitmap;  
  6. import android.graphics.BitmapFactory;  
  7. import android.view.Menu;  
  8. import android.widget.SeekBar;  
  9. import android.widget.SeekBar.OnSeekBarChangeListener;  
  10.   
  11. public class MainActivity extends Activity  implements OnSeekBarChangeListener{  
  12.   
  13.     private SweepGradientView sweepGradientView;  
  14.     private ComposeShaderView composeShaderView;  
  15.       
  16.      private SeekBar seekbar;  
  17.      private PorterDuffView porterDuffView;  
  18.      private int currentId;  
  19.      private WaterRipplesView waterRipplesView;  
  20.        
  21.        
  22.       
  23.     @Override  
  24.     protected void onCreate(Bundle savedInstanceState) {  
  25.         super.onCreate(savedInstanceState);  
  26.           
  27.         composeShaderView = new ComposeShaderView(this);  
  28.         setContentView(composeShaderView);  
  29.   
  30.     }  
  31.   
  32.     @Override  
  33.     public boolean onCreateOptionsMenu(Menu menu) {  
  34.         getMenuInflater().inflate(R.menu.main, menu);  
  35.         return true;  
  36.     }  
  37.   
  38.   
  39. }  



ComposeShaderView:

    1. package com.tony.testshader;  
    2.   
    3. import android.content.Context;  
    4. import android.graphics.Bitmap;  
    5. import android.graphics.BitmapShader;  
    6. import android.graphics.Canvas;  
    7. import android.graphics.Color;  
    8. import android.graphics.ComposeShader;  
    9. import android.graphics.LinearGradient;  
    10. import android.graphics.Paint;  
    11. import android.graphics.PorterDuff;  
    12. import android.graphics.Shader;  
    13. import android.graphics.drawable.BitmapDrawable;  
    14. import android.graphics.drawable.ShapeDrawable;  
    15. import android.util.AttributeSet;  
    16. import android.view.View;  
    17.   
    18. public class ComposeShaderView extends View {  
    19.   
    20.     Bitmap mBitmap = null;  
    21.     int bitwidth = 0;  
    22.     int bitheight = 0;  
    23.     Paint mPaint = null;  
    24.     // bitmap渲染  
    25.     Shader mBitmapShader = null;  
    26.     // 线性渐变渲染  
    27.     Shader mLinearGradient = null;  
    28.     // 混合渲染  
    29.     Shader mComposeShader = null;  
    30.   
    31.     ShapeDrawable mShapeDrawable = null;  
    32.   
    33.     public ComposeShaderView(Context context) {  
    34.         super(context);  
    35.         // 装载资源    
    36.         mBitmap = ((BitmapDrawable) getResources().getDrawable(R.drawable.list_top))    
    37.                 .getBitmap();    
    38.         // 得到宽高    
    39.         bitwidth = mBitmap.getWidth();    
    40.         bitheight = mBitmap.getHeight();    
    41.         // 创建BitmapShader对象    
    42.         mBitmapShader = new BitmapShader(mBitmap, Shader.TileMode.MIRROR,    
    43.                 Shader.TileMode.MIRROR);    
    44.         // 创建LinearGradient并设置渐变颜色数组,平铺效果为镜像    
    45.         mLinearGradient = new LinearGradient(0, 0, 0, 100, new int[] {    
    46.                 Color.WHITE, Color.LTGRAY, Color.TRANSPARENT, Color.GREEN }, null,    
    47.                 Shader.TileMode.MIRROR);    
    48.           
    49.         // 混合渲染 将两个效果叠加,使用PorterDuff叠加模式   
    50.         mComposeShader = new ComposeShader(mBitmapShader, mLinearGradient,  PorterDuff.Mode.MULTIPLY);    
    51.         mPaint = new Paint();    
    52.     }  
    53.   
    54.     public ComposeShaderView(Context context, AttributeSet attrs) {  
    55.         super(context, attrs);  
    56.     }  
    57.   
    58.     @Override  
    59.     protected void onDraw(Canvas canvas) {  
    60.         super.onDraw(canvas);  
    61.           
    62.            // 绘制混合渲染效果    
    63.         mPaint.setShader(mComposeShader);    
    64.         canvas.drawCircle(240, 360, 200, mPaint);  
    65.           
    66.     }  
    67.   
原文地址:https://www.cnblogs.com/Free-Thinker/p/5571864.html