【问题标题】:Image Mapping On androidandroid上的图像映射
【发布时间】:2016-10-08 05:28:52
【问题描述】:

您好,我正在尝试在图像上制作热点,但问题是屏幕尺寸更改时热点位置也发生了变化

到目前为止我已经做了以下事情

下面是我的布局文件

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
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="myapp.imagemappingdemo.MainActivity">
<FrameLayout
    android:layout_width="7000pt"
    android:layout_height="5000pt">
    <ImageView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:src="@drawable/bolt_int"
        android:text="Hello World!" />
    <RelativeLayout
        android:id="@+id/upperView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@android:color/transparent"
        >
    </RelativeLayout>
</FrameLayout>

我正在使用以下代码来绘制图像。

    screenWidth = this.getResources().getDisplayMetrics().widthPixels;
    ImageView btn = new ImageView(MainActivity.this);
    RelativeLayout.LayoutParams bp = new    RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
    bp.leftMargin = (int) (774.6667 );
    bp.topMargin = (int) (413.25);
    btn.setLayoutParams(bp);
    btn.setImageResource(R.drawable.ic_stat_name);
    btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Toast.makeText(MainActivity.this, "Button Click", Toast.LENGTH_LONG).show();
        }
    });
    upperview.addView(btn, bp);

我试图弄清楚如何使用相同的(X,Y)坐标来计算不同屏幕上的准确位置,谁能帮助我这样做屏幕高度和宽度之间的关系是什么? (X , y) 坐标与屏幕尺寸无关

【问题讨论】:

  • 您应该了解响应式布局,因为在这方面您没有在确切位置获得热点是因为在您切换手机时父尺寸会发生变化。
  • 您想要该热点的确切位置?在 imageview 的中间??
  • 不,任何时候都可以。

标签: android image layout


【解决方案1】:

下面的代码给出了屏幕的高度和宽度,

Display display = getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);
x = size.x; y = size.y;

(x/2,y/2) 这给出了屏幕的中心位置。

U可以设置y的leftmargin和rightmargin,比如:

bp.leftMargin = 10*y/100;
bp.rightMargin = 10*y/100;

这会将您的图像设置为距左右边距 10%。

希望这会有所帮助!您可以根据您的要求进行更改。

【讨论】:

    【解决方案2】:

    如果您的以下代码适用于特定屏幕,

    bp.leftMargin = (int) (774.6667 );
    bp.topMargin = (int) (413.25);
    

    然后根据屏幕高度和宽度更改值,假设它适用于 800 x 480 -

    int standardWidth = 480;
    int standardHeight = 800;
    bp.leftMargin = ((int) (774.6667 ) * dm.widthPixel)/standardWidth;
    bp.topMargin = ((int) (413.25) * dm.heightPixel)/standardHeight;
    

    现在 leftMargin 和 topMargin 将根据屏幕大小进行更新。

    希望对你有帮助:)

    【讨论】:

    • 标准宽度和标准高度是什么意思
    • 标准意味着,对于屏幕 774.6667 , 413.25 工作正常。假设它适用于 1280x800。那么 1280 是标准高度,800 是标准宽度。
    【解决方案3】:

    将热点的 X、Y 更改为图像上的 % 位置 - 例如图像宽度为 100px,访问点 X 为 10,因此 X=0.1。 接下来,获取图像视图的图像矩阵到浮点数组:

    float[] values = new float[9];
    btn.getImageMatrix().getValues(values)
    

    在第二个索引上你有左图像位置,在第 5 个 - 顶部图像位置。然后你就可以得到正确的热点位置:

    float hotspotX = btn.getWidth()*X + values[2];
    float hotspotY = btn.getHeight()*Y + values[5];
    

    【讨论】:

      【解决方案4】:

      您可以做的是让 Imageview Wrap 内容,然后在 java 中首先获取 ImageView 的位置,然后为其添加边距并将其设置为热点视图

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-04-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-19
        相关资源
        最近更新 更多