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
可绘制对象。
我试过但没有用的:
- 使用了
getTopLevelDrawable()
和getDrawable()
的方法
SimpleDraweeView
获得 drawable
和 setHotSpot
。
- 图像后使用了
SimpleDraweeView
的getTopLevelDrawable
方法
通过将 ControllerListener 设置为它并设置 hotSpot 来加载
获得drawable.
如果我可以通过任何其他方式添加热点,请告诉我。
我努力在 Fresco SimpleDraweeView
上添加波纹叠加层。
我没有找到使涟漪效应在 SimpleDraweeView
上正常工作的确切解决方案,但我想出了两种添加工作涟漪效应的方法:
将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
}
})
- 扩展
SimpleDraweeView
并在其上绘制波纹 drawable
。
"boxcounter" 在 github 上提供了以下解决方案。查看
继 link 之后显示波纹的自定义 SimpleDraweeView
在 SimpleDraweeView
. 之上的效果
我在 Fresco library issue page 上报告了同样的问题。希望尽快得到答复。
Fresco #912 问题更新:
几天前,我向 Fresco 提供了解决此问题的承诺。现在在 com.facebook.fresco:fresco:0.11.0
中,我们只需要将 ripple drawable 设置为 app:overlayImage
属性的值,它将完美地工作。
我在 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
可绘制对象。
我试过但没有用的:
- 使用了
getTopLevelDrawable()
和getDrawable()
的方法SimpleDraweeView
获得drawable
和setHotSpot
。 - 图像后使用了
SimpleDraweeView
的getTopLevelDrawable
方法 通过将 ControllerListener 设置为它并设置 hotSpot 来加载 获得drawable.
如果我可以通过任何其他方式添加热点,请告诉我。
我努力在 Fresco SimpleDraweeView
上添加波纹叠加层。
我没有找到使涟漪效应在 SimpleDraweeView
上正常工作的确切解决方案,但我想出了两种添加工作涟漪效应的方法:
将
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 } })
- 扩展
SimpleDraweeView
并在其上绘制波纹drawable
。 "boxcounter" 在 github 上提供了以下解决方案。查看 继 link 之后显示波纹的自定义SimpleDraweeView
在SimpleDraweeView
. 之上的效果
我在 Fresco library issue page 上报告了同样的问题。希望尽快得到答复。
Fresco #912 问题更新:
几天前,我向 Fresco 提供了解决此问题的承诺。现在在 com.facebook.fresco:fresco:0.11.0
中,我们只需要将 ripple drawable 设置为 app:overlayImage
属性的值,它将完美地工作。