Programing

배경 드로어 블에서 종횡비를 유지하면서 이미지 크기 조정

lottogame 2020. 12. 12. 09:55
반응형

배경 드로어 블에서 종횡비를 유지하면서 이미지 크기 조정


배경 이미지를 뷰에 맞지만 <bitmap />배경 드로어 블 XML로 사용할 때 종횡비를 유지하려면 어떻게해야 합니까? 중 어느 것도 <bitmap>android:gravity값은 원하는 효과를 제공하지 않는다.


xml 파일 내에서만 조작 배경 속성을 달성하는 것은 불가능합니다. 두 가지 옵션이 있습니다.

  1. 프로그래밍 방식으로 비트 맵을 자르거나 크기를 조정하고 Bitmap.createScaledBitmap(Bitmap src, int dstWidth, int dstHeight, boolean filter)일부 View배경 으로 설정합니다 .

  2. ImageView배경 대신 사용 하여 첫 번째 레이아웃의 요소로 배치하고 android:scaleType속성을 지정 합니다.

    <RelativeLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" >
    
        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
    
            android:src="@drawable/backgrnd"
            android:scaleType="centerCrop" />
    
        ...
    
        rest layout components here
    
        ...
    
    </RelativeLayout>
    

드로어 블에서이 작업을 수행하는 쉬운 방법이 있습니다.

your_drawable.xml

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >

    <item android:drawable="@color/bg_color"/>
    <item>
        <bitmap
            android:gravity="center|bottom|clip_vertical"
            android:src="@drawable/your_image" />
    </item>

</layer-list>

유일한 단점은 공간이 충분하지 않으면 이미지가 완전히 표시되지 않지만 잘려서 드로어 블에서 직접이 작업을 수행하는 방법을 찾을 수 없다는 것입니다. 그러나 테스트에서 나는 꽤 잘 작동하고 이미지의 많은 부분을 클리핑하지 않습니다. 중력 옵션으로 더 많이 플레이 할 수 있습니다.

또 다른 방법은 당신이를 사용하는 것 레이아웃을 생성하는 것 ImageView하고 설정 scaleType하는 방법에 대해 fitCenter.

이 정보가 원하는 것을 달성하는 데 도움이되기를 바랍니다.


또 다른 접근 방식은 일반 이미지패치 9 이미지 를 만들고 원하는 방식으로 확장하는 것입니다.

비율을 확실히 유지할 수 있도록 모서리에 9 개의 패치 도트를 배치하여 콘텐츠를 중앙에 배치 할 수 있습니다 (이미지의 가장 바깥 쪽 가장자리가 반복 가능 / 투명하다고 가정).

바라건대 당신은 아이디어를 얻었습니다.


사용자 정의 Drawable 클래스에서 비슷한 작업을하고 싶었습니다. 다음은 중요한 부분입니다.

public class CustomBackgroundDrawable extends Drawable
{
    private Rect mTempRect = new Rect();
    private Paint mBitmapPaint = new Paint(Paint.ANTI_ALIAS_FLAG);

    ...

public void draw(@NonNull Canvas canvas)
{
    Rect bounds = getBounds();
    if (mBitmap != null ) {
        if (mScaleType == ScaleType.SCALE_FILL) {
            //bitmap scales to fill the whole bounds area (bitmap can be cropped)
            if (bounds.height() > 0 && bounds.height() > 0) {
                float scale = Math.min(mBitmap.getWidth()/(float)bounds.width(), mBitmap.getHeight()/(float)bounds.height());

                float bitmapVisibleWidth = scale * bounds.width();
                float bitmapVisibleHeight = scale * bounds.height();

                mTempRect.set((int)(mBitmap.getWidth()-bitmapVisibleWidth)/2, 0, (int)(bitmapVisibleWidth+mBitmap.getWidth())/2, (int)bitmapVisibleHeight);
                canvas.drawBitmap(mBitmap, mTempRect, bounds, mBitmapPaint);
            }
        } else if (mScaleType == ScaleType.SCALE_FIT) {
            //bitmap scales to fit in bounds area
            if (bounds.height() > 0 && bounds.height() > 0) {
                float scale = Math.min((float)bounds.width()/mBitmap.getWidth(), (float)bounds.height()/mBitmap.getHeight());

                float bitmapScaledWidth = scale * mBitmap.getWidth();
                float bitmapScaledHeight = scale * mBitmap.getHeight();
                int centerPadding = (int)(bounds.width()-bitmapScaledWidth)/2;
                mTempRect.set(bounds.left + centerPadding, bounds.top, bounds.right - centerPadding, bounds.top+(int)bitmapScaledHeight);
                canvas.drawBitmap(mBitmap, null, mTempRect, mBitmapPaint);
            }
        }
    }
}

이 접근 방식을 사용하면 필요한 확장 논리를 유연하게 적용 할 수 있습니다.


a.ch가 설명하는 방법을 사용하면 내가 필요로하는 것에 대해 훨씬 더 잘 작동하는이 스케일 유형을 사용한 것을 제외하고는 나를 위해 잘 작동했습니다.

android:scaleType="centerCrop"

다음은 사용 가능한 스케일 유형의 전체 목록입니다. http://developer.android.com/reference/android/widget/ImageView.ScaleType.html


InsetDrawable을 사용해보십시오 (잘 작동했습니다).

드로어 블과 네면 중 하나에서 원하는 삽입물 (또는 패딩)을 지정하십시오.

InsetDrawable insetDrawable = new InsetDrawable(drawable, insetLeft, insetTop, insetRight, insetBottom);

특히 View보다 작거나 크기가 작은 배경 드로어 블을 설정하는 데 사용됩니다.

여기를 참조하십시오 : https://developer.android.com/reference/android/graphics/drawable/InsetDrawable.html


Old question, but none of the other answers worked for me. This xml code did however:

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_alignParentTop="true"
        android:scaleType="centerCrop"
        android:src="@drawable/background_image"/> 

</RelativeLayout>

If your bitmap is wider than it is tall, use android:gravity="fill_vertical". Otherwise, use android:gravity="fill_horizontal". This has a similar effect as using android:scaleType="centerCrop" on an ImageView.

<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
    android:gravity="fill_vertical"
    android:src="@drawable/image" />

If you support multiple orientations, you can create one bitmap XML file in the drawable-port folder and the other in the drawable-land folder.


In order to fit the image to the available space (or if you have set width and height in dp), I have tried the following approach, also if the image is not too wide.

Here I have set same width and height for square images [or you can wrap_content on both].

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <ImageView
        android:layout_width="80dp"
        android:layout_height="80dp"
        android:layout_alignParentTop="true"
        android:adjustViewBounds="true"
        android:scaleType="fitCenter"
        android:src="@drawable/background_image"/> 

</RelativeLayout>

adjust view bounds and scale type center fit does the trick.

참고URL : https://stackoverflow.com/questions/9891065/scale-image-keeping-its-aspect-ratio-in-background-drawable

반응형