2012-12-19 120 views
1

我正在製作一個應用程序它是圖片裁剪。
但銀河聯繫有一些問題。
Region.Op.DIFFERENCE不起作用。
Desire(2.3.3)和GalaxyNexus(4.1)仿真器運行良好。
但並非僅適用於GalaxyNexus真正的手機
Galaxy Nexus上的Canvas Clip功能錯誤

Desire (2.3.3) works well

Galaxy Nexus (4.1.1) problem

請查看代碼... 這是一個的onDraw overrided方法它的擴展imageview的

@override 
protected void onDraw(Canvas canvas) { 
    super.onDraw(canvas); 
    //all rectangle 
    getDrawingRect(viewRect); 

    //small rectangle 
    getDrawingRect(smallRect); 
    smallRect.left += 100; 
    smallRect.right -= 100; 
    smallRect.bottom -= 200; 
    smallRect.top += 200; 

    // paint color setting to transparency black 
    mNoFocusPaint.setARGB(150, 50, 50, 50); 

    // All Rectangle clipping 
    canvas.clipRect(viewRect); 
    // Small Rectangle clipping 
    canvas.clipRect(smallRect, Region.Op.DIFFERENCE); 

    // Draw All Rectangle transparency black color it's except small rectangle 
    canvas.drawRect(viewRect, mNoFocusPaint); 
} 

回答

2

解決了!

清單中

android:hardwareAccelerated="false" 

添加以下代碼:)

2

JuHyun的答案是偉大的!但在我的情況下,我不想爲所有SDK版本的整個應用程序刪除硬件加速。硬件加速畫布裁剪的問題似乎侷限於4.1.1,所以我採用了禁用硬件加速的路線來執行裁剪操作。

自定義視圖類(在這種情況下,一個RecyclerView):

public class ClippableRecyclerView extends RecyclerView { 

    private final CanvasClipper clipper = new CanvasClipper(); 

    public ClippableRecyclerView(Context context) { 
     super(context); 
     configureHardwareAcceleration(); 
    } 

    public ClippableRecyclerView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     configureHardwareAcceleration(); 
    } 

    public ClippableRecyclerView(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     configureHardwareAcceleration(); 
    } 

    public void configureHardwareAcceleration() { 
     if (Build.VERSION.SDK_INT == Build.VERSION_CODES.JELLY_BEAN) { 
      setLayerType(View.LAYER_TYPE_SOFTWARE, null); 
     } 
    } 

    /** 
    * Remove the region from the current clip using a difference operation 
    * @param rect 
    */ 
    public void removeFromClipBounds(Rect rect) { 
     clipper.removeFromClipBounds(rect); 
     invalidate(); 
    } 

    public void resetClipBounds() { 
     clipper.resetClipBounds(); 
     invalidate(); 
    } 

    @Override 
    public void onDraw(Canvas c) { 
     super.onDraw(c); 
     clipper.clipCanvas(c); 
    } 
} 

帆布削波器類:

public class CanvasClipper { 

    private final ArrayList<Rect> clipRegions = new ArrayList<>(); 

    /** 
    * Remove the region from the current clip using a difference operation 
    * @param rect 
    */ 
    public void removeFromClipBounds(Rect rect) { 
     clipRegions.add(rect); 
    } 

    public void resetClipBounds() { 
     clipRegions.clear(); 
    } 

    public void clipCanvas(Canvas c) { 
     if (!clipRegions.isEmpty()) { 
      for (Rect clipRegion : clipRegions) { 
       c.clipRect(clipRegion, Region.Op.DIFFERENCE); 
      } 
     } 
    } 
}