【问题标题】:Can I draw outside the bounds of an Android Canvas我可以在 Android Canvas 的范围之外绘制吗
【发布时间】:2011-05-01 00:09:45
【问题描述】:

我正在移植一个在图形环境中编写的应用程序,该应用程序允许在剪切矩形的边界之外进行绘图。有什么方法可以在 Android 中做到这一点?

【问题讨论】:

    标签: android drawing image-clipping


    【解决方案1】:

    尝试设置

    android:clipChildren="false" 
    

    到父视图

    【讨论】:

    • 我不知道这个问题,但我想感谢您解决我面临的问题。谢谢你。这就是我一直在寻找的。​​span>
    • @MortezaRastgoo 链接的问题(和答案)根本不直接转化为这个问题。
    【解决方案2】:

    要在边界之外绘制,你需要扩展画布的clipRect。

    查看 Canvas 类中重载的 clipRect 方法。

    注意 - 您需要指定区域操作,因为默认操作是 INTERSECT。所以是这样的:

    Rect newRect = canvas.getClipBounds();
    newRect.inset(-5, -5)  //make the rect larger
    
    canvas.clipRect (newRect, Region.Op.REPLACE);
    //happily draw outside the bound now
    

    【讨论】:

    • 它根本不起作用。我只是用 (-2000, -2000) 参数调整画布大小,然后翻译它,但我绘制的图像仍然被剪裁。
    • 但是如果你在每个onDraw(Canvas canvas) 上都这样做,那么你不是让计算机做很多额外的工作吗?
    • @SomeoneSomewhere 我不确定当您更改剪辑矩形时对性能的影响是什么(尤其是在与软件渲染上的 HA)。但这应该很容易通过分析来衡量。
    • @MortezaRastgoo 链接的问题(和答案)根本不直接转化为这个问题。
    • Region.Op.REPLACE 在 API >= 26 处已弃用您有其他解决方案吗?我用完了所有的 SOF,还没有找到
    【解决方案3】:

    您可以在您喜欢的地方绘制,但在剪切矩形之外不会保存任何内容。

    【讨论】:

    • 那么如何保存呢?我被卡住了。
    【解决方案4】:

    @numan 给出的答案几乎没问题,问题是这种方法的内存分配,所以我们应该这样做:

    // in constructor/elsewhere
    Rect newRect = new Rect();
    
    // in onDraw
    canvas.getClipBounds(newRect);
    newRect.inset(0, -20);  //make the rect larger
    canvas.clipRect(newRect, Region.Op.REPLACE);
    

    这解决了问题:-)

    【讨论】:

    • 如何初始化newRect
    • 好吧,我猜这里的重点是 newRect 在每个对象初始化时分配一次,而不是在每次调用 onDraw 时分配一次。
    • Region.Op.REPLACE 已弃用。它不再起作用了!
    【解决方案5】:

    如果你想在 TextView 中越界绘制文本,你应该这样做:

    <TextView
        ...
        android:shadowColor="#01000000"
        android:shadowDx="100" // out of right bound
        android:shadowDy="0"
        android:shadowRadius="1"
    .../>
    

    像@numan 的回答那样使用clipRect() 不起作用,因为TextView 剪辑它是onDraw() 中的自己的矩形:

    if (mShadowRadius != 0) {
        clipLeft += Math.min(0, mShadowDx - mShadowRadius);
        clipRight += Math.max(0, mShadowDx + mShadowRadius);
    
        clipTop += Math.min(0, mShadowDy - mShadowRadius);
        clipBottom += Math.max(0, mShadowDy + mShadowRadius);
    }
    
    canvas.clipRect(clipLeft, clipTop, clipRight, clipBottom);
    

    最后但同样重要的是,不要忘记在您的父 ViewGroup 中设置 android:clipChildren="false"android:clipToPadding="false"

    【讨论】:

    • [已解决] 醒了! ((ViewGroup) 父级).setClipChildren(true); ((ViewGroup) 父级).setClipToPadding(true);当我需要在同一层次结构中绘制其他视图时解决了我的使用问题!
    【解决方案6】:

    如果您想要的只是在视图边界之外(以编程方式)绘制,那就长话短说吧。

    parentLayout.setClipChildren(false);
    

    或通过 xml:

     android:clipChildren="false" 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-01
      • 2015-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多