在安卓系统中如何获取显示的图片的宽度和高度?

12
这个问题可能看起来很琐碎,也被问得很多次,但我找不到适合我的答案。

我有一个ImageViewGLSurfaceView,当我按下按钮时,它们会绘制在ImageView的顶部。

对于我的ImageView,我传递了一个Bitmap并将其缩小,以避免OutOfMemoryError异常。我的ImageView与UI中的其他元素对齐,因此它会拉伸图像以填充宽度/高度(这就是我想要的)。

当我从ImageView切换到GLSurfaceView时,我会得到黑色区域,这些区域曾经在我的ImageView中是透明的,因为GLSurfaceView在UI中开了一个洞,与通常的绘图元素不同,它将我的图像背景画成黑色,而我不需要它,因为我有自定义背景。

我想到了一种解决方案,即以编程方式为GLSurfaceView设置LayoutParams,并使用Bitmap的宽度和高度,但最终我得到的是一个较小的图像。我需要显示的确切宽度和高度 - 不是ImageView,因为它具有透明区域。

PS:我不是OpenGL专家,如果您有适用于OpenGL的解决方案,请共享。

a)

 _______________
|               |
|               |
|---------------|          <-
|   transparent |     
|---------------| <-            Entire
|               |               ImageView
|     Image     |   need
|               | only this
|---------------| <-
|   transparent |
|---------------|          <-
|               |
 ---------------

b)

 _______________
|               |
|               |
|---------------|       <-
|   black       |
|---------------|
|               |              
|    Image      |          GLSurfaceView
|               |
|---------------|
|   black       |
|---------------|       <-
|               |
 ---------------

我的ImageViewGLSurfaceView:

<android.opengl.GLSurfaceView
    android:id="@+id/glsvImageHolder"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_above="@+id/horScrollImage"
    android:layout_marginBottom="5dp"
    android:layout_marginTop="50dp"
    android:visibility="invisible" />
<ImageView
    android:id="@+id/ivImageHolder"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_above="@+id/horScrollImage"
    android:layout_marginBottom="5dp"
    android:layout_marginTop="50dp"
    android:visibility="visible" />

位图本身是否包含顶部和底部的透明区域? - Abhishek V
不,位图不包含透明区域。 - Fedor Tsyganov
1个回答

4
float widthPx = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_MM, 
                                pxToMm(ivImageHolder.getWidth(), context), 
                                getResources().getDisplayMetrics());

float heightPx = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_MM, 
                            pxToMm(ivImageHolder.getHeight(), context), 
                            getResources().getDisplayMetrics());

ViewGroup.LayoutParams layoutParams= glsvImageHolder.getLayoutParams();
layoutParams.width= (int) widthPx;
layoutParams.height= (int) heightPx;

glsvImageHolder.setLayoutParams(layoutParams);

像素转毫米

public static float pxToMm(final float px, final Context context)
{
    final DisplayMetrics dm = context.getResources().getDisplayMetrics();
    return px / TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_MM, 1, dm);
}

使GLSurfaceView的宽度和高度为:wrap_content。

这只是将某物的宽度和高度从任意单位(可能是像素)转换为毫米... - Rafael Lima

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