如何在资源描述的布局中以编程方式居中图像

时间:2014-07-30 16:27:18

标签: android android-layout

首先让我介绍一下,我是Android和移动设备编程的新手,我之前曾在QNX上运行的嵌入式系统上工作过。 我希望我会尊重这个似乎非常严格的论坛的规则; - )。

我正在写一个应用程序,我在其中声明了一个欢迎屏幕的布局,其中包括图像视图。 在xml文件中的此图像视图中放置了第一个图像,但稍后我将在应用程序代码中将其替换为另一个图像,并且第二个图像可能具有不同的大小。

我的问题是调整第二张图片的大小并居中。根据我的测试,通过使用Lint中的资源它是非常自动的,但是程序看起来并不那么明显,即使我在文档中读到它应该是相似的。 在阅读了几个关于这个主题的帖子后,我终于有了疑问;我可以将图像置于ImageView中心,还是必须将ImageView置于可用空间中心? 我尝试了第一个解决方案但没有成功。

所以我的布局是:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/fragmentInit"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.cabbonline.ndguidelt.MainActivity" >

    <TextView
        android:id="@+id/textViewAppName"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_above="@+id/textViewAppVersion"
        android:layout_centerHorizontal="true"
        android:text="@string/app_name" />

    <TextView
        android:id="@+id/textViewAppVersion"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_above="@+id/TextViewDevelopCabb"
        android:layout_centerHorizontal="true"
        android:text="@string/app_version" />

    <TextView
        android:id="@+id/TextViewDevelopCabb"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_above="@+id/imagecaBB"
        android:layout_centerHorizontal="true"
        android:text="@string/develop_cabb" />

    <ImageView
        android:id="@+id/imagecaBB"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_above="@+id/textViewCabbUrl"
        android:layout_centerHorizontal="true"
        android:contentDescription="@string/logo_caBB"
        android:maxHeight="150dp"
        android:src="@drawable/logo_cabb_100x51_or" />

    <TextView
        android:id="@+id/textViewCabbUrl"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:text="@string/cabb_url" />

    <ImageView
        android:id="@+id/imageSite"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_above="@+id/textViewAppName"
        android:contentDescription="@string/logo_Site"
        android:scaleType="centerInside"
        android:src="@drawable/image_guide_320x400" />

</RelativeLayout>

在这里我可以说&#34; imageSite&#34; ImageView显示良好,居中并占据整个区域。右。

现在我有一段代码在同一个ImageView中替换这个图像:

                Bitmap imageSite = site.getSitePictureBitmap();
                if (imageSite != null) {
                    imageGuide.setImageBitmap(imageSite);
                } 

如果我只这样做,尽管en center_inside标志,新的位图,较小和矩形水平比较第一个几乎是sqaure,图像显示在ImageView的右下角非常小,或该区域由ImageView拍摄,Idon真的不知道。

所以我添加这段代码来调整它的大小:

                imageSite = site.getSitePictureBitmap(); // here I read the bitmap in a file.
                if (imageSite != null) {
                    float maxWidth = imageGuide.getWidth();
                    float maxHeight = imageGuide.getHeight();
                    float width = imageSite.getWidth();
                    float height= imageSite.getHeight();
                    float hRatio = width / maxWidth;
                    float vRatio = height / maxHeight;

                    if (Math.abs(1 - hRatio) < Math.abs(1 - vRatio)) {
                        // We match horizontal available size
                        width = width / hRatio;
                        height = height / hRatio;
                    } else {
                        width = width / vRatio;
                        height = height / vRatio;
                    }

                    Bitmap reSizedBitmap = Bitmap.createScaledBitmap(imageSite, (int)width, (int)height, true);
                    imageGuide.setImageBitmap(reSizedBitmap);

因此图像现在具有良好的宽度,但由于其垂直尺寸低于第一张图片,因此它接近textViewAppName。因此,作为布局描述中ImageView的规则,我想知道我的图像实际上是不在ImageView的中心,而我的问题来自于ImageView现在的高度较小而且不是#39; t填满布局顶部的整个空间。

我还想知道设置新图像是否不会重置定位标记。我没有在AFAIR文件中看到这一点,但...... 所以我在setImagebitmap()之后添加了这一行而没有成功:

                    imageGuide.setScaleType(ScaleType.CENTER_INSIDE);

在这种情况下,您能告诉我更多关于ImageView行为的信息,以及如何在可用空间的中心垂直放置我的图像。我必须计算填充吗?

此致 人

0 个答案:

没有答案