渲染器 Shader BitmapShader


渲染模式:
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();
    }

    @Override
    protected 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 widthheight;
    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")
    @Override
    protected 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, colorspositions, TileMode.REPEAT);// 漸變起 初點/終點坐標 x/y 位置;
        paint.setShader(linearGradient);
        canvas.drawRect(0, 200, 400, 400, paint);//渲染范圍最好和圖形大小一致

        //繪制環形漸變的圓和矩形
        radialGradient = new RadialGradient(100, 500, 100, colorspositions, TileMode.REPEAT);// 中心坐標、半徑
        paint.setShader(radialGradient);
        canvas.drawCircle(100, 500, 100, paint);
        canvas.drawRect(200, 400, 300, 600, paint);
        radialGradient = new RadialGradient(300, 500, 100, colorspositions, TileMode.MIRROR);
        paint.setShader(radialGradient);
        canvas.drawCircle(400, 500, 100, paint);
        canvas.drawRect(500, 400, 600, 600, paint);
        //繪制梯形漸變的矩形  
        sweepGradient = new SweepGradient(300, 710, colorspositions);//中心坐標
        paint.setShader(sweepGradient);
        canvas.drawRect(0, 610, 600, 810, paint);
        //繪制混合漸變(線性與環形混合)的矩形
        linearGradient = new LinearGradient(0, 820, 300, 1120, colorspositions, TileMode.REPEAT);
        composeShader = new ComposeShader(linearGradientbitmapShader, PorterDuff.Mode.SRC_OVER);
        paint.setShader(composeShader);
        canvas.drawRect(0, 820, 600, 1120, paint);
    }
}






免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM