【问题标题】:How to put views on top of an ImageView, in relation to the ImageView's content size?相对于 ImageView 的内容大小,如何将视图放在 ImageView 之上?
【发布时间】:2017-05-24 23:59:48
【问题描述】:

背景

假设我想使用 ImageView 显示某物的图像,并且我想在其顶部放置新视图(例如,在世界地图图像上显示图钉的动画 ImageView,或者在顶部的 Switch 视图智能手机图像)。

这意味着无论 ImageView 如何显示图像,视图都应该在其中,在正确的位置内,与指定的大小相同,或者与 imageView 本身相关的大小

问题

与其他视图不同,ImageView 可以有一定的大小,但它的内容是另一回事(保持纵横比)。

我尝试了什么

我尝试使用 ConstraintLayout,但这无济于事,因为 ImageView 可以改变它的大小(例如在改变方向时),从而破坏了与 ImageView 相比我给出的视图的位置。

我找到了一些可以处理类似事情的库(比如here),我之前什至问过一个类似的问题(here),但是所有这些解决方案都是针对 ImageView 中的静态图像,但是我搜索的是在 ImageView 之上添加一个视图。

问题

如何正确地将视图放在 ImageView 的内容之上?

与 ImageView 内容的大小相比,如何缩小/放大视图?

可以使用 ConstraintLayout 来根据 ImageView 的大小更改视图的比例吗?

【问题讨论】:

  • 设置Switch的布局参数,它们应该是android.widget.FrameLayout.LayoutParams,你会得到映射从getImageMatrix方法返回的矩阵的值
  • 我对类似的问题一无所知,我只是给了你一个关于如何布局你的Switch 视图的解决方案,所以它总是覆盖你的ImageView 的一部分,不管它有多大和什么scaleType 它使用
  • @pskink 遗憾的是,我不明白如何使用您的解决方案,因为您的解决方案缺少代码,我无法在 Internet 上找到它。
  • 查看android.googlesource.com/platform/frameworks/base/+/refs/heads/…并找到mDrawMatrix的使用位置,它应该解释“ImageMatrix”的用途
  • @pskink 你错了,放 ImageView 的源代码与问题无关。打个比方,如果我问你如何为 RecyclerView 设置适配器,你会给出 RecyclerView 的代码。或者,如果我想问如何在 Linux 上显示当前路径的文件列表,你会给我 linux 的代码(甚至比显示“man ls”还要糟糕)。这种类型的答案很糟糕,人们会称之为拖钓。如果你不知道答案,最好避免这样写。

标签: android imageview


【解决方案1】:

ImageView 周围用wrap_content 制作FrameLayout。然后你可以在ImageView 之上设置SwitchView。您可以将其对齐到中心、侧面或角落,并使用边距来获得一些好的位置。

它仍然不会随图像缩放,但您可以获得相当不错的结果。如果这不适合您,您可以通过编程方式获取 ImageView 的宽度/高度并相应地更改 SwitchView 的位置(或边距)。

【讨论】:

  • 它不会像我写的那样根据ImageView的内容缩放和移动,所以这不是一个好的解决方案。获取高度和宽度将具有相同的结果。我需要根据 ImageView 的内容来设置 Switch 的大小和位置,而不是 ImageView 本身的大小。
【解决方案2】:

你想显示位于 imageview 上的开关吗?

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/ll_download"
    android:layout_width="100dp"
    android:layout_height="60dp"
    android:layout_centerInParent="true"
    android:orientation="vertical">

    <ImageView
        android:src="@android:drawable/btn_star_big_on"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
    <Switch
        android:id="@+id/mySwitch"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="Switch" />
</RelativeLayout>

【讨论】:

  • 请仔细阅读问题。 Switch 应该在顶部,但也与 ImageView 的内容有关。例如,在你的图片中,尽量将开关放在星星的右端,无论星星大小,让开关根据星星的大小改变大小。
【解决方案3】:

您可以通过以下方式根据图像视图宽度管理开关或任何其他视图的宽度

android:layout_alignLeft="@+id/imageView"
android:layout_alignRight="@+id/imageView"

<Switch
    android:id="@+id/swi"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@+id/imageView"
    android:layout_alignRight="@+id/imageView" />

<ImageView
    android:id="@+id/imageView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/swi"
    android:src="@drawable/download" />

【讨论】:

  • 如果这是用于RelativeLayout,这是错误的,因为我询问的是与ImageView显示的内容相比对齐(并可选择调整大小)Switch(和其他视图)(这意味着它取决于ScaleType 和对 ImageView 周围施加的限制),而不仅仅是 ImageView 的边界框。
【解决方案4】:

据我所知,您需要在图像视图中显示的图像大小并将其设置为切换视图的最大宽度,对吗?

为此,您需要 Java 和 XML,

XML 文件基本上与RelativeLayout 一样,并根据需要堆叠视图。

   <RelativeLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">
        <ImageView
            android:src="@drawable/nonet_icon"
            android:id="@+id/iconView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
        <android.support.v7.widget.SwitchCompat
            android:layout_width="wrap_content"
            android:visibility="gone"
            android:layout_centerInParent="true"
            android:layout_height="wrap_content"
            android:id="@+id/switchView"/>
    </RelativeLayout>

