【问题标题】:How to add round corner to canvas drawrect in Android?如何在Android中为画布drawrect添加圆角?
【发布时间】:2015-10-24 09:21:14
【问题描述】:

我在ReplacementSpan@Override 方法中创建一个矩形。如何添加RoundCornerpadding

代码:

@Override
public void draw(Canvas canvas, CharSequence text, int start, int end, float x, int top, int y, int bottom, Paint paint) {
    RectF rect = new RectF(x, top, x + measureText(paint, text, start, end), bottom);
    paint.setColor(mBackgroundColor);
    canvas.drawRect(rect, paint);
    paint.setColor(mForegroundColor);
    canvas.drawText(text, start, end, x, y, paint);
}

编辑-1

我正在使用 MeasureText:

private float measureText(Paint paint, CharSequence text, int start, int end) { return paint.measureText(text, start, end); }

编辑-2

经过一些建议,我做出了这些更改,我可以在Rectangle 上看到Rounded 角落

@Override
public void draw(Canvas canvas, CharSequence text, int start, int end, float x, int top, int y, int bottom, Paint paint) {
    RectF rect = new RectF(x, top, x + measureText(paint, text, start, end), bottom);
    paint.setColor(mBackgroundColor);
    canvas.drawRoundRect(rect, 15,15,paint);
    paint.setColor(mForegroundColor);
    canvas.drawText(text, start, end, x, y, paint);

}

这是截图:

我正在从以下代码调用draw 方法:

int currentIndex = 0;
for (int i = 0; i < words.length - 1; i++) {
            s.setSpan(new CustomDrawble(Color.GRAY, Color.WHITE), currentIndex, currentIndex + words[i].length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
            currentIndex += words[i].length() + 1;
        }

【问题讨论】:

    标签: android canvas drawrect


    【解决方案1】:

    Canvas 有方法drawRoundRect。您必须提供要绘制的 RectFPaintdrawRect 和两个附加参数 rxry,它们代表圆角的 x 和 y 半径。例如

    canvas.drawRoundRect(rect, 5, 5, paint);
    

    将绘制一个圆角为 5 像素的矩形

    编辑2:

    免责声明:使用倾角代替像素

    @Override
    public void draw(Canvas canvas, CharSequence text, int start, int end, float x, int top, int y, int bottom, Paint paint) {
       RectF rect = new RectF(x, top, x + measureText(paint, text, start, end) + 10, bottom);
       paint.setColor(mBackgroundColor);
       canvas.drawRoundRect(rect, 15,15,paint);
       paint.setColor(mForegroundColor);
       canvas.drawText(text, start, end, x + 5, y, paint); 
     }
    

    【讨论】:

    • 感谢您的回答我刚刚使用它并且它有效!我在寻找如何设置 DrawRect 文本的边距?我该怎么做?
    • 保证金?我唯一想到的就是让矩形更大一点。画布不处理maring/padding。您可能想尝试视图级别
    • 实际上我正在使用 ReplacementSpan 并测量文本我正在使用 measureText。请查看 Edit-1 部分
    • 你想让你的圆角矩形比文本更宽,以避免文本触及你矩形的边界吗?
    • 查看帖子中的 Edit-2 部分
    【解决方案2】:

    这对我有用:

     public static int cnvToDip(Context context,
                                int     pixels)
     {
    
      return ((int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, pixels, context.getResources().getDisplayMetrics()));
     }
    
    public static float[] getRoundRectangleShape(Context context,
                                                  int     radius)
     {
    
      Display display = ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
    
      Point point = new Point();
      display.getSize(point);
    
      return new float[]{point.x / cnvToDip(context, radius),
                         point.x / cnvToDip(context, radius),
                         point.x / cnvToDip(context, radius),
                         point.x / cnvToDip(context, radius),
                         point.x / cnvToDip(context, radius),
                         point.x / cnvToDip(context, radius),
                         point.x / cnvToDip(context, radius),
                         point.x / cnvToDip(context, radius)};
     }
    
    ShapeDrawable shapeDrawable = new ShapeDrawable(new RoundRectShape(getRoundRectangleShape(context, 20), null, null));
        shapeDrawable.getPaint().setColor(Color.BLUE);
    
       @Override
       public void draw(Canvas canvas)
       {
    
        super.draw(canvas);
    
        shapeDrawable.draw(canvas);
    

    【讨论】:

      猜你喜欢
      • 2021-10-31
      • 1970-01-01
      • 2015-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多