绘图透明区域未使用拖动侦听器更新

弗洛

SOtransparent上的Views一个习俗中看到了许多有关儿童背景的问题ViewGroup,但是似乎没有人遇到这个问题。

背景:
我创建了一个自定义FrameLayout此容器具有动态添加的视图。它的子项应具有透明背景,但容器的另一表面必须具有背景色。子视图可以位于drag'n'dropped此容器中的任何位置。

我的工作:
覆盖dispatchDraw(),创建Bitmap和一个新对象Canvas,然后用白色背景填充新的画布。
我在子级Views上循环PaintRect从子级的尺寸创建一个new 并用于PorterDuff.Mode.DST_OUT清除子级的区域。对于每个孩子,我将“ Paint and Rect”添加到新的“画布”中。
最后,通过传递创建的位图,在drawBitmap给出的主Canvas上使用dispatchDraw()

问题:
效果很好:孩子们的背景是透明的,其余的都是白色背景。但是,当我DragListener向子级添加a时,“ cutting”区域不会更新(dispatchDraw可以正确调用):换句话说,当我拖动子级视图时,它已经很好地放置了,但是透明区域仍在同一位置。

代码:
自定义FrameLayout

@Override
public void dispatchDraw(Canvas canvas) {
    super.dispatchDraw(canvas);
    drawCanvas(canvas);
}

private void drawCanvas(Canvas canvas) {
    // Create an off-screen bitmap and its canvas
    Bitmap bitmap = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888);
    Canvas auxCanvas = new Canvas(bitmap);

    // Fill the canvas with the desired outside color
    auxCanvas.drawColor(Color.WHITE);

    // Create a paint for each child into parent
    for (int i = 0; i < getChildCount(); ++i) {
        // Create a transparent area for the Rect child
        View child = this.getChildAt(i);
        Paint childPaint = new Paint();
        childPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT));
        Rect childRect = new Rect(child.getLeft(), child.getTop(), child.getRight(), child.getBottom());
        auxCanvas.drawRect(childRect, childPaint);
    }

    // Draw the bitmap into the original canvas
    canvas.drawBitmap(bitmap, 0, 0, null);
}

DragListenerACTION_DROP的事件:

case DragEvent.ACTION_DROP:
    x = event.getX();
    y = event.getY();

    FrameLayout frame = (FrameLayout) v;
    View view = (View) event.getLocalState();
    view.setX(x - (view.getWidth()/2));
    view.setY(y - (view.getHeight()/2));
    frame.invalidate();
    break;

屏幕截图:

关于找到的所有Q&A,我尝试了很多事情,但似乎没有任何效果。
任何帮助将不胜感激。

弗洛

最终,我找到了线索:更新后,透明物体Paint无法获得正确的x和y轴值。

我猜getLeft()getTop()getRight()getBottom()在跌落不会改变。奇怪的是,在我的日志中,这些值似乎已更新。所以不是,我在更新后的值试图DragEvent.ACTION_DROP通过使用getX()getY(),和它正确地改变了透明区域的坐标。

循环中的子项的解决方案:

Paint childPaint = new Paint();
childPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT));
// Use the x and y axis (plus the width and height)
Rect childRect = new Rect(
    (int) child.getX(),
    (int) child.getY(),
    (int) child.getX() + child.getWidth(),
    (int) child.getY() + child.getHeight()
);
auxCanvas.drawRect(childRect, childPaint);

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用鼠标侦听器拖动对象

来自分类Dev

使用鼠标侦听器拖动对象

来自分类Dev

Firestore快照侦听器:Recyclerview未更新

来自分类Dev

使用Android内置的手势侦听器和缩放侦听器实现捏缩放和拖动

来自分类Dev

如何使用Chrome扩展程序(内容脚本)覆盖拖动事件侦听器?

来自分类Dev

使用WeakReferenced侦听器

来自分类Dev

FirebaseAuth侦听器未调用

来自分类Dev

EditText侦听器未运行

来自分类Dev

事件未传递给侦听器

来自分类Dev

未调用事件侦听器

来自分类Dev

未触发OnItemClick侦听器

来自分类Dev

未触发OnItemClick侦听器

来自分类Dev

Firebase侦听器代码未触发

来自分类Dev

Javascript 事件侦听器未触发

来自分类Dev

将拖动事件侦听器添加到iframe

来自分类Dev

JFXtras将侦听器添加到拖动约会

来自分类Dev

JavaFX 静默吞下拖动侦听器中引发的异常

来自分类Dev

从按钮输入事件侦听器更新

来自分类Dev

从Vaadin事件侦听器更新组件

来自分类Dev

Firebird JDBC更新侦听器

来自分类Dev

从按钮输入事件侦听器更新

来自分类Dev

为什么更新状态未反映在事件侦听器中:React Native,Hooks

来自分类Dev

Flutter Bloc侦听器未侦听状态更改

来自分类Dev

Symfony(5.1)主义事件侦听器被触发,但实体侦听器未触发

来自分类Dev

使用Syn.js的事件侦听器未触发鼠标事件

来自分类Dev

使用侦听器时无法通过“ this”

来自分类Dev

在Java中使用JFrame的侦听器

来自分类Dev

使用RxJS的多个关键侦听器

来自分类Dev

对按钮使用动作侦听器