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文档 最后才是群里问问 --- 牙叔教程
声明部分内容来自网络 本教程仅用于学习 禁止用于其他用途




