重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
你可以使用shape定义一个圆角矩形,并将其作为布局的背景即可。
网站建设哪家好,找创新互联!专注于网页设计、网站建设、微信开发、微信平台小程序开发、集团企业网站建设等服务项目。为回馈新老客户创新互联还提供了子长免费建站欢迎大家使用!
圆角矩形的shape代码如下:
//定义四个圆角 文件名shape_round_corner
shape xmlns:android=""
solid android:color="#ff00" /
corners android:topLeftRadius="12dp"
android:topRightRadius="12dp"
android:bottomRightRadius="12dp"
android:bottomLeftRadius="12dp"/
stroke android:width="1dp" android:color="#ff0" /
/shape
设置背景代码如下:
LinearLayout
android:layout_width="300dp"
android:layout_height="300dp"
android:layout_marginBottom="10dp"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:layout_marginTop="10dp"
android:alpha="0.8"
android:background="@drawable/shape_round_corner"
/LinearLayout
我们要实现的图片控件继承自 AppCompatImageView ,它是 ImageView 的子类,但提供了更好的兼容性,我们在此基础上添加了若干自定义的属性和方法以实现最终的 NiceImageView :
要实圆角或者圆形的显示效果,就是对图片显示的内容区域进行“裁剪”,只显示指定的区域即可。如何做呢?
一种比较直接的办法是这样的,由于图片是被绘制在画布上的,所以用 canvas 的 clipPath() 方法先将画布裁剪成指定形状,这样就能让图片按指定形状显示了,重新 draw() 方法即可:
这样使用 src 、 background 属性给ImageView设置显示的图片都能达到预期的显示效果。但是由于 clipPath() 方法不支持抗锯齿,图片边缘会有明显的毛糙感,体验并不理想,所以需要寻找其它方法。
另一种方法是使用图像的 Alpha 合成模式 ,即
PorterDuff 来实现, 官方文档 。这里我们使用其中的 DST_IN 模式。整个过程就是先绘制目标图像,也就是图片;再绘制原图像,即一个圆角矩形或者圆形,这样最终目标图像只显示和原图像重合的区域。
到这里就实现了显示为圆角或者圆形了。但是需要通过 src 属性或者对应的方法来设置图片,否则不能达到预期效果。
绘制边框就相对容易理解了,只需要绘制一个指定样式的圆角矩形或者圆形即可:
当图片显示为圆形时,还可以绘制一个内边框,但圆角矩形的话由于圆角大小的问题,目前只能设置一个边框咯。
但是有个问题,绘制的边框会覆盖在图片上,如果边框太宽会导致图片的可见区域变小了,影像显示效果,像这样,左下角的花盆不见了:
那么如何让边框不覆盖在图片上呢?可以在 Alpha 合成绘制前先将画布缩小一定比例,最后再绘制边框,这样问题就解决了。
缩放后的ImageView显示区域的宽高就是原宽、高分别减去2倍的边框宽度,这样缩小的比例也就显而易见了。效果如下,左下角的花盆出来了:
遮罩可以理解为一层带透明度的颜色,遮罩默认不绘制,当制定了遮罩颜色时才会绘制,实现很简单:
例如加一个透明度30%的红色遮罩后的效果:
核心的实现逻辑就这些了,剩下的就是自定义属性和方法了,有兴趣的可以看源码,都很简单,希望对你有所帮助吧!
更多细节及用法见GitHub:
如果你需要实现类似钉钉的圆形组合头像,例如:
你说的大部分都是国产app吧,例如哔哩哔哩动画,虽然界面是符合Android Design 的,但是icon依然是iOS风、不符合Android Design 的圆角矩形,不过他们大部分也都是被MIUI带坏的=.=
关于icon的样式,Android Design 的官方文档有详细的介绍,先上原文链接(Iconography | Android Developers)
Use a distinct silhouette. Three-dimensional, front view, with a slight perspective as if viewed from above, so that users perceive some depth.可以看出来,Google 对icon 有以下几个要求:
轮廓鲜明(iOS app 的icon 就是一个反例)
要有立体感 (iOS 再次中枪)
像是从正面斜上一定角度看到的一样,使之看上去有深度(iOS 已经身亡)
综上所述,一切使用圆角矩形图标的Android 应用都是在耍流氓。
============================第二次打分割线=============================
关于Android 应用图标的更多标准,可以参照NovaDNG发表在锋客网上的两篇文章
» 如何设计符合 Android Design 的应用图标 锋客网
» 如何制作一个漂亮的 Android 应用图标 锋客网
如果你是在自定义view的onDraw方法中:
RectF rectF = new RectF(100 ,100 ,500 ,500);//先画一个矩形
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);//创建画笔
paint.setColor(R.color.colorAccent);//添加画笔颜色
canvas.drawRoundRect(rectF , 30 ,30 , paint);//根据提供的矩形为四个角画弧线,(其中的数字:第一个表示X轴方向大小,第二个Y轴方向大小。可以改成其他的,你可以自己体验),最后添加画笔。
如果你是在布局中直接添加,楼上已经做出方法,我就不举例了。
用shapedrawable画一个圆角矩形作为按钮的background,但是圆角的地方总是有点粗,和直接用xml做出来的背景不一样
float[]
outerR = new float[] { 20f, 20f, 20f, 20f, 0, 0, 0, 0 };
Shape shape = new
RoundRectShape(outerR, null, null);
image.setBackgroundDrawable(new
CustomShapeDrawable(shape,0xffea0000));
class CustomShapeDrawable extends
ShapeDrawable {
int color ;
public CustomShapeDrawable(Shape s,int
color) {
super(s);
this.color =
color;
}
@Override
protected void onDraw(Shape shape, Canvas
canvas, Paint paint) {
paint.setStrokeJoin(Join.ROUND);
paint.setDither(true);
paint.setAntiAlias(true);
paint.setStyle(Style.STROKE);
paint.setColor(0xffea0000);
paint.setStrokeWidth(4f);
shape.draw(canvas, paint);
}
}
把paint.setStrokeJoin这行去掉再试试