使用clipRect - 解释

Nam*_*tha 40 android android-canvas android-view

public class POCII extends Activity { 

    myView mv = new myView(this); 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(mv); 
    }
}


class myView extends View { 

    public myView(Context context) { 
       super(context); 
    } 

    @Override 
    public void onDraw(Canvas canvas) { 

        Paint paint = new Paint(); 

        canvas.drawRect(0,0,100,100, paint); 
        canvas.clipRect(0,0,50,50);
    } 
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,上面的代码是否应该绘制一个矩形然后裁剪左上角?矩形没有被裁剪.

请解释一下clipRect的作用.什么是实际剪裁?在给定坐标的情况下,它是否以矩形的形式剪辑?如果是这样,为什么上面的代码不起作用?

Rib*_*ibo 77

Canvas.clipRect(left, top, right, bottom)减少了未来绘制操作可以写入的屏幕区域.它将clipBounds设置为当前剪切矩形和指定矩形的空间交集.clipRect方法有很多变体可以接受不同的区域形式,并允许对剪切矩形进行不同的操作.如果要显式设置剪切区域,请尝试:

canvas.clipRect(left, top, right, bottom, Region.Op.REPLACE);
Run Code Online (Sandbox Code Playgroud)

第五个参数表示替换剪切矩形,而不是创建与先前版本的交集.

尝试在drawRect语句之前移动clipRect语句.或者,尝试添加:

paint.setColor(Color.YELLOW);
drawRect(0,0,75,75);
Run Code Online (Sandbox Code Playgroud)

在你现有的clipRect语句之后.它应该绘制一个50x50的黄色正方形.

另一个注意事项:(在显然,很大程度上未记录的View/ViewGroup /绘图代码长期受挫之后),我发现canvas.translate(x,y)也调整了clipRect.clipRect和绘图矩阵的交互非常混乱.打印输出很有帮助:

canvas.getMatrix()
Run Code Online (Sandbox Code Playgroud)

canvas.getClipBounds()
Run Code Online (Sandbox Code Playgroud)

在修改画布之前和之后以及绘制之前.

  • canvas.translate(x,y)上的注释与clipRect混淆是非常有用的.救了我很多挫折感.谢谢! (2认同)
  • 带有`Region.Op` 的方法现在显然已被弃用。 (2认同)

Mat*_*sen 5

要裁剪左上部分,请执行以下操作:

canvas.clipRect(0,0,50,50, Region.Op.DIFFERENCE);
// secondly...
canvas.drawRect(0,0,100,100, paint); 
Run Code Online (Sandbox Code Playgroud)