web-dev-qa-db-ja.com

Android画像ダイアログ/ポップアップ画像と同じサイズで境界線なし

現在、私はファイルブラウザに取り組んでいます。 1つの例外を除いて、すべてが正常に機能します。ユーザーが画像(jpg、png、bmp、..)をクリックした場合、画像をダイアログまたは画像と同じサイズのポップアップに表示する必要があります。国境はまったくありません。画像ファイルはSDカードにあります。

これが私がこれまでに持っているものです:

BitmapDrawable bitmap = new BitmapDrawable(context.getResources(), TARGET_PATH);

AlertDialog.Builder imageDialog = new AlertDialog.Builder(context);
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

View layout = inflater.inflate(R.layout.thumbnail, null);
ImageView image = (ImageView) layout.findViewById(R.id.thumbnail_IMAGEVIEW);
image.setImageDrawable(bitmap);
imageDialog.setView(layout);
imageDialog.create();
imageDialog.show();

XMLファイル:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent" >

    <ImageView
        Android:id="@+id/thumbnail_IMAGEVIEW"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_alignParentLeft="true"
        Android:layout_alignParentTop="true"
        Android:contentDescription="@string/icon_DESCRIPTION" />

</RelativeLayout>

これが出力です:

Fail Output

画像の端に醜い境界線があります-私はそれらを表示したくありません。グーグルなどにリストされているものや例をたくさん試しました。まだ何も機能しませんでした。

最良のオプションは、画像の背後にあるダイアログ/ビューを画像と同じサイズにすることです。別の方法は、画像の背後にある背景を透明に設定することです。

どうすれば解決策を達成できますか?背景を画像と同じサイズにしたいので、「見えない」ものは残りませんが、透明オプションでも問題ありません。


解決策:

// Get screen size
Display display = context.getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);
int screenWidth = size.x;
int screenHeight = size.y;

// Get target image size
Bitmap bitmap = BitmapFactory.decodeFile(TARGET);
int bitmapHeight = bitmap.getHeight();
int bitmapWidth = bitmap.getWidth();

// Scale the image down to fit perfectly into the screen
// The value (250 in this case) must be adjusted for phone/tables displays
while(bitmapHeight > (screenHeight - 250) || bitmapWidth > (screenWidth - 250)) {
    bitmapHeight = bitmapHeight / 2;
    bitmapWidth = bitmapWidth / 2;
}

// Create resized bitmap image
BitmapDrawable resizedBitmap = new BitmapDrawable(context.getResources(), Bitmap.createScaledBitmap(bitmap, bitmapWidth, bitmapHeight, false));

// Create dialog
Dialog dialog = new Dialog(context);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setContentView(R.layout.thumbnail);

ImageView image = (ImageView) dialog.findViewById(R.id.imageview);

// !!! Do here setBackground() instead of setImageDrawable() !!! //
image.setBackground(resizedBitmap);

// Without this line there is a very small border around the image (1px)
// In my opinion it looks much better without it, so the choice is up to you.
dialog.getWindow().setBackgroundDrawable(null);

// Show the dialog
dialog.show();

XMLファイル:

<?xml version="1.0" encoding="utf-8"?>
<ImageView xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:id="@+id/imageview"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent" >

</ImageView>

最終出力:

Output

21
rekt0x

画像を表示するためのカスタムダイアログを作成したり、ダイアログのsetcontentviewで膨らませるためのレイアウトを作成したり、幅と高さのラップコンテンツを含む1つの線形レイアウトを作成したり、scaleプロパティfitxyを使用してimageviewを作成したりできます。

1
ss_android

これからImageViewを変更します。

<ImageView
        Android:id="@+id/thumbnail_IMAGEVIEW"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_alignParentLeft="true"
        Android:layout_alignParentTop="true"
        Android:contentDescription="@string/icon_DESCRIPTION" />

これに:

<ImageView
        Android:id="@+id/thumbnail_IMAGEVIEW"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_alignParentLeft="true"
        Android:layout_alignParentTop="true"
        Android:adjustViewBounds="true" <!-- Here is the thing -->
        Android:contentDescription="@string/icon_DESCRIPTION" />

お役に立てれば。

1
user2652394

ImageViewでsetTypeを設定してみましたか?

<ImageView ... Android:scaleType="fitXY" ... />

0
Twin Edo

画像ビューの初期化の下に1行のコードをアクティビティに追加すると、問題が解決します。

image.setScaleType(ImageView.ScaleType.FIT_XY); 
0
Nazmus Saadat

相対レイアウトではなく親としてFrameLayoutを使用し、wrap_contentと0マージンに設定します。

試してください:

<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:paddingLeft="@dimen/activity_horizontal_margin"
Android:paddingRight="@dimen/activity_horizontal_margin"
Android:paddingTop="@dimen/activity_vertical_margin"
Android:paddingBottom="@dimen/activity_vertical_margin"
tools:context=".MainActivity"
Android:background="@color/background">

<FrameLayout
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:id="@+id/frameLayout"
        Android:background="#b2ff7c">

    <ImageView
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:id="@+id/imageView"
            Android:src="@drawable/ic_launcher"/>
</FrameLayout>

</RelativeLayout>

結果は、ImageViewと同じサイズの背景になります。

これが機能する場合。カスタムテーマでこれを変更してみてください。

    <style name="Widget.ImageWell">
    <item name="Android:background">@Android:drawable/panel_picture_frame_background</item>
    </style>
0
TheDudeAbides