2015-05-09 35 views
1

我想做一个圆角ImageView。但我希望它具有背景色(例如,#000)。使用当前的解决方案(构建扩展的圆角视图或绘制圆角位图),背景属性将破坏该效果,因为视图将位于黑色矩形中(请参见下图)。支持Android背景颜色的圆角ImageView?

enter image description here

是否有可能实现这样的观点,即背景区域也圆角的?

PS,为什么我想要一个背景颜色:我允许用户上传非方形图像,但我的图像视图区域是方形的,所以我想要一种颜色来“对齐”它们(请参阅下图 - 我想要红色部分要圆)。

enter image description here

+0

发布您正在使用的代码 – Blackbelt

+0

您是否尝试在xml文件中为您设置'android:background =“@ android:color/transparent”'ImageView'标记? – mbelsky

+0

@mbelsky我想要一个背景颜色,实际上。 – mrmoment

回答

2

圆角可以使用棒棒糖的轮廓和前棒棒堂的路径来完成。请参阅:

  1. 准备口罩

    if (cornerRadius > 0) { 
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
         setClipToOutline(true); 
         setOutlineProvider(ShadowShape.viewOutlineProvider); 
        } else { 
         cornersMask = new Path(); 
         cornersMask.addRoundRect(new RectF(0, 0, getWidth(), getHeight()), cornerRadius, cornerRadius, Path.Direction.CW); 
         cornersMask.setFillType(Path.FillType.INVERSE_WINDING); 
        } 
    } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) 
         setOutlineProvider(ViewOutlineProvider.BOUNDS); 
    } 
    
  2. 平局(Canvas)的方法

    if (cornerRadius > 0 && getWidth() > 0 && getHeight() > 0 && Build.VERSION.SDK_INT <= Build.VERSION_CODES.KITKAT_WATCH) { 
        int saveFlags = Canvas.MATRIX_SAVE_FLAG | Canvas.CLIP_SAVE_FLAG | Canvas.HAS_ALPHA_LAYER_SAVE_FLAG | Canvas.FULL_COLOR_LAYER_SAVE_FLAG | Canvas.CLIP_TO_LAYER_SAVE_FLAG; 
        int saveCount = canvas.saveLayer(0, 0, getWidth(), getHeight(), null, saveFlags); 
    
        super.draw(canvas); 
    
        paint.setXfermode(pdMode); 
        canvas.drawPath(cornersMask, paint); 
    
        canvas.restoreToCount(saveCount); 
        paint.setXfermode(null); 
    } else { 
        super.draw(canvas); 
    } 
    
  3. 和失踪viewOutlineProvider

    viewOutlineProvider = new ViewOutlineProvider() { 
         @Override 
         public void getOutline(View view, Outline outline) { 
          ShadowShape shadowShape = ((ShadowView) view).getShadowShape(); 
          if (shadowShape == RECT) { 
           outline.setRect(0, 0, view.getWidth(), view.getHeight()); 
          } else if (shadowShape == ROUND_RECT) { 
           outline.setRoundRect(0, 0, view.getWidth(), view.getHeight(), ((CornerView) view).getCornerRadius()); 
          } else if (shadowShape == CIRCLE) { 
           outline.setOval(0, 0, view.getWidth(), view.getHeight()); 
          } 
         } 
        }; 
    

而且图像:

enter image description here

你可以乱用这个代码在任何你想要的方式。您可以将图像和背景分别切割成任意形状,也可以一起切割。欲了解更多详情,请查阅github上的代码。