2015-05-09 66 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上的代碼。