Galaxy Nexus上的Canvas Clip功能错误

时间:2012-12-19 06:07:33

标签: android android-canvas ondraw

我正在申请它的图片裁剪 但Galaxy nexus有一些问题 Region.Op.DIFFERENCE不起作用。
欲望(2.3.3)和GalaxyNexus(4.1)模拟器运行良好。
但不适用于GalaxyNexus Real Phone

Desire (2.3.3) works well

Galaxy Nexus (4.1.1) problem

请看代码...... 这是一个onDraw覆盖方法,它是扩展的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 个答案:

答案 0 :(得分:2)

解决!

在清单

中添加此代码
    android:hardwareAccelerated="false"

:)

答案 1 :(得分: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);
    }
}

Canvas clipper类:

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);
            }
        }
    }
}