当前位置: 首页 > 知识库问答 >
问题:

将视图放置在缩放图像视图的指定点上

赖绪
2023-03-14

我有一个无法解决的问题...

我有一个自定义的imageview,它会根据更大的尺寸改变大小——包含该视图的布局的宽度或高度。它的工作方式总是适合布局。

public class AspectRatioImageView extends ImageView {

    public AspectRatioImageView(Context context) {
        super(context);
    }

    public AspectRatioImageView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public AspectRatioImageView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        if (getDrawable() == null) {
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        } else {
            int height = MeasureSpec.getSize(heightMeasureSpec);
            int width = MeasureSpec.getSize(widthMeasureSpec);

            if (width > height) {           
                width = height * getDrawable().getIntrinsicWidth() / getDrawable().getIntrinsicHeight();
            } else
                height = width * getDrawable().getIntrinsicWidth() / getDrawable().getIntrinsicHeight();

            setMeasuredDimension(width, height);
        }
    }

    @Override
    protected void onDetachedFromWindow() {
        setImageDrawable(null);

        super.onDetachedFromWindow();
    }
}

它的布局是这样的:

<RelativeLayout
    android:id="@+id/layMap"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_below="@+id/mFlipper"
    android:layout_above="@+id/layControl" >

    <com.mobiler.pogodynka.controls.AspectRatioImageView
        android:id="@+id/map"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:scaleType="fitXY"
        android:src="@drawable/ostrzezenia_hydro"/>

    <RelativeLayout
        android:id="@+id/layMapOverlay"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignTop="@+id/map"
        android:layout_alignBottom="@+id/map"
        android:layout_alignLeft="@+id/map"
        android:layout_alignRight="@+id/map"/>

</RelativeLayout>

我正在努力实现的是,我有尺寸为1000x1000px的原始地图。在这张地图上,我有一些点。我必须在Android上显示这张地图,并在与原始地图相同的点上添加其他视图。

所以举个例子:

>

  • 原始地图为1000x1000px
  • 我用这个得到屏幕宽度:

    public int getScreenWidth(){DisplayMetrics DisplayMetrics=new DisplayMetrics();getWindowManager().getDefaultDisplay().getMetrics(DisplayMetrics);int wt=DisplayMetrics.widthPixels;返回wt;}

    即在Nexus 4上我有800像素

    不幸的是问题来了首先,我的原始位置是点的中心,但对于视图,我只能设置顶部和左侧偏移。如果我减去它的一半大小,我会得到我的观点的新中心点。-其次是密度。。。我到底该如何在不同的屏幕上定位这个东西?我想知道这是否有效:

    public int getPositionX(int imageWidth) {
        Resources resources = getResources();
        DisplayMetrics metrics = resources.getDisplayMetrics();
        int position = (int) ((imageWidth * (X - metrics.density * 20)) / 1000);
        return position;
    }
    

    我已经在NExus 4和7上检查过了,可以正常工作了。但在其他设备上——不是,新的点放错了地方。。。这个“20”是什么我不确定。我最初认为应该有一半的图像大小,但不是-如果我把“18”,那么它将是错误的对齐。。。

    这是它看起来的样子:-它应该看起来怎么样-http://imageshack.com/a/img560/9417/6mz8.png-它不应该看起来怎么样-http://imageshack.com/a/img24/2822/2u6p.png

    有人能帮我解决这个问题吗?

  • 共有1个答案

    宗政海
    2023-03-14

    我设法做到了。看来我的方法不错。

    要通过适当的像素值来抵消ImageView,我只需要将其宽度/高度的一半(以获得中心)相乘,并从原始缩放位置减去它。

    DisplayMetrics metrics = getResources().getDisplayMetrics();
    final int offset = (int) (36/2 * metrics.density);
    

    然后设置正确的偏移量:

    RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(
    RelativeLayout.LayoutParams.WRAP_CONTENT,
    RelativeLayout.LayoutParams.WRAP_CONTENT);
    params.setMargins(marker.getPositionX(mMap.getWidth()) - offset,
    marker.getPositionY(mMap.getHeight()) - offset, 0, 0);          
    point.setLayoutParams(params);
    

    其中getPosition根据1000px映射将位置缩放到实际设备大小:

    public int getPositionX(int imageWidth) {
        int position = (int) ((imageWidth * X) / 1000);
        return position;
    }
    
     类似资料:
    • 我对图像进行了收缩缩放,但是当我第一次加载应用程序时,整个图像不可见,只有一部分。图像填充了屏幕的宽度,但其上下都有空白。此外,当缩放图像时,图像变得非常短。纵横比应保持不变。 我希望在应用程序加载时使整个图像可见,然后我希望能够用两根手指缩小图像,其中图像不会小于屏幕的大小,以便屏幕始终充满(图像是地图)。 为了放大,图像应该超出手机屏幕的宽度和高度。这样我就可以平移过去查看地图的细节。 任何帮

    • 在用图像创建mp4幻灯片时,我在网上为zoompan提供了一些示例,但我仍然没有完全掌握如何使它们从图像中的某个位置开始。下面是典型的命令: ffmpeg-i image-000。jpg-filter_complex“color=c=black:r=60:s=1920x1080[demo];[0:v]格式=pix_fmts=yuva420p,比例=8000:-1,zoompan=z='min(zo

    • 我在RShiny中的中有一个地图,其中绘制了标记,一旦我单击一个标记,它就会在地图上添加圆圈,显示所有与标记相关的点。 我想做的是设置地图的缩放/视图,使所有相关的圆圈都可见。 标记的圈数因标记而异,有些标记有1或2个圈,而有些标记有更多圈。此外,圆圈的位置在美国各地不同,所以它们可以放在一个城市或另一个州。 map=带标记的原始映射Df=lng图中所选标记相关性质的圆的lng 我想设置缩放级别,

    • 问题内容: 改变的大小的图像在GWT部件改变所述图像元素的大小,但不重新调整屏幕上的图像。因此,以下操作将无效: 这是因为GWT 通过使用CSS 将HTML 元素的设置为图像来实现其Image小部件。 如何获得要调整尺寸的实际图像? 问题答案: 我看到了此博客条目,该条目通过使用GWT DataResource而不是ImageResource解决了问题。事实证明,如果您按以下方式使用它,则Imag

    • 以下是CardView的XML代码: 我尝试对ImageView(和LinearLayout)的属性使用wrap_content,并尝试包含属性android: caleType="fitXY",但它没有帮助,似乎没有任何效果。 谁能帮我一下吗?我非常感谢您的每一句评论,也非常感谢您的帮助。