0

我想知道获得下面显示的结果的最佳解决方案是什么。这是我到目前为止发现的:

森林的 ImageView 和我将在其上绘制矩形的透明表面视图(用于处理触摸)?或者...只是一个将图像设置为背景并直接在其上绘制矩形的 SurfaceView...?

对于这 2 个,我已经选择了一个 RelativeLayout。

这两个中的哪一个是最有效和最容易做到的?或者也许还有另一种我没有想到的方法。

无论如何感谢您的建议,这就是我倾向于...

在此处输入图像描述

4

1 回答 1

1

我通过将图像放置在 RelativeLayout 中来实现这一点(FrameLayout 也可以),然后以编程方式添加每个轮廓视图。如果您知道 x 和 y 原点(可能是与图像的比率)以及每个区域的大小,您可以轻松地为每个视图/区域充气(带有黑色边框,透明中心),使其可点击并设置监听器,然后通过调整它的边距来设置它的原点。您可能希望在图像完成布局后执行所有这些操作:

我把它放在onActivityCreated我的Fragment,但其他生命周期方法也可以工作......

ViewTreeObserver vto = image.getViewTreeObserver();
    vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {

        @Override
        public void onGlobalLayout() {
            if (image.getMeasuredHeight() > 0) {
                addHotSpots();
                ViewTreeObserver obs = image.getViewTreeObserver();
                obs.removeGlobalOnLayoutListener(this);
            }
        }

    });

这就是我实际放置所有热点/区域的方式:

protected void addHotSpots() {
    HotSpot[] hotSpots = res.hotspots;
    for (HotSpot hs : hotSpots) {
        addHotSpotToImage(hs);

}

private void addHotSpotToImage(HotSpot hs) {

    int height = image.getMeasuredHeight();
    int width = image.getMeasuredWidth();
    //this piece will probably be different for you
    //depending on what you know about the area's intended size/position
    double hsHeightRatio = hs.lr.y - hs.ul.y;
    double hsWidthRatio = hs.lr.x - hs.ul.x;
    double leftMargin = hs.ul.x * width;
    double topMargin = hs.ul.y * height;
    double hsHeight = height * hsHeightRatio;
    double hsWidth = width * hsWidthRatio;
    LayoutInflater vi = (LayoutInflater) image.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View newSpot = vi.inflate(R.layout.question_hotspot, null);

    RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams((int) hsWidth, (int) hsHeight);
    newSpot.setTag(hs.key);
    newSpot.setFocusable(true);
    newSpot.setClickable(true);
    newSpot.setFocusableInTouchMode(true);
    newSpot.setOnTouchListener(this);

    params.topMargin = (int) topMargin;
    params.leftMargin = (int) leftMargin;
    image.addView(newSpot, params);

}
于 2013-08-26T13:51:01.357 回答