배경 드로어 블에서 종횡비를 유지하면서 이미지 크기 조정
배경 이미지를 뷰에 맞지만 <bitmap />
배경 드로어 블 XML로 사용할 때 종횡비를 유지하려면 어떻게해야 합니까? 중 어느 것도 <bitmap>
의 android:gravity
값은 원하는 효과를 제공하지 않는다.
xml 파일 내에서만 조작 배경 속성을 달성하는 것은 불가능합니다. 두 가지 옵션이 있습니다.
프로그래밍 방식으로 비트 맵을 자르거나 크기를 조정하고
Bitmap.createScaledBitmap(Bitmap src, int dstWidth, int dstHeight, boolean filter)
일부View
배경 으로 설정합니다 .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.
'Programing' 카테고리의 다른 글
.RData 파일에서 데이터를 보는 방법은 무엇입니까? (0) | 2020.12.12 |
---|---|
마우스로 Three.js에서 카메라 회전 (0) | 2020.12.12 |
x86 어셈블리에서 사용할 변수 크기 (db, dw, dd)는 무엇입니까? (0) | 2020.12.12 |
로컬 스토리지 대 AngularJS $ cacheFactory (0) | 2020.12.12 |
소스를 찾을 수 없지만 일부 또는 모든 이벤트 로그를 검색 할 수 없습니다. (0) | 2020.12.12 |