渲染模式:
tileX tileY:The tiling mode for x/y to draw the bitmap in. 在位圖上 X/Y 方向 瓦工/花磚/瓷磚 模式
CLAMP :如果渲染器超出原始邊界范圍,會復制范圍內【邊緣】染色
REPEA :橫向和縱向的【重復】渲染器圖片,平鋪
MIRROR:橫向和縱向的重復渲染器圖片,這個和REPEAT 重復方式不一樣,他是以【鏡像】方式平鋪
渲染模式示例代碼
public class LinearGradientView extends View {
private Paint mPaint = null;private Shader mLinearGradient11 = null;private Shader mLinearGradient12 = null;private Shader mLinearGradient13 = null;private Shader mLinearGradient21 = null;private Shader mLinearGradient22 = null;private Shader mLinearGradient23 = null;private Shader mLinearGradient31 = null;private Shader mLinearGradient32 = null;private Shader mLinearGradient33 = null;public LinearGradientView(Context context) {super(context);// 第一第二個參數表示漸變起點,可以設置在對角等任意位置;第三第四個參數表示漸變終點;第五個參數表示漸變顏色;// 第六個參數可以為空,表示坐標值為0-1 new float[] {0.25f, 0.5f, 0.75f, 1 } 如果為空,顏色均勻分布,沿梯度線。mLinearGradient11 = new LinearGradient(0, 0, 0, 200, new int[] { Color.RED, Color.GREEN, Color.BLUE, Color.BLACK }, null, TileMode.CLAMP);mLinearGradient12 = new LinearGradient(0, 0, 0, 300, new int[] { Color.RED, Color.GREEN, Color.BLUE, Color.BLACK }, new float[] { 0, 0.1f, 0.5f, 0.5f }, TileMode.CLAMP);mLinearGradient13 = new LinearGradient(0, 0, 0, 400, new int[] { Color.RED, Color.GREEN, Color.BLUE }, null, TileMode.CLAMP);mLinearGradient21 = new LinearGradient(0, 320, 0, 320 + 200, new int[] { Color.RED, Color.GREEN, Color.BLUE, Color.BLACK }, null, TileMode.MIRROR);mLinearGradient22 = new LinearGradient(0, 320, 0, 320 + 100, new int[] { Color.RED, Color.GREEN, Color.BLUE }, null, TileMode.MIRROR);mLinearGradient23 = new LinearGradient(0, 320, 0, 320 + 100, new int[] { Color.RED, Color.GREEN, Color.BLUE }, new float[] { 0, 0.1f, 0.5f }, TileMode.MIRROR);mLinearGradient31 = new LinearGradient(0, 640, 0, 640 + 200, new int[] { Color.RED, Color.GREEN, Color.BLUE, Color.BLACK }, null, TileMode.REPEAT);mLinearGradient32 = new LinearGradient(0, 640, 0, 640 + 100, new int[] { Color.RED, Color.GREEN, Color.BLUE }, null, TileMode.REPEAT);mLinearGradient33 = new LinearGradient(0, 640, 0, 640 + 100, new int[] { Color.RED, Color.GREEN, Color.BLUE }, new float[] { 0, 0.1f, 0.5f }, TileMode.REPEAT);mPaint = new Paint();}
@Overrideprotected void onDraw(Canvas canvas) {//重復最后一個像素mPaint.setStrokeWidth(2);mPaint.setShader(mLinearGradient11);canvas.drawRect(0, 0, 200, 300, mPaint);//200-300之間全部是最后的黑色mPaint.setShader(mLinearGradient12);canvas.drawRect(210, 0, 410, 300, mPaint);//0.5之后全部是黑色了mPaint.setShader(mLinearGradient13);canvas.drawRect(420, 0, 620, 300, mPaint); // LinearGradient的高度小於要繪制的矩形的高度時才會有重復、鏡像等效果canvas.drawLine(0, 310, 720, 310, mPaint);//鏡像效果mPaint.setShader(mLinearGradient21);canvas.drawRect(0, 320, 200, 620, mPaint);mPaint.setShader(mLinearGradient22);canvas.drawRect(210, 320, 410, 620, mPaint);mPaint.setShader(mLinearGradient23);canvas.drawRect(420, 320, 620, 620, mPaint);canvas.drawLine(0, 630, 720, 630, mPaint);![]()
//重復效果mPaint.setShader(mLinearGradient31);canvas.drawRect(0, 640, 200, 940, mPaint);mPaint.setShader(mLinearGradient32);canvas.drawRect(210, 640, 410, 940, mPaint);mPaint.setShader(mLinearGradient33);canvas.drawRect(420, 640, 620, 940, mPaint);}}
渲染器示例代碼
public class MyShaderView extends View {
// Shader渲染器,專門用來渲染圖像以及一些幾何圖形private BitmapShader bitmapShader; //bitmap渲染器,主要用來渲染圖像private LinearGradient linearGradient; //線性渲染private RadialGradient radialGradient; //環形渲染private SweepGradient sweepGradient; //掃描漸變,圍繞一個中心點掃描漸變就像電影里那種雷達掃描,用來梯度渲染private ComposeShader composeShader; //混合渲染器,可以和其他幾個子類組合起來使用private Bitmap bitmap;/**Bitmap的寬高*/private int width, height;private Paint paint;/**漸變顏色數組*/private final int[] colors = { Color.RED, Color.GREEN, Color.BLUE, Color.YELLOW };/**用來指定顏色數組的相對位置,若為null則均勻分布*/private final float[] positions = null;public MyShaderView(Context context) {super(context);bitmap = ((BitmapDrawable) getResources().getDrawable(R.drawable.icon)).getBitmap();width = bitmap.getWidth();height = bitmap.getHeight();paint = new Paint();}@SuppressLint("DrawAllocation")@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);canvas.drawColor(Color.WHITE); //背景色//將Bitmap截取為圓形、圓角矩形canvas.drawBitmap(bitmap, 0, 0, paint);//原圖bitmapShader = new BitmapShader(bitmap, TileMode.MIRROR, TileMode.MIRROR);paint.setShader(bitmapShader);canvas.drawOval(new RectF(width, 0, width * 2, height), paint);//圓形渲染圖canvas.drawRoundRect(width * 2, 0, width * 3, height, 30, 30, paint);//矩形渲染圖//繪制線性漸變的矩形linearGradient = new LinearGradient(0, 200, 400, 400, colors, positions, TileMode.REPEAT);// 漸變起 初點/終點坐標 x/y 位置;paint.setShader(linearGradient);canvas.drawRect(0, 200, 400, 400, paint);//渲染范圍最好和圖形大小一致![]()
//繪制環形漸變的圓和矩形radialGradient = new RadialGradient(100, 500, 100, colors, positions, TileMode.REPEAT);// 中心坐標、半徑paint.setShader(radialGradient);canvas.drawCircle(100, 500, 100, paint);canvas.drawRect(200, 400, 300, 600, paint);radialGradient = new RadialGradient(300, 500, 100, colors, positions, TileMode.MIRROR);paint.setShader(radialGradient);canvas.drawCircle(400, 500, 100, paint);canvas.drawRect(500, 400, 600, 600, paint);//繪制梯形漸變的矩形sweepGradient = new SweepGradient(300, 710, colors, positions);//中心坐標paint.setShader(sweepGradient);canvas.drawRect(0, 610, 600, 810, paint);//繪制混合漸變(線性與環形混合)的矩形linearGradient = new LinearGradient(0, 820, 300, 1120, colors, positions, TileMode.REPEAT);composeShader = new ComposeShader(linearGradient, bitmapShader, PorterDuff.Mode.SRC_OVER);paint.setShader(composeShader);canvas.drawRect(0, 820, 600, 1120, paint);}}