我正在使用ScrollView来保存和显示静态地图图像,其大小为480像素x 904像素,并且已实现,以便我可以向上和向下滚动以查看地图。我已实现,以便ScrollView适合并填充屏幕。静态地图是一个9补丁图像,只允许右边缘拉伸。在静态地图上,我使用以编程方式定义的ImageButtons在特定位置覆盖地图引脚。我注意到,如果我使用特定的AVD(例如HVGA)测试并且所有地图引脚都位于确切的位置,一旦我将相同的仿真器切换到不同的分辨率(例如WVGA),所有引脚都将关闭。我定义每个地图引脚的位置的方法是我首先使用HVGA中的仿真器试验每个单独的ImageButton视图,以便我知道将在仿真器中生成完美位置的正确dpi值。然后创建ImageButtons并将其动态放置在需要像素单元的java中,并且我使用适当的dpi到像素转换代码以确保可以根据屏幕密度计算正确的像素单位。地图引脚的放置基于setMargin()调用,方法是从左边缘移动x像素,从顶边移动y像素。不确定这是否是定义图像按钮位置的正确方法,但我认为dpi到像素转换会处理转换?
这是我的xml:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/rlayoutResultMap"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:padding="0dp" >
<ScrollView
android:id="@+id/scrollResultMap"
android:fillViewport="true"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:scrollbars="none" >
<RelativeLayout
android:id="@+id/rlayoutScrollMap"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<ImageView
android:id="@+id/imgResultMap"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_alignParentTop="true"
android:src="@drawable/map_base"
android:scaleType="fitXY"/>
</RelativeLayout>
</ScrollView>
...
</RelativeLayout>
以下是java代码的相关部分:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.result_map);
// Get the array of map pin locations in pixel unit (code is listed below)
mapLocArray = getMapCoordinates();
...
RelativeLayout rl = (RelativeLayout) findViewById(R.id.rlayoutResultMap);
// Loop through and create the map location buttons
int x, y;
for (int i=1; i<=maxMapLoc; i++ ) {
mapLocation = i;
ImageButton btnMapLoc = new ImageButton(ResultMapActivity.this);
RelativeLayout.LayoutParams vp = new RelativeLayout.LayoutParams(
LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
x = mapLocArray[i-1].getX();
y = mapLocArray[i-1].getY();
vp.setMargins(x,y,0,0); // [left, top, right, bottom] - in pixels
btnMapLoc.setLayoutParams(vp);
btnMapLoc.setBackgroundColor(Color.TRANSPARENT);
btnMapLoc.requestLayout();
String imgNameNormal = "map_loc_" + mapLocation + "_normal"; //e.g. map_loc_10_normal
int idNormal = getResources().getIdentifier(imgNameNormal,"drawable",getPackageName());
btnMapLoc.setImageResource(idNormal);
rl.addView(btnMapLoc, vp);
...
}
public MapCoordinate[] getMapCoordinates() {
// Convert map coordinates from dpi to pixels
MapCoordinate[] mapLocArray = initMapCoordinates();
// px = dp * (dpi / 160)
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
float dpi = (float) metrics.densityDpi;
float conv = dpi/160;
for (int i = 0;i < mapLocArray.length;i++) {
int x = mapLocArray[i].getX();
int y = mapLocArray[i].getY();
x = (int) (x * conv + 0.5f);
y = (int) (y * conv + 0.5f);
mapLocArray[i].setX(x);
mapLocArray[i].setY(y);
}
return mapLocArray;
}
知道如何才能让它发挥作用吗?
提前致谢。