android - Fresco 安卓库 : Not able to set hotspot on "overlayImage" drawable set in xml

标签 android android-layout fresco

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

如果我准备GenericDraweeHierarchy以编程方式然后我可以准备 overlayImage 可绘制对象并可以为其设置触摸监听器热点。代码 fragment :

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 中设置了不同的属性,不想更改它并以编程方式设置。请提出任何获取overlayImage的方法我在 xml layout 中设置的可绘制对象资源。

我试过但没有成功:

  1. 用过getTopLevelDrawable()getDrawable()的方法 SimpleDraweeView获得 drawablesetHotSpot
  2. 用过getTopLevelDrawable SimpleDraweeView的方法|后像 通过将 ControllerListener 设置为它并设置 hotSpot 来加载 获得可绘制对象。

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

最佳答案

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

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

    <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。 以下解决方案由 github 上的“boxcounter”提供。查看 以下 link对于显示波纹的自定义 SimpleDraweeViewSimpleDraweeView 之上的效果。

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

Fresco #912 问题更新:

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

关于android - Fresco 安卓库 : Not able to set hotspot on "overlayImage" drawable set in xml,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34785738/

相关文章:

java - Fresco - setDownsampleEnabled 真/假?

java - 编码 JSON 数组

android - 是否可以将 GSM 调用重定向/转发到 VOIP?

android - U-boot:双启动 + 虚拟内核 + 修改后的启动图像

android - 在 Android 中显示来自服务器字节数组的图像

android - 我想在循环中使用具有平滑过渡效果的随机颜色作为背景

android - 如何使用 XML 布局以外的方式绘制自定义 View 装饰?

android - Facebook Fresco 使用 wrap_content

Fresco 中的Android图像无效

java - 布局切换时 View 会发生什么情况?