在我的半黑色帆布上打一个透明孔

时间:2015-07-06 13:38:58

标签: android android-canvas

我正在尝试在屏幕中间创建一个带透明孔的黑屏。这是我尝试过的。

@Override
public void draw(Canvas canvas)
{
    Paint myPaint = new Paint();
    myPaint.setColor(0xC0000000);
    canvas.drawRect(mBlackRect, myPaint);

    myPaint = new Paint();
    myPaint.setColor(Color.TRANSPARENT);
    myPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
    canvas.drawRect(mTransparentRect, myPaint);
}

第二种颜料显示黑色而不是透明。如何在MY SemiBlack Canvas中打一个透明孔?

2 个答案:

答案 0 :(得分:1)

你没有保存画布,请尝试下面的代码

Traceback (most recent call last):
  File "name.py", line 14, in <module>
    results = [item.text for item in driver.find_elements_by_css_selector("div.market_listing_row .market_listing_item_name")]
  File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webelement.py", line 61, in text
    return self._execute(Command.GET_ELEMENT_TEXT)['value']
  File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webelement.py", line 402, in _execute
    return self._parent.execute(command, params)
  File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 175, in execute
    self.error_handler.check_response(response)
  File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/errorhandler.py", line 166, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.StaleElementReferenceException: Message: Element is no longer attached to the DOM
Stacktrace:
    at fxdriver.cache.getElementAt (resource://fxdriver/modules/web-element-cache.js:8956)
    at Utils.getElementAt (file:///tmp/tmpUpLsV7/extensions/fxdriver@googlecode.com/components/command-processor.js:8546)
    at WebElement.getElementText (file:///tmp/tmpUpLsV7/extensions/fxdriver@googlecode.com/components/command-processor.js:11704)
    at DelayedCommand.prototype.executeInternal_/h (file:///tmp/tmpUpLsV7/extensions/fxdriver@googlecode.com/components/command-processor.js:12274)
    at DelayedCommand.prototype.executeInternal_ (file:///tmp/tmpUpLsV7/extensions/fxdriver@googlecode.com/components/command-processor.js:12279)
    at DelayedCommand.prototype.execute/< (file:///tmp/tmpUpLsV7/extensions/fxdriver@googlecode.com/components/command-processor.js:12221)

答案 1 :(得分:0)

你真的不能打击&#34;通过&#34;去除像素的一个洞&#34;从已经绘制的东西,至少不是硬件层。如果你使用软件层,它将对性能不利。

您要做的是使用应用于油漆的Alpha蒙版绘制您的形状。面具会阻止在画布上绘制形状的某些部分,例如在展开绘画之前切割一张纸并将其贴在墙上。

要将alpha蒙版应用于绘画,首先需要创建一个包含&#34;孔&#34; shape(以编程方式或通过从资源加载自定义图像),然后使用正确的Xfermode从此位图创建BitmapShader(具体取决于您是否要切割掩码位图中的透明部分或非透明部分) )在绘制半透明矩形或任何你想要的东西之前,最后将这个着色器应用到你的绘画中。

小心性能:只创建一次Paint对象(在onDraw()中分配任何对象,因为此方法在UI线程上每秒最多调用60次),并重新创建仅当View / Drawable的边界发生变化时(如果其尺寸取决于View尺寸,否则您只需创建一次),alpha蒙版位图。

对不起,如果我没有时间为您提供现成的代码,但我认为您应该找到有关我刚才描述的技术的大量信息,您可以开始尝试和搞清楚我认为你自己的解决方案更有价值;)