ImageView上的Drawable:如何布局?

时间:2013-12-13 12:42:56

标签: android android-layout drawable android-drawable

因为我对Android很陌生,所以我不知道实现以下场景的最佳做法是什么。

在我的主要活动中,我想要显示图像(可能是显示静态图像的ImageView或显示相机预览的SurfaceView)。该图像应支持双指缩放(平移/缩放)。当用户选中图像时,我想添加一个新的子视图(以XML格式定义的Drawable)。那些抽屉应该用手指移动。当然,drawable应该坚持相对于ImageView的位置,并且必须相应地移动/缩放。

我的问题是:

  1. 我的基本想法是否正确?
  2. 使用什么布局? RelativeLayout,FrameLayout或ViewOverlay(API 18 +)
  3. 必须在MainActivity中实现平移/缩放,对吧?
  4. 红色Drawables将是ImageView或主视图的子项?
  5. 我愿意接受提示或更改或任何其他最佳做法。

    View structure

3 个答案:

答案 0 :(得分:3)

我建议实现一个包含所有逻辑的自定义视图。使用多个视图(每个可移动图像的单独视图)解决此问题将非常困难。我通过创建自定义视图解决了很多这样的问题。

答案 1 :(得分:1)

你需要有两件事:一个平移/缩放组件和一个Drawable来绘制

第一项你可以在网上找到几个这样的组件(例如我的https://github.com/pskink/ZoomView),第二项你可以使用组合的LayerDrawable + BitmapDrawable + InsetDrawable或者使用我的https://github.com/pskink/PatchworkDrawable

答案 2 :(得分:1)

当父级的边界发生变化时调用上面的方法并将父级传递给它。所有ViewGroup类型的孩子都将调整大小。如果需要,您也可以递归地对每个孩子进行调用。在调整孩子的大小后,您可能需要在父母身上调用requestLayout()。

private void resizeChildren(ViewGroup parent, int newWidth, int newHeight) {
    // size is in pixels so make sure you have taken device display density into account
    int childCount = parent.getChildCount();
    for(int i = 0; i < childCount; i++) {
        View v = parent.getChildAtIndex(i);
        if (v instanceof ViewGroup) {
            ((ViewGroup)v).LayoutParams = new ViewGroup.LayoutParams(newWidth, newHeight);
        }
    }
}