android - स्केल छवि पृष्ठभूमि पहलू में अपने पहलू अनुपात रखते हुए




scaling android-drawable (6)

A.ch द्वारा वर्णित विधि का उपयोग करना मेरे लिए बहुत अच्छा काम करता है सिवाय इसके कि मैंने इस पैमाने के प्रकार का उपयोग किया जो मुझे आवश्यकतानुसार बेहतर काम करता था:

android:scaleType="centerCrop"

यहां उपलब्ध पैमाने के प्रकारों की एक पूरी सूची दी गई है: ScaleType

मैं बैकग्राउंड छवि को दृश्य में कैसे फ़िट करूं लेकिन <bitmap /> को पृष्ठभूमि खींचने योग्य XML के रूप में उपयोग करते समय इसके पहलू अनुपात को बनाए रखूं? <bitmap> android:gravity कोई भी नहीं android:gravity मूल्य वांछित प्रभाव देता है।


InsetDrawable का उपयोग करने का प्रयास करें (मेरे लिए अच्छा काम किया)।

बस इसे अपने खींचने योग्य, और इन्सेट (या पैडिंग) दें जो आप चार तरफ से किसी एक से चाहते हैं।

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

यह विशेष रूप से आकार के छोटे या दृश्य से पृष्ठभूमि खींचने योग्य सेट करने के लिए उपयोग किया जाता है।

यहां देखें: https://developer.android.com/reference/android/graphics/drawable/InsetDrawable.html


उपलब्ध स्थान पर छवि को फिट करने के लिए (या यदि आपने डीपी में चौड़ाई और ऊंचाई निर्धारित की है), तो छवि ने बहुत व्यापक नहीं होने पर इस दृष्टिकोण को आजमाया है।

यहां मैंने वर्ग छवियों के लिए समान चौड़ाई और ऊंचाई निर्धारित की है [या आप दोनों पर wrap_content कर सकते हैं]।

<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>

दृश्य सीमाओं को समायोजित करें और स्केल प्रकार केंद्र फिट करें।


एक और दृष्टिकोण आपकी नियमित छवि के पैच 9 छवियों को बनाना होगा और जिस तरह से आप इसे चाहते हैं उसे स्केल करें।

आप कोनों में 9-पैच-डॉट्स डालकर सामग्री को केंद्र में रख सकते हैं जो आपके अनुपात को स्पष्ट रूप से संरक्षित रखेगा (माना जाता है कि आपकी छवि का बाहरी किनारा दोहराने योग्य / पारदर्शी है)।

उम्मीद है कि आपको विचार मिल जाएगा।


पुराना सवाल, लेकिन अन्य उत्तरों में से कोई भी मेरे लिए काम नहीं करता था। हालांकि यह एक्सएमएल कोड था:

<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>

मैं अपनी कस्टम ड्रायबल क्लास में कुछ ऐसा करना चाहता था। यहां महत्वपूर्ण टुकड़े हैं:

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);
            }
        }
    }
}

इस दृष्टिकोण के साथ आप किसी भी पैमाने तर्क की आवश्यकता के लिए लचीला हैं





android-background