autojs 进度条,autojs画圆润的圆角矩形
autojs 进度条,autojs画圆润的圆角矩形这要从一条直线说起我们今天的主题就是用canvas画圆角矩形 要圆润的那种右上角仔细看可以看到 直线与圆弧的 刚刚连接的部位 有一点点不圆润 我们今天就处理这个问题 public void draw(Canvas canvas) { final Paint paint = mPaint; final boolean clearColorFilter; if (mTintFilter != null && paint.getColorFilter() == null) { paint.setColorFilter(mTintFilter); clearColorFilter = true; } else { clearColorFilter
牙叔教程 简单易懂
问题以cardView为例
我们放大四个角看看
左上角
右上角
仔细看可以看到 直线与圆弧的 刚刚连接的部位 有一点点不圆润 我们今天就处理这个问题
cardView的圆角是怎么弄的 public void draw(Canvas canvas) {
final Paint paint = mPaint;
final boolean clearColorFilter;
if (mTintFilter != null && paint.getColorFilter() == null) {
paint.setColorFilter(mTintFilter);
clearColorFilter = true;
} else {
clearColorFilter = false;
}
canvas.drawRoundRect(mBoundsF mRadius mRadius paint);
if (clearColorFilter) {
paint.setColorFilter(null);
}
}
...
final RoundRectDrawable background = new RoundrectDrawable(backgroundColor radius);
cardView.setCardBackground(background);
使用canvas画的圆角矩形
我们今天的主题就是用canvas画圆角矩形 要圆润的那种
为什么圆角不圆润这要从一条直线说起
首先我们画一条直线
"ui";
importClass(android.graphics.PorterDuff);
importClass(android.graphics.Color);
/* -------------------------------------------------------------------------- */
ui.layout(
<vertical gravity="center_horizontal">
<canvas id="board" w="300dp" h="300dp"></canvas>
</vertical>
);
let paint = new Paint();
paint.setColor(Color.RED);
paint.setStrokeWidth(2);
ui.board.on("draw" function (canvas) {
canvas.drawColor(Color.TRANSPARENT PorterDuff.Mode.CLEAR);
canvas.drawLine(0 0 canvas.getWidth() canvas.getHeight() paint);
});
这是一条普通的直线
角度不适合这个教程 我们把直线画到中间
paint.setStrokeWidth(60);
ui.board.on("draw" function (canvas) {
canvas.drawColor(Color.TRANSPARENT PorterDuff.Mode.CLEAR);
canvas.drawLine(0 canvas.getHeight() / 2 canvas.getWidth() canvas.getHeight() / 2 paint);
});
这条线的高度是60px
现在直线在中间 我在底部画一条同样高度是60px的直线
canvas.drawLine(0 canvas.getHeight() / 2 canvas.getWidth() canvas.getHeight() / 2 paint);
canvas.drawLine(0 canvas.getHeight() canvas.getWidth() canvas.getHeight() paint);
底部的直线高度还是60 但是我们能看见的只有30 另外一半在画板外面
直线就是这样的 下面我们来看看圆角矩形
绘制圆角矩形的方法
函数名称:public void drawRoundRect (RectF rect float rx float ry Paint paint)
参数说明:
rect:RectF对象。
rx:x方向上的圆角半径。
ry:y方向上的圆角半径。
paint:绘制时所使用的画笔。
先构造rect
let rect = new RectF(0 0 board.getWidth() board.getHeight());
再画圆角矩形
canvas.drawRoundRect(rect rx ry paint);
可以看到 这个圆角矩形 也就是这个圆 它在上下左右贴近正方形四边的时候 笔画变细了
因为有一半漏到画板外面了 我们也看不见
我们修改一下画板高度 看看圆角矩形的样子
从图中可以看到 圆角矩形挨着长方形四条边的地方 都有半截漏到了画板外面
但是有一部分是没有漏到外面的 那就是四个角的四条弧
这就是为什么觉得圆角不圆润的原因
这就是为什么感觉圆弧比直线粗一点的原因所在
解决圆角矩形直线和圆弧粗细不一样的方法那这个问题怎么解决呢?
我们把四条边的直线 往里面推一推 压一压 都看见不就好啦!
这个主要是修改参数rect 左上右下都往里面压30px
let k = 30;
let rect = new RectF(0 k 0 k board.getWidth() - k board.getHeight() - k);
和上面的圆角矩形比一下 这个效果要好很多
实际效果我们来给textview添加圆角背景
function setBackground(view offset) {
offset = offset || 0;
let rect = new RectF(0 offset 0 offset view.getWidth() - offset view.getHeight() - offset);
let rx = view.height;
let ry = rx;
var drawable = new android.graphics.drawable.Drawable({
draw: function (canvas) {
canvas.drawRoundRect(rect rx ry paint);
}
});
view.setBackgroundDrawable(drawable);
}
看上去没什么区别
我们再用另外一种办法试试: 裁剪画布
function setBackground(view offset) {
offset = offset || 0;
let rect = new RectF(0 offset 0 offset view.getWidth() - offset view.getHeight() - offset);
let rx = view.height;
let ry = rx;
let path = new Path();
path.addRoundRect(rect rx ry Path.Direction.CW);
var drawable = new android.graphics.drawable.Drawable({
draw: function (canvas) {
canvas.drawColor(Color.TRANSPARENT PorterDuff.Mode.CLEAR);
canvas.clipPath(path);
canvas.drawColor(Color.BLUE);
}
});
view.setBackgroundDrawable(drawable);
}
除了背景小了一圈 圆弧那里 还是没有看到什么特别明显的区别 该有锯齿还是有锯齿
我们再用空心描边试试
paint.setStyle(Paint.Style.STROKE);
从图中可以看出 之所以没有区别 是因为画笔描边 就算超出了view的区域 仍然是可见的
除非你限制view区域之外的描边看不见.
黑色是view的区域 为什么画笔的描边在区域之外还能显示呢?当我把圆角矩形向左挪动100个像素的时候 画笔的描边就只显示view的黑色区域内部了 这样我觉得才是正常的;
我觉得这是autojs的bug
view绘制的时候 只能在view内部 正常是不应该超出view区域 否则会遮挡其他控件.
环境雷电模拟器:9.0.17
Android版本: 9
Autojs版本: 9.2.10
思路是最重要的 其他的百度 bing stackoverflow github 安卓文档 autojs文档 最后才是群里问问 --- 牙叔教程
声明部分内容来自网络 本教程仅用于学习 禁止用于其他用途