简单说下用bitmapshader来实现切圆的效果

1.首先创建一个bitmapshader对象,当然它的重载分别有三个,不清楚的童鞋可以简单的看下此文章
简单介绍bitmapShader

Bitmap mBitmap = BitmapFactory.decodeResource(getResources(),R.drawable.xxx);
mBitmapShader = new BitmapShader(mBitmap, Shader.TileMode.MIRROR, Shader.TileMode.MIRROR);
mPaint.setShader(mBitmapShader);

当知道了bitmapShader后,我们新建一个mBitmapShader,然后从裁剪圆角起

简单来说就是在ondraw方法新建一个圆角的rect然后用着色器也就是bitmapshader把具体的图片着色上去,就完成了切圆角的工作

 canvas.drawRoundRect(mRoundRect, mBorderRadius, mBorderRadius,mBitmapPaint);

此时的mBitmapPaint肯定是蘸有这个着色器的画笔,然后关键的mRoundRect具体参数是多少呢?

众所周知,imageview的大小和下载的图片的大小是不一样的,想象一下,比如绘制到屏幕上的view的大小是300 * 400 px,然而图片的大小是100*200 px ,那我要完整的让这个图片显示是否要把原图放大呢,方法成300 * 600px的大小才能把这个view完全显示,当然图片可能显示不全

 scale = Math.max(getWidth() * 1.0f / bitmap.getWidth(), getHeight() * 1.0f / bitmap.getHeight());

当算出具体的缩放比例时我们需要做的就是利用Matrix进行缩放了

mMatrix.setScale(scale, scale);
mBitmapShader.setLocalMatrix(mMatrix);
mBitmapPaint.setShader(mBitmapShader);

简单来说就是把着色器的图片放大了三倍,然后蘸到了画笔上由此大公搞成了,大家可以去试下。

那如何让图片居中显示呢,就像imageview里的centercrop效果呢
比如图片的大小是200 * 200 px ,view的大小是100 *200 px
那如何让 view居中显示呢

if (dwidth * vheight > vwidth * dheight)
{
          scale = (float) vheight / (float) dheight;
          dx = (vwidth - dwidth * scale) * 0.5f;
}
else 
{
          scale = (float) vwidth / (float) dwidth;
          dy = (vheight - dheight * scale) * 0.5f;
}

很明显就是让你的着色器的图片去平移50px这里的话,rect的位置是不动的,改变的只是着色器里填充的位置。所以应该是像左平移50px

多余的代码就不贴了,可以去github上去查看

你可能感兴趣的:(简单说下用bitmapshader来实现切圆的效果)