setImageBitmap()修改预定义的布局

时间:2017-03-17 19:51:24

标签: android android-layout

我在垂直LinearLayout准备了一张相同尺寸的2张图片的布局,因此两者在AS中的尺寸完全相同。

布局如下:

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <FrameLayout
        android:id="@+id/frame_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <ImageView
            android:id="@+id/partner_background"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:scaleType="fitXY"
            android:src="@drawable/fake_background" />

        <LinearLayout
            android:id="@+id/partner_layout"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical"
            >

            <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:padding="0dp">

                <ImageView
                    android:id="@+id/imageGuide"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center_horizontal"
                    android:contentDescription="@string/logo_Site"
                    android:scaleType="centerInside"
                    android:src="@drawable/my_logo"
                    android:layout_alignParentTop="true"
                    android:layout_centerHorizontal="true" />

            </RelativeLayout>

            <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                android:id="@+id/partner_container"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:padding="0dp"
                >

                <ImageView
                    android:id="@+id/partner_logo"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_alignParentTop="true"
                    android:layout_centerHorizontal="true"
                    android:layout_gravity="center_horizontal"
                    android:contentDescription="@string/logo_Site"
                    android:scaleType="centerInside"
                    android:src="@drawable/my_logo" />

            </RelativeLayout>
        </LinearLayout>
    </FrameLayout>

    <ListView android:id="@+id/left_drawer"
        android:layout_width="300dp"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:choiceMode="singleChoice"
        android:divider="@android:color/white"
        android:dividerHeight="1dp"
        android:background="#F2F2F2"/>

    <ListView android:id="@+id/right_drawer"
        android:layout_width="300dp"
        android:layout_height="match_parent"
        android:layout_gravity="end"
        android:choiceMode="singleChoice"
        android:divider="@android:color/white"
        android:dividerHeight="1dp"
        android:background="#F2F2F2"/>

</android.support.v4.widget.DrawerLayout>

RelativeLayout在这里,因为我将有其他一些对象。

enter image description here

如果我在我的设备上执行它,一切正常,我得到完全相同的渲染。

但是现在,我想用从我的服务器下载的徽标来更改底部徽标。

我下载完全相同的图像,然后,我将其设置为:

ImageView partnerLogo = (ImageView) findViewById(R.id.partner_logo);

file = new File(getApplicationContext().getFilesDir(), "/partner/partnerLogo.png");
uri = Uri.fromFile(file);

bitmap = null;
try {
    bitmap = MediaStore.Images.Media.getBitmap(getApplicationContext().getContentResolver(), uri);
} catch (IOException e) {
    e.printStackTrace();
}

if (bitmap != null) {
    partnerLogo.setImageBitmap(bitmap);
}

当我在调试器中查看bitmap时,图像是预期的512x512。

但结果就是那个:

enter image description here

你能告诉我为什么要修改布局吗?

修改

我做了一些测试,尝试以编程方式设置两个图像,我发现使用:

try {
    bitmap = MediaStore.Images.Media.getBitmap(getApplicationContext().getContentResolver(), uri);
} catch (IOException e) {
    e.printStackTrace();
}

if (bitmap != null) {
    partnerLogo.setImageBitmap(bitmap);
}

将图像设置为小于使用:

partnerLogo.setImageDrawable(getResources().getDrawable(R.drawable.my_logo));

但两张图片都是完全一样的PNG图像!?!

所以我认为问题来自setImageBimap(),而不是来自布局。

编辑2 根据许多关于类似问题的帖子,似乎Android需要一个drawable才能根据需要进行扩展。 这将证实我在第一次编辑中给出的实验。

所以我试过了:

ImageView partnerLogo = (ImageView) findViewById(R.id.partner_logo);

file = new File(getApplicationContext().getFilesDir(), "/partner/partnerLogo.png");
uri = Uri.fromFile(file);

BitmapDrawable drawable = null;
try {
    bitmap = MediaStore.Images.Media.getBitmap(getApplicationContext().getContentResolver(), uri);
    if (bitmap != null) {
        drawable = new BitmapDrawable(getResources(), bitmap);
    }
} catch (IOException e) {
    e.printStackTrace();
}

if (bitmap != null) {
    partnerLogo.setImageDrawable(drawable);
}

但这不会更好!?!

5 个答案:

答案 0 :(得分:0)

在LinearLayout上的布局上添加android:weightSum="2"

在包含ImageView的两个RelativeLayout上将android:layout_height="wrap_content"更改为android:layout_height="0dp"

但那些RelativeLayout是多余的你可以删除它并放在ImageView的

android:layout_height="0dp"
android:layout_weight="1"

这确保了垂直空间将在两个图像之间划分

答案 1 :(得分:0)

