如何将ImageButtons的固定位置缩放到ImageView以支持多显示器?

时间:2012-05-11 23:59:03

标签: android android-layout imagebutton android-imageview

我正在使用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;
}

知道如何才能让它发挥作用吗?

提前致谢。

0 个答案:

没有答案