圆角Webview的处理,继承 WebView然后重写draw方法,画出指定想要定制的WebView的圆角。
要注意的是,在Android9.0之前,可以用setXfermode的方式去做,但是由于Android在9.0 改变了绘制透明像素的方式,所以导致Xformode无法通过透明像素裁剪或者拼接边界,所以用Xformode的方式去绘制圆角Webview在9.0以后的系统就会出现bug情况。
下面贴出一个好用的,不用Xfermode设置值的圆角WebView,根据需求需要滚动部分的处理可删除:
public class CircleWebView extends WebView {
private float vRadius = getResources().getDimensionPixelSize(R.dimen.home_mystation_card_wall_paper_corner_radius);
private int vWidth;
private int vHeight;
private int x;
private int y;
private Paint paint1;
private Paint paint2;
public RoundedWebView(Context context) {
this(context, null);
}
public RoundedWebView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public RoundedWebView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context);
}
private void init(Context context) {
paint1 = new Paint();
paint1.setColor(Color.WHITE);
paint1.setAntiAlias(true);
paint1.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT));
paint2 = new Paint();
paint2.setXfermode(null);
}
public void setRadius(float radius) {
vRadius = radius;
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
vWidth = getMeasuredWidth();
vHeight = getMeasuredHeight();
}
@Override
public void draw(Canvas canvas) {
x = this.getScrollX();
y = this.getScrollY();
Bitmap bitmap = Bitmap.createBitmap(x + vWidth, y + vHeight,
Bitmap.Config.ARGB_8888);
Canvas canvas2 = new Canvas(bitmap);
super.draw(canvas2);
drawLeftUp(canvas2);
drawRightUp(canvas2);
drawLeftDown(canvas2);
drawRightDown(canvas2);
canvas.drawBitmap(bitmap, 0, 0, paint2);
bitmap.recycle();
}
private void drawLeftUp(Canvas canvas) {
Path path = new Path();
path.moveTo(x, vRadius);
path.lineTo(x, y);
path.lineTo(vRadius, y);
path.arcTo(new RectF(x, y, x + vRadius * 2, y + vRadius * 2), -90, -90);
path.close();
canvas.drawPath(path, paint1);
}
private void drawLeftDown(Canvas canvas) {
Path path = new Path();
path.moveTo(x, y + vHeight - vRadius);
path.lineTo(x, y + vHeight);
path.lineTo(x + vRadius, y + vHeight);
path.arcTo(new RectF(x, y + vHeight - vRadius * 2,
x + vRadius * 2, y + vHeight), 90, 90);
path.close();
canvas.drawPath(path, paint1);
}
private void drawRightDown(Canvas canvas) {
Path path = new Path();
path.moveTo(x + vWidth - vRadius, y + vHeight);
path.lineTo(x + vWidth, y + vHeight);
path.lineTo(x + vWidth, y + vHeight - vRadius);
path.arcTo(new RectF(x + vWidth - vRadius * 2, y + vHeight
- vRadius * 2, x + vWidth, y + vHeight), 0, 90);
path.close();
canvas.drawPath(path, paint1);
}
private void drawRightUp(Canvas canvas) {
Path path = new Path();
path.moveTo(x + vWidth, y + vRadius);
path.lineTo(x + vWidth, y);
path.lineTo(x + vWidth - vRadius, y);
path.arcTo(new RectF(x + vWidth - vRadius * 2, y, x + vWidth,
y + vRadius * 2), -90, 90);
path.close();
canvas.drawPath(path, paint1);
}
//设置webview不可滚动
@Override
public void scrollTo(int x, int y) {
super.scrollTo(0, 0);
}
@Override
public boolean overScrollBy(int deltaX, int deltaY, int scrollX, int scrollY,
int scrollRangeX, int scrollRangeY, int maxOverScrollX,
int maxOverScrollY, boolean isTouchEvent) {
return false;
}
}
本文介绍如何在Android中创建具有圆角的WebView。通过继承WebView并重写draw方法来实现这一效果。需要注意,从Android 9.0开始,由于系统改变透明像素的绘制方式,使用setXfermode的方法在高版本上会出现问题。提供了一个无需依赖Xfermode的圆角WebView实现方式,可按需求调整滚动部分。

1148

被折叠的 条评论
为什么被折叠?