刚修改相关代码。添加并检查。 修改如:

  • 将weightSum添加到LinearLayout
  • 给予LinearLayout的直接孩子同等重量

修改了LinearLayout(partner_layout)。 这只是XML文件的修改部分。

    <LinearLayout
        android:id="@+id/partner_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
          android:weightSum="1"
        android:orientation="vertical">

        <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="0.5"
            android:padding="0dp">

            <ImageView
                android:id="@+id/imageGuide"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_gravity="center_horizontal"
                android:contentDescription="@string/logo_Site"
                android:scaleType="centerInside"
                android:src="@drawable/my_logo"
                android:layout_alignParentTop="true"
                android:layout_centerHorizontal="true" />

        </RelativeLayout>

        <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:id="@+id/partner_container"
            android:layout_width="match_parent"
              android:layout_height="0dp"
            android:layout_weight="0.5"
            android:padding="0dp">

            <ImageView
                android:id="@+id/partner_logo"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_alignParentTop="true"
                android:layout_centerHorizontal="true"
                android:layout_gravity="center_horizontal"
                android:contentDescription="@string/logo_Site"
                android:scaleType="centerInside"
                android:src="@drawable/my_logo" />

        </RelativeLayout>
    </LinearLayout 

答案 2 :(得分:0)

我们的第一个目标应该是如何解决问题。它似乎可以通过你的xml布局来处理。

因此,在我的建议中,如果您使用相对布局,请尝试修复imageView的宽度和高度。

其他明智的尝试其他布局,如tableLayout,frameLayout或gridLyout,并尝试使用各种可用选项(match_parents / wrap_content等或尝试使用修复大小)更改imageview的宽度和高度。还添加

机器人:scaleType = “fitXY”

希望这能解决您的问题。

答案 3 :(得分:0)

当您从Drawable设置图像时,Android系统会根据可用的宽度和高度自动调整该图像的大小,但是当您使用setImageBitmap()方法设置任何图像时,它不会调整大小并显示实际图像。

  

虽然系统执行缩放和调整大小以使您的   应用程序在不同的屏幕上工作,你应该努力   针对不同的屏幕尺寸和密度优化您的应用。在   这样做,您可以最大化所有设备和您的用户体验   用户认为您的应用程序实际上是为他们设计的   设备 - 而不是简单地拉伸以适应他们的屏幕   设备

在以下链接中找到您的解决方案以及有关ImagesBitmap scalingresizingdrawables的更多详情:

How to stop Android form automatically scaling drawables?

Supporting Multiple Screens

答案 4 :(得分:-2)

因此,我找到的唯一解决方案是根据使用虚假图像构建的布局手动缩放图像。 而代码是基于很久以前在SO中找到的那个安静的代码:

final ImageView myLogo = (ImageView) findViewById(R.id.image_logo);

bitmap = BitmapFactory.decodeResource(getApplicationContext().getResources(), R.drawable.my_logo_512x512);
final ImageView partnerLogo = (ImageView) findViewById(R.id.partner_logo);

file = new File(getApplicationContext().getFilesDir(), "/partner/partnerLogo.png");
uri = Uri.fromFile(file);

try {
    bitmap2 = MediaStore.Images.Media.getBitmap(getApplicationContext().getContentResolver(), uri);
} catch (IOException e) {
    e.printStackTrace();
}

if (bitmap != null) {

    ViewTreeObserver vto = myLogo.getViewTreeObserver();
    vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
        public boolean onPreDraw() {
            myLogo.getViewTreeObserver().removeOnPreDrawListener(this);
            finalHeight = myLogo.getMeasuredHeight();
            finalWidth = myLogo.getMeasuredWidth();
            pictureWidth = bitmap.getWidth();
            pictureHeight = bitmap.getHeight();
            float ratioImage = (float)pictureWidth / (float)pictureHeight;
            float ratioView = (float)finalWidth / (float)finalHeight;

            if (ratioView > ratioImage)  {  // finalHeight is the limit
                finalWidth = (int)((float)pictureWidth * ((float) finalHeight / (float) pictureHeight));
            } else {    // finalWidth is the limit
                finalHeight = (int)((float)pictureHeight * ((float) finalWidth / (float) pictureWidth));
            }

            bitmap = Bitmap.createScaledBitmap(bitmap, finalWidth, finalHeight, false);
            myLogo.setImageBitmap(bitmap);

            if (bitmap2 != null) {
                bitmap2 = Bitmap.createScaledBitmap(bitmap2, finalWidth, finalHeight, false);
                partnerLogo.setImageBitmap(bitmap2);
            }
            return true;
        }
    });

}

我看到一个漫画低估了我的问题,我希望下次他会激励它。