Java 代码获取 imageWidth 并将其设置为 SwitchView。

        mSwitchCompat.setVisibility(View.VISIBLE);
//        20% x 25% of Content in ImageView
        final float x = mImageView.getDrawable().getIntrinsicWidth()*.2f;
        final float y = mImageView.getDrawable().getIntrinsicHeight()*.25f;
//        waiting for the view to be drawn
        mSwitchCompat.post(new Runnable() {
            @Override
            public void run() {
//        scale current view W.r.t. x and y values 
             mSwitchCompat.setScaleX((float)mSwitchCompat.getWidth()/x);
                mSwitchCompat.setScaleY((float)mSwitchCompat.getHeight()/y);
            }
        });
        RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
                WindowManager.LayoutParams.WRAP_CONTENT);
//        30% x 35% of content, for location
        int xMargin  = Math.round(mImageView.getDrawable().getIntrinsicWidth()*.3f);
        int yMargin = Math.round(mImageView.getDrawable().getIntrinsicHeight()*.35f);
//      set margin values, can optionally add for top and bottom
        layoutParams.setMargins(xMargin,0,yMargin,0);
        mSwitchCompat.setLayoutParams(layoutParams);

参考:获取 ImageView 的显示图像大小 Trying to get the display size of an image in an ImageView

参考:Dynamic size values

如果您需要详细说明,请发表评论。

例如:Check this image!

图像缩放视图:Scaled View on Image!

【讨论】:

  • 相对于 imageView 的内容,您将视图放在特定位置的 ImageView 顶部的部分在哪里?例如,将视图设置为 imageView 内容大小的 20%x25%,并将其放置在与 imageView 内容相比 30%x35% 的位置。
  • 视图是通过 XML 文件在相对布局中添加的。检查 XML 文件以获取详细信息。就缩放而言:可以根据需要缩放视图:// scaling the viewmSwitchCompat.setScaleX(0.2f);mSwitchCompat.setScaleY(0.25f);int imageWidth = mImageView.getDrawable().getIntrinsicWidth();//Setting it on a customlocationmSwitchCompat.setSwitchMinWidth(Math.round(imageWidth/30));
  • 检查编辑,如果需要相对于主图像的位置,也可以设置自定义边距。
  • 您写的大小与 imageView 的内容无关。这与开关的大小有关。另外,仅根据drawable设置开关的大小是不正确的,因为imageView本身设置了边界,包括ScaleType,宽度,高度,父限制,......所有这些都是为了大小。视图的位置也需要这样做。
  • 这只是缩放视图的一个示例方法。它可以基于 imageView 内容,使用 thr getIntrinsicWidth()getIntrinicHeight() 方法来完成。所以 scaleX 可以是 getIntrinsicWidth()*.2 与 scaleY 类似。至于位置,可以使用以下方式设置自定义边距:RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); layoutParams.setMargins(30% of content,0,35% of content,0);
【解决方案5】:

在 Java 中,

        ImageView imgView = (ImageView) findViewById(R.id.imageView);
        imageView.setBackgroundResource(R.drawable.yourDrawable);
        int width = imgView.getDrawable().getIntrinsicWidth();

        Switch switchKey = (Switch) findViewById(R.id.switchKey);
        switchKey.setMinimumWidth(width);

在 XML 中,将其与 alignLeft 对齐,将 alignRight 与 ImageView 对齐。

【讨论】:

  • 我不明白。相对于 imageView 的内容,您将视图放在特定位置的 ImageView 顶部的部分在哪里?例如,将视图设置为 imageView 内容大小的 20%x25%,并将其放置在与 imageView 内容相比 30%x35% 的位置。
  • 您可以使用RelativeLayout在xml中的imageview顶部添加开关。并且通过上面的JAVA代码,可以根据imageview中设置的图片来设置switch的宽度和大小。
  • 请说明如何操作。根据我尝试过的所有方法,它不起作用(例如,尝试各种 ScaleType)。
【解决方案6】:

您可以使用MarginLayoutParams 和相对布局来设置ImageView 的左侧和顶部位置。

    image = (ImageView) findViewById(R.id.imageID);
    MarginLayoutParams marginParams = new MarginLayoutParams(image.getLayoutParams());
    marginParams.setMargins(left_margin, top_margin, right_margin, bottom_margin);
    RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(marginParams);
    image.setLayoutParams(layoutParams);

在下面的链接中找到完整的信息:

MarginLayoutParams

【讨论】:

    【解决方案7】:

    试试这个,也许对你有帮助。

    <RelativeLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">
    
        <ImageView
            android:id="@+id/img_background"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:scaleType="centerCrop"/>
    
        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@color/semi_transparent"
            android:layout_margin="@dimen/spacing_small"
            android:layout_alignTop="@+id/img_background"
            android:layout_alignBottom="@id/img_background">
    
            //this layout will expand according to your image size
    
        </RelativeLayout>
    
    </RelativeLayout>
    

    【讨论】:

    • 这行不通,因为它没有考虑到imageView的内容是如何显示的。
    猜你喜欢
    • 2011-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多