我想知道获得下面显示的结果的最佳解决方案是什么。这是我到目前为止发现的:
森林的 ImageView 和我将在其上绘制矩形的透明表面视图(用于处理触摸)?或者...只是一个将图像设置为背景并直接在其上绘制矩形的 SurfaceView...?
对于这 2 个,我已经选择了一个 RelativeLayout。
这两个中的哪一个是最有效和最容易做到的?或者也许还有另一种我没有想到的方法。
无论如何感谢您的建议,这就是我倾向于...
我通过将图像放置在 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);
}