写在前面
新开个topic~
日常开发中解决的比较有趣的问题,分享一下~
需求
ImageView实现圆角,单侧圆角
实现
分析
首先最好能用最小的改动去实现ImageView加圆角,不对bitmap或drawable做处理,而是在绘制时进行修改,于是在onDraw时通过clipPath扣出一个圆角;
其次是单侧圆角需要考虑LTR和RTL切换的问题。
代码
package com.example.myapplication.ui;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Path;
import android.util.AttributeSet;
import android.util.LayoutDirection;
import androidx.annotation.Nullable;
/**
* 自定义ImageView
* 效果:LTR->右侧上下角 为圆角 ; RTL相反
* 实现:多边形和圆角矩形叠加path
*/
public class RoundedSideImageView extends androidx.appcompat.widget.AppCompatImageView {
private float radius;
private Path path;
private Paint paint;
boolean isLTR;
public RoundedSideImageView(Context context) {
super(context);
init(context);
}
public RoundedSideImageView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
init(context);
}
public RoundedSideImageView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context);
}
private void init(Context context) {
radius = context.getResources().getDimension(R.dimen.bg_radius);
path = new Path();
paint = new Paint(Paint.ANTI_ALIAS_FLAG);
int direction = context.getResources().getConfiguration().getLayoutDirection();
isLTR = direction == LayoutDirection.LTR;
}
@Override
protected void onDraw(Canvas canvas) {
int width = getWidth();
int height = getHeight();
// in case view is too small
if (width > radius && height > radius) {
path.reset();
if (isLTR) {
path.moveTo(0, 0);
path.lineTo(width * 3 / 4, 0);
path.lineTo(width, height / 4);
path.lineTo(width, height * 3 / 4);
path.lineTo(width * 3 / 4, height);
path.lineTo(0, height);
path.lineTo(0, 0);
path.addRoundRect(width / 2, 0, width, height, radius, radius, Path.Direction.CW);
} else {
path.moveTo(width, 0);
path.lineTo(width / 4, 0);
path.lineTo(0, height / 4);
path.lineTo(0, height * 3 / 4);
path.lineTo(width / 4, height);
path.lineTo(width, height);
path.lineTo(width, 0);
path.addRoundRect(0, 0, width / 2, height, radius, radius, Path.Direction.CCW);
}
canvas.clipPath(path);
}
super.onDraw(canvas);
}
}
写在后面
If you like this article, it is written by Johnny Deng.
If not, I don’t know who wrote it.