上一篇講解了Paint的基本使用废登,從初始化到繪制融击,學好了基本功接下來要開始Paint的高級渲染的部分在開始之前還是要留一下Paint的基本使用的地址
Paint的基本使用 http://www.reibang.com/p/88d718d1945e
開始擼碼~
正文
先來看一下要搞的效果圖
原圖.jpg
compose_shader.png
zoomImageView.gif.gif
ok,在Android中提供了如下的渲染類
-
BitmapShader 位圖圖像渲染篮灼,可以使用它來做圓形頭像 放大鏡的效果
/** * TileMode.CLAMP 拉伸最后一個像素去鋪滿剩下的地方 * TileMode.MIRROR 通過鏡像翻轉(zhuǎn)鋪滿剩下的地方缔刹。 * TileMode.REPEAT 重復圖片平鋪整個畫面(電腦設(shè)置壁紙) */ BitmapShader bitMapShader = new BitmapShader(mBitMap,Shader.TileMode.MIRROR,Shader.TileMode.MIRROR);
-
LinearGradient 線性渲染
/**線性漸變 * x0, y0, 起始點 * x1, y1, 結(jié)束點 * int[] mColors, 中間依次要出現(xiàn)的幾個顏色 * float[] positions,數(shù)組大小跟colors數(shù)組一樣大搂根,中間依次擺放的幾個顏色分別放置在那個位置上(參考比例從左往右) * tile */ LinearGradient linearGradient = new LinearGradient( 0, 0,800, 800, mColors, null, Shader.TileMode.CLAMP);
-
RadialGradient 環(huán)形渲染
RadialGradient mRadialGradient = new RadialGradient(300, 300, 100, mColors, null, Shader.TileMode.REPEAT);
-
SweepGradient 漸變渲染
SweepGradient mSweepGradient = new SweepGradient(300, 300, mColors, null);
-
ComposeShader 組合渲染
ComposeShader mComposeShader = new ComposeShader(linearGradient, bitMapShader, PorterDuff.Mode.DST_IN);
使用起來非常的簡單断楷,首先我們就使用composeShader來實現(xiàn)第二張圖的效果
//圖像渲染
BitmapShader bitmapShader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
LinearGradient linearGradient = new LinearGradient(0, 0, width, height, Color.GREEN, Color.BLUE, Shader.TileMode.REPEAT);
RadialGradient radialGradient = new RadialGradient(width / 2, height / 2, width / 2, new int[]{0xffff0000, 0xff00ff00, 0xff0000ff}, null, Shader.TileMode.CLAMP);
SweepGradient sweepGradient = new SweepGradient(width / 2, height / 2, new int[]{0xffff0000, 0xff00ff00, 0xff0000ff}, null);
//將圖像渲染和環(huán)形漸變進行組合科平,組合的形式是增強
ComposeShader composeShader = new ComposeShader(bitmapShader, radialGradient, PorterDuff.Mode.MULTIPLY);
mPaint.setShader(composeShader);
//繪制矩形區(qū)域用于顯示組合之后的效果
canvas.drawRect(0, 0, width, height, mPaint);
然后我們使用BitmapShader來實現(xiàn)放大鏡的效果
-
得到放大后圖片
//放大后的整個圖片 Bitmap scaleBitmap = Bitmap.createScaledBitmap(mBitmap, mBitmap.getWidth() * factor, mBitmap.getHeight() * factor, true); bitmapShader = new BitmapShader(scaleBitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
-
設(shè)置圓形的放大鏡并將BitmapShader設(shè)置給放大鏡Drawable
mShapeDrawable = new ShapeDrawable(new OvalShape()); mShapeDrawable.getPaint().setShader(bitmapShader); mShapeDrawable.setBounds(0, 0, RADIUS * 2, RADIUS * 2); matrix = new Matrix();
-
隨著手指滑動褥紫,放大鏡不斷移動位置
//將放大鏡的圖片往相反的方向挪動 matrix.setTranslate(-x * factor + RADIUS, -y * factor + RADIUS); mShapeDrawable.getPaint().getShader().setLocalMatrix(matrix); //切出手勢區(qū)域的位置的圓 mShapeDrawable.setBounds(x - RADIUS, y - RADIUS, x + RADIUS, y + RADIUS); invalidate();
使用Android的渲染還能做好多的炫酷的效果,這里就不一一進行說明瞪慧。