Fresco Android lib:无法在 xml 中设置的 "overlayImage" 可绘制对象上设置热点

Fresco Android lib: Not able to set hotspot on "overlayImage" drawable set in xml

我在 xml layout 中的 SimpleDraweeView 上设置了 app:overlayImage 可绘制,以便在 SimpleDraweeView 之上添加选择器波纹效果。设置 overlayImage 属性正确显示图像上的波纹效果,但热点始终从中心显示。为了解决这个问题,我需要我在 xml 资源中设置的 overlayImage drawable,但我没有找到任何方法来以编程方式将 overlayImage 可绘制对象设置为 SimpleDraweeView 资源。

如果我以编程方式准备 GenericDraweeHierarchy,那么我可以准备 overlayImage 可绘制对象并为其设置触摸侦听器热点。代码片段:

SimpleDraweeView image = (SimpleDraweeView) findViewById(R.id.image);
GenericDraweeHierarchyBuilder builder = new GenericDraweeHierarchyBuilder(mContext.getResources());
Drawable overlayImage = getDrawable(R.drawable.image_selector);
builder.setOverlay(overlayImage);

image.setHierarchy(builder.build());

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    view.setOnTouchListener(new View.OnTouchListener() {

    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        if (overlayImage != null) {
            overlayImage.setHotspot(event.getX(), event.getY());
        }
        return false;
        }
    });
}

但我不想以编程方式创建 GenericDraweeHierarchy,因为我已经在 xml 中设置了不同的属性,并且不想更改它并以编程方式设置。请建议任何方法来获取我在 xml layout 资源中设置的 overlayImage 可绘制对象。

我试过但没有用的:

  1. 使用了getTopLevelDrawable()getDrawable()的方法 SimpleDraweeView 获得 drawablesetHotSpot
  2. 图像后使用了SimpleDraweeViewgetTopLevelDrawable方法 通过将 ControllerListener 设置为它并设置 hotSpot 来加载 获得drawable.

如果我可以通过任何其他方式添加热点,请告诉我。

我努力在 Fresco SimpleDraweeView 上添加波纹叠加层。 我没有找到使涟漪效应在 SimpleDraweeView 上正常工作的确切解决方案,但我想出了两种添加工作涟漪效应的方法:

  1. SimpleDraweeView包裹在FrameLayout内并设置 android:foreground 属性 到 FrameLayout。添加 android:clickable 属性 至 FrameLayout 或添加点击监听器 给它。代码片段:

    <FrameLayout
        android:id="@+id/image_container"
        android:layout_width="wrap_content"
        android:layout_height"wrap_content"
        android:foreground="@drawable/ripple_selector"
        android:clickable="true">
    
        <com.facebook.drawee.view.SimpleDraweeView
            android:id="@+id/image"
            android:layout_width="20dp"
            android:layout_height="20dp"/>
    
    </FrameLayout>
    

    FrameLayout 容器设置点击监听器:

    findViewById(R.id.id/image_container).setOnClickListener(new View.OnClicklistener() {
            @Override
            public void onClick(View v) {
                // Do your stuff
            }
        })
    
  2. 扩展 SimpleDraweeView 并在其上绘制波纹 drawable。 "boxcounter" 在 github 上提供了以下解决方案。查看 继 link 之后显示波纹的自定义 SimpleDraweeViewSimpleDraweeView.
  3. 之上的效果

我在 Fresco library issue page 上报告了同样的问题。希望尽快得到答复。

Fresco #912 问题更新:

几天前,我向 Fresco 提供了解决此问题的承诺。现在在 com.facebook.fresco:fresco:0.11.0 中,我们只需要将 ripple drawable 设置为 app:overlayImage 属性的值,它将完美地工作。