在ImageView中使用gravity定位图像:顶部

49
      ╔════════════════════════════════════════════════════════╗
      ║               Linear Layout  (Center)                  ║
      ║    ╔══════════════════════════════════════════════╗    ║   
      ║    ║ ImageView    ╔══════════════╗                ║    ║
      ║    ║              ║              ║    (Center)    ║    ║
      ║    ║              ║ Actual image ║                ║    ║
      ║    ║              ║              ║                ║    ║
      ║    ║              ║  (Center)    ║                ║    ║
      ║    ║              ║              ║                ║    ║
      ║    ║              ╚══════════════╝                ║    ║
      ║    ╚══════════════════════════════════════════════╝    ║ 
      ║                                                        ║
      ╚════════════════════════════════════════════════════════╝

我想要做到这一点:

      ╔════════════════════════════════════════════════════════╗
      ║               Linear Layout  (Center)                  ║
      ║    ╔══════════════════════════════════════════════╗    ║   
      ║    ║ ImageView    ║              ║                ║    ║
      ║    ║              ║              ║    (Center)    ║    ║
      ║    ║              ║ Actual image ║                ║    ║
      ║    ║              ║              ║                ║    ║
      ║    ║              ║  (Top)       ║                ║    ║
      ║    ║              ║              ║                ║    ║
      ║    ║              ╚══════════════╝                ║    ║
      ║    ╚══════════════════════════════════════════════╝    ║ 
      ║                                                        ║
      ╚════════════════════════════════════════════════════════╝
请注意:ImageView 在 LinearLayout 中的重力是居中的。
我希望在 ImageView 中的图片重力为顶部,我尝试设置 gravity:top,但没有任何变化。帮帮我。
编辑:这是我的 XML。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="fill_parent"
    android:layout_height="fill_parent" android:background="@color/all_white">
    <LinearLayout android:id="@+id/title_bar" style="@style/TitleBar">
        <TextView android:layout_width="wrap_content" 
            android:id="@+id/tv_printweb"
            android:singleLine="true" 
            android:ellipsize="end" 
            style="@style/ScreenTitleText" />
    </LinearLayout>
    <RelativeLayout android:orientation="vertical"
        android:layout_width="fill_parent" 
        android:layout_height="fill_parent"
        android:layout_below="@+id/tv_web_filename" 
        android:layout_above="@+id/tv_web_page_num"
        android:layout_weight="1" 
        android:background="@color/background">
        <LinearLayout android:id="@+id/ln_web_pre"
            android:layout_width="30dp" 
            android:layout_height="fill_parent"
            android:layout_alignParentLeft="true" 
            android:gravity="center">
            <Button android:id="@+id/btn_web_pre" 
                android:layout_width="40dp"
                android:layout_height="120dp" 
                android:background="@drawable/bt_left"
                />
        </LinearLayout>
        <LinearLayout android:id="@+id/ln_web_zoomview"
            android:layout_width="fill_parent" 
            android:layout_height="fill_parent"
            android:background="@color/all_white" 
            android:orientation="vertical"
            android:gravity="center" 
            android:layout_centerInParent="true">
            <ImageView android:id="@+id/web_zoomview"
                android:layout_width="fill_parent" 
                android:layout_height="wrap_content"
                android:background="@color/all_white" 
                android:layout_gravity="top"
                />

        </LinearLayout>
        <LinearLayout android:id="@+id/llCircle"
                android:layout_height="fill_parent" 
                android:layout_width="fill_parent"
                android:layout_marginRight="40dp" 
                android:layout_marginLeft="40dp" 
                android:layout_marginBottom="25dp" 
                android:layout_marginTop="25dp">
        </LinearLayout>
        <LinearLayout android:id="@+id/ln_web_next"
            android:layout_width="30dp" 
            android:layout_height="fill_parent"
            android:layout_alignParentRight="true" 
            android:gravity="center">
            <Button android:id="@+id/btn_web_next" 
                android:layout_width="40dp"
                android:layout_height="120dp" 
                android:background="@drawable/bt_right_1"
                />
        </LinearLayout>
        <RelativeLayout android:id="@+id/pagebar_web_top"
            android:layout_width="fill_parent" 
            android:layout_height="30dp"
            android:layout_alignParentTop="true" 
            android:gravity="center_vertical"
            android:paddingLeft="10dip" 
            android:paddingRight="10dip">
            <TextView android:id="@+id/tv_web_page_size"
                android:layout_width="wrap_content" 
                android:layout_height="wrap_content"
                android:layout_alignParentRight="true" 
                android:gravity="center"
                android:text="Paper Size" 
                android:textColor="@color/all_black"
                android:textStyle="bold" 
                android:background="@drawable/paper_border" />
        </RelativeLayout>

        <RelativeLayout android:id="@+id/web_pagebar"
            android:layout_width="fill_parent" 
            android:layout_height="50dp"
            android:layout_alignParentBottom="true" 
            android:gravity="left"
            android:paddingLeft="10dip" 
            android:paddingRight="10dip">
            <TextView android:id="@+id/tv_page_num"
                android:layout_width="wrap_content" 
                android:layout_height="wrap_content"
                android:layout_centerVertical="true" 
                android:gravity="center"
                android:text="1/1" 
                android:textColor="@color/all_black"
                android:textStyle="bold" 
                android:background="@drawable/paper_border" />
            <Button android:id="@+id/btn_web_orientation"
                android:layout_width="50dp" 
                android:layout_height="50dp"
                android:layout_alignParentRight="true" 
                android:background="@drawable/rotate_l" />
        </RelativeLayout>

    </RelativeLayout>
    <LinearLayout android:gravity="right|center_horizontal"
        android:id="@+id/toolbar" 
        style="@style/FunctionBar">
        <Button android:layout_width="wrap_content"
            android:layout_height="wrap_content" 
            android:id="@+id/btn_web_print"
            style="@style/FunctionButton" 
            android:text="@string/str_print" />
    </LinearLayout>
</LinearLayout>

这个 https://dev59.com/emsz5IYBdhLWcg3w0rZC 对我回答了问题。 - John
我在这里放了一个答案(https://dev59.com/6W025IYBdhLWcg3wST2Q#33039444)。它帮助我将ImageView居中。 - Sindri Þór
5个回答

120

在您的XML中将scaleType设置为fitStart

<ImageView
    android:id="@+id/ivMap"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:scaleType="fitStart" >
</ImageView>

2
谢谢。我正在玩重力,但没有输出,scaleType是我正在寻找的东西。 - Sai
2
这不会将图像居中。 - Dog Lover
虽然在动画时fitCenter可能是唯一需要使用的,但人们仍然希望使用它。 - juztcode

6
你可以使用ImageView.ScaleType.MATRIX并使用ImageView.setImageMatrix()设置图像矩阵。可以使用Matrix.setRectToRect()方法获取矩阵。

6
请检查Terel的答案,据说是正确答案。
根据布局中还有什么其他内容,一个解决方案可能是使用另一个布局(即相当轻的FrameLayout)来替换ImageView,并将ImageView放在实际图像的位置,并使其android:layout_gravity =“top”。

我使用线性布局。我尝试了你所有的评论,但我只能改变ImageView的位置,而不能改变ImageView内部的图像。 - Nam Vu
1
@ZuzooVn:在ImageView中移动图像的唯一方法是使用android:scaleType,而唯一能让您做到想要的设置是android:scaleType="matrix",并且需要一个矩阵来将图像水平居中。由于这非常复杂,我建议重新考虑您的布局。(请参见我的建议) - bigstones

3
你尝试过使用属性android:gravity = "top"吗? 我看到你的ImageView正在使用android:layout_gravity,也许你可以尝试使用另一个属性。 据我所知,"android:layout_gravity" 属性用于设置元素在其父级中的重力,而 "android:gravity" 属性用于设置元素内容的重力。(如果我错了,请有人纠正一下!=P 嘿嘿!)

1

使用RelativeLayout不是更容易吗?通过设置android:layout_alignParentTop="true"android:layout_centerHorizontal="true",您可以实现所需的效果。


我必须使用线性布局。请查看我在帖子中的XML。 - Nam Vu
你为什么要将每个视图封装在单独的布局中?我看不出有必要... - Mokus
我在我的代码中使用它。它让我更容易在我的应用程序中显示许多东西。 - Nam Vu
你尝试过使用android:layout_gravity="top|center"吗? - Mokus
我找到了两个解决方案,如果你想保持当前的结构。要么将LinearLayout android:layout_height设置为wrap_content,要么将LinearLayout的gravity设置为top。 - Mokus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接