① android imagecropper怎么裁圆图
支持圆形裁剪框,裁剪后生成圆形图案。
代码基于开源项目修改,github上项目链接:https://github.com/shengge/Android-crop
还是贴下效果图:
说一下圆形裁剪实现部分:
1.UI方面,自定义CircleHighlightView继承至HighlightView(原有的矩形裁剪框实现),直接看draw方法实现
[java] view plain
@Override
protected void draw(Canvas canvas) {
canvas.save();
Path path = new Path();
outlinePaint.setStrokeWidth( outlineWidth);
if(!hasFocus()) {//没焦点是,直接画一个黑色的矩形框
outlinePaint.setColor( Color.BLACK);
canvas.drawRect( drawRect, outlinePaint);
② Android调用系统的图片剪裁,剪裁框大小能设置吗outputX和outputY不是
你的问题我理解的是从一张图片上。挖取指定坐标的一块图片是吧。
看代码的意思是。你想用参数的方法直接从camera取得。这种方法没有尝试过。
这一定得需要camera支持。识别extra里的参数。这样实际是调用系统的api处理
倒不如你换个方法。把这些图品剪切的动作放到本地里做。只从照片中取得整张图片。避免API不支持或版本不支持
③ android 如何把正方形图片显示圆形
Android应用开发中,很多头像都要求显示成圆形的,这就可以使用android的canvas、paint这些类来进行设置圆形,先设置paint的样式为圆形,然后把你要设置成圆形的图片重新赋值给paint这个类:canvas.drawBitmap(tempBmp, rect, rect, paint);
核心代码如下(引用这位前辈:http://blog.sina.com.cn/s/blog_7607703f0101dhlj.html,我增加一些注释,原来是没有注释):
packagecom.liang.round;
importandroid.annotation.SuppressLint;
importandroid.content.Context;
importandroid.graphics.Bitmap;
importandroid.graphics.Bitmap.Config;
importandroid.graphics.BitmapFactory;
importandroid.graphics.Canvas;
importandroid.graphics.Paint;
importandroid.graphics.PorterDuff;
importandroid.graphics.PorterDuffXfermode;
importandroid.graphics.Rect;
importandroid.view.View;
publicclassMyViewextendsView{
privateBitmapbmp=null;
privatePaintpaint=null;
publicMyView(Contextcontext){
super(context);
//TODOAuto-generatedconstructorstub
paint=newPaint();//实例化画笔类
BitmapFactory.Optionsoptions=newBitmapFactory.Options();
options.inJustDecodeBounds=true;
BitmapFactory.decodeResource(context.getResources(),R.drawable.test,options);//获得你存放在drawable下的正方形图片
options.inJustDecodeBounds=false;
BitmaptempBmp=BitmapFactory.decodeResource(context.getResources(),R.drawable.test,options);//实例化一个bitmap图片类
intwidth=options.outWidth;
intheight=options.outHeight;
intsize=width>height?height:width;//边框
intpos=(int)(size/2);
doubleradius=pos*Math.sin(45*180/Math.PI);//半径
size=(int)(radius*2);
pos=(int)(size/2);
bmp=Bitmap.createBitmap(size,size,Config.ARGB_8888);
Canvascanvas=newCanvas(bmp);
Rectrect=newRect(0,0,size,size);
paint.setAntiAlias(true);
canvas.drawCircle(pos,pos,(float)radius,paint);
paint.setXfermode(newPorterDuffXfermode(PorterDuff.Mode.SRC_ATOP));
canvas.drawBitmap(tempBmp,rect,rect,paint);
tempBmp.recycle();
}
@SuppressLint("DrawAllocation")
@Override
protectedvoidonDraw(Canvascanvas){
//TODOAuto-generatedmethodstub
super.onDraw(canvas);
if(bmp!=null){
if(!bmp.isRecycled()){
canvas.drawBitmap(bmp,100,100,paint);
}
}
}
}
④ Android 圆角、圆形 ImageView 实现
我们要实现的图片控件继承自 AppCompatImageView ,它是 ImageView 的子类,但提供了更好的兼容性,我们在此基础上添加了若干自定义的属性和方法以实现最终的 NiceImageView :
要实圆角或者圆形的显示效果,就是对图片显示的内容区域进行“裁剪”,只显示指定的区域即可。如何做呢?
一种比较直接的办法是这样的,由于图片是被绘制在画布上的,所以用 canvas 的 clipPath() 方法先将画布裁剪成指定形状,这样就能让图片按指定形状显示了,重新 draw() 方法即可:
这样使用 src 、 background 属性给ImageView设置显示的图片都能达到预期的显示效果。但是由于 clipPath() 方法不支持抗锯齿,图片边缘会有明显的毛糙感,体验并不理想,所以需要寻找其它方法。
另一种方法是使用图像的 Alpha 合成模式 ,即
PorterDuff 来实现, 官方文档 。这里我们使用其中的 DST_IN 模式。整个过程就是先绘制目标图像,也就是图片;再绘制原图像,即一个圆角矩形或者圆形,这样最终目标图像只显示和原图像重合的区域。
到这里就实现了显示为圆角或者圆形了。但是需要通过 src 属性或者对应的方法来设置图片,否则不能达到预期效果。
绘制边框就相对容易理解了,只需要绘制一个指定样式的圆角矩形或者圆形即可:
当图片显示为圆形时,还可以绘制一个内边框,但圆角矩形的话由于圆角大小的问题,目前只能设置一个边框咯。
但是有个问题,绘制的边框会覆盖在图片上,如果边框太宽会导致图片的可见区域变小了,影像显示效果,像这样,左下角的花盆不见了:
那么如何让边框不覆盖在图片上呢?可以在 Alpha 合成绘制前先将画布缩小一定比例,最后再绘制边框,这样问题就解决了。
缩放后的ImageView显示区域的宽高就是原宽、高分别减去2倍的边框宽度,这样缩小的比例也就显而易见了。效果如下,左下角的花盆出来了:
遮罩可以理解为一层带透明度的颜色,遮罩默认不绘制,当制定了遮罩颜色时才会绘制,实现很简单:
例如加一个透明度30%的红色遮罩后的效果:
核心的实现逻辑就这些了,剩下的就是自定义属性和方法了,有兴趣的可以看源码,都很简单,希望对你有所帮助吧!
更多细节及用法见GitHub: https://github.com/SheHuan/NiceImageView
如果你需要实现类似钉钉的圆形组合头像,例如: