অ্যান্ড্রয়েড: আকৃতির অনুপাত বজায় রেখে কীভাবে কোনও চিত্রকে পর্দার প্রস্থে প্রসারিত করবেন?


118

আমি একটি চিত্র ডাউনলোড করতে চাই (অজানা আকারের, তবে এটি সর্বদা মোটামুটি বর্গক্ষেত্রের) এবং এটি প্রদর্শন করতে যাতে এটি পর্দা অনুভূমিকভাবে পূরণ করে এবং যে কোনও পর্দার আকারে চিত্রের দিক অনুপাত বজায় রাখতে উল্লম্বভাবে প্রসারিত হয়। এখানে আমার (অ-কর্মক্ষম) কোড। এটি চিত্রটি অনুভূমিকভাবে প্রসারিত করেছে, তবে উল্লম্বভাবে নয়, তাই এটি স্কোয়াশেড ...

ImageView mainImageView = new ImageView(context);
    mainImageView.setImageBitmap(mainImage); //downloaded from server
    mainImageView.setScaleType(ScaleType.FIT_XY);
    //mainImageView.setAdjustViewBounds(true); 
    //with this line enabled, just scales image down
    addView(mainImageView,new LinearLayout.LayoutParams( 
            LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));

সমস্ত অ্যান্ড্রয়েড ডিভাইসগুলির কি একই প্রস্থ / উচ্চতার অনুপাত আছে? যদি তা না হয় তবে মূল অনুপাত সংরক্ষণের সময় পুরো চিত্র / উচ্চতা মাপার জন্য কোনও চিত্রকে স্কেল করা কেবল অসম্ভব ...
NoozNooz42

4
না, আমি চাই না যে চিত্রটি পর্দাটি পূর্ণ করবে, কেবল পর্দার প্রস্থে স্কেল করতে, আমি যতক্ষণ না চিত্রটি সঠিক অনুপাতে থাকে ততক্ষণ স্ক্রিনটি কতটা উল্লম্বভাবে গ্রহণ করে তা বিবেচনা করে না।
ফ্রেডলি

1
অনুরূপ প্রশ্ন, ভাল উত্তর: stackoverflow.com/questions/4677269/…
পিটারিস কেউন

1
'অ্যাডজাস্টভিউবাউন্ডস' কাজ করে না?
দর্পণ

উত্তর:


132

আমি এটি একটি কাস্টম ভিউ দিয়ে সম্পন্ন করেছি। লেআউট_উইথ = "ফিল_প্যারেন্ট" এবং লেআউট_উইট = "র‌্যাপ_কন্টেন্ট" সেট করুন এবং উপযুক্ত অঙ্কনযোগ্যকে এটি নির্দেশ করুন:

public class Banner extends View {

  private final Drawable logo;

  public Banner(Context context) {
    super(context);
    logo = context.getResources().getDrawable(R.drawable.banner);
    setBackgroundDrawable(logo);
  }

  public Banner(Context context, AttributeSet attrs) {
    super(context, attrs);
    logo = context.getResources().getDrawable(R.drawable.banner);
    setBackgroundDrawable(logo);
  }

  public Banner(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    logo = context.getResources().getDrawable(R.drawable.banner);
    setBackgroundDrawable(logo);
  }

  @Override protected void onMeasure(int widthMeasureSpec,
      int heightMeasureSpec) {
    int width = MeasureSpec.getSize(widthMeasureSpec);
    int height = width * logo.getIntrinsicHeight() / logo.getIntrinsicWidth();
    setMeasuredDimension(width, height);
  }
}

12
ধন্যবাদ!! এটি সঠিক উত্তর হওয়া উচিত! :) আমি এই পোস্টে কিছুটা আরও নমনীয়তার জন্য এটি সামঞ্জস্য করেছি: stackoverflow.com/questions/4677269/… সেখানে আমি একটি চিত্র ভিউ ব্যবহার করি যাতে কোনওটি এক্সএমএলে অঙ্কনযোগ্য সেট করতে পারে বা চিত্রটি সেট করার জন্য কোডটিতে স্বাভাবিক চিত্রভিউয়ের মতো ব্যবহার করতে পারে। দুর্দান্ত কাজ!
প্যাট্রিক বুস

1
ফ্রিকিন প্রতিভা! যে একটি চ্যাম্প মত কাজ! ধন্যবাদ এটি সমস্ত পর্দার আকারে ঠিক নয় শীর্ষে জুড়ে একটি চিত্র ব্যানার দিয়ে আমার সমস্যাটি সমাধান করেছে! তোমাকে অনেক ধন্যবাদ!
জেপিএম

1
লোগো নালার জন্য নজর রাখুন (আপনি যদি ইন্টারনেট থেকে সামগ্রী ডাউনলোড করেন)। অন্যথায়, এটি দুর্দান্ত কাজ করে, এক্সএমএল স্নিপেটের জন্য প্যাট্রিকের পোস্টটি অনুসরণ করুন।
আর্টেম রাশাকোভস্কিই

44
আমি বিশ্বাস করতে পারি না যে অ্যান্ড্রয়েডে আইওএস এবং উইন্ডোজ ফোনে তুচ্ছ সহজভাবে কাজ করা কতটা কঠিন।
এমএক্সসিএল

1
আমি কিছু পরিবর্তন করেছি, তবে সেগুলি অন্য কোথাও পোস্ট করার পরিবর্তে, এই উত্তরটিকে সম্প্রদায়ের উইকিতে পরিণত করা কি সম্ভব হবে? আমার পরিবর্তনগুলি হ'ল এখানে উল্লেখ করা বিশেষ কেসগুলি পরিচালনা করার পাশাপাশি লেআউট সংজ্ঞা অনুসারে কোন দিকটি পুনরায় আকার দিতে হবে তা চয়ন করার ক্ষমতা are
স্টিভ পোমরোয়

24

শেষ পর্যন্ত আমি ম্যানুয়ালি মাত্রা তৈরি করেছি, যা দুর্দান্ত কাজ করে:

DisplayMetrics dm = new DisplayMetrics();
context.getWindowManager().getDefaultDisplay().getMetrics(dm);
int width = dm.widthPixels;
int height = width * mainImage.getHeight() / mainImage.getWidth(); //mainImage is the Bitmap I'm drawing
addView(mainImageView,new LinearLayout.LayoutParams( 
        width, height));

আমি আমার সমস্যা সমাধানের জন্য এই ধরণের সমাধানের সন্ধান করছি this এই গণনার সহায়তায়, আমি অনুপাতের অনুপাতটি হ্রাস না করে সফলভাবে চিত্রটি লোড করেছি।
স্টিভ

21

আমি কেবলমাত্র উত্স কোডটি পড়েছি ImageViewএবং এই থ্রেডের সাবক্লাসিং সমাধানগুলি ব্যবহার না করে এটি মূলত অসম্ভব। ইন ImageView.onMeasureআমরা এই লাইনে পাবেন:

        // Get the max possible width given our constraints
        widthSize = resolveAdjustedSize(w + pleft + pright, mMaxWidth, widthMeasureSpec);

        // Get the max possible height given our constraints
        heightSize = resolveAdjustedSize(h + ptop + pbottom, mMaxHeight, heightMeasureSpec);

কোথায় hএবং wইমেজ মাত্রা, এবং p*প্যাডিং হয়।

এবং তারপর:

private int resolveAdjustedSize(int desiredSize, int maxSize,
                               int measureSpec) {
    ...
    switch (specMode) {
        case MeasureSpec.UNSPECIFIED:
            /* Parent says we can be as big as we want. Just don't be larger
               than max size imposed on ourselves.
            */
            result = Math.min(desiredSize, maxSize);

সুতরাং আপনার যদি layout_height="wrap_content"এটি থাকে তবে এটি সেট হয়ে যাবে widthSize = w + pleft + prightবা অন্য কথায়, সর্বাধিক প্রস্থটি চিত্রের প্রস্থের সমান।

এর অর্থ হ'ল আপনি যদি কোন সঠিক আকার সেট না করেন, চিত্রগুলি কখনও বড় হয় না । আমি এটিকে একটি বাগ হিসাবে বিবেচনা করি, তবে গুগল নোটিশ নিতে বা এটি ঠিক করার জন্য সৌভাগ্য। সম্পাদনা করুন: আমার নিজের শব্দগুলি খাওয়ার পরে, আমি একটি বাগ রিপোর্ট জমা দিয়েছিলাম এবং তারা বলে যে এটি ভবিষ্যতের প্রকাশে স্থির হয়েছে!

আর একটি সমাধান

এখানে আরেকটি subclassed কার্যসংক্রান্ত নেই, কিন্তু আপনি উচিত (তত্ত্ব, আমি সত্যিই এটা অনেক পরীক্ষাও দেইনি কয়েকটা!) যে কোন জায়গায় আপনি এটি ব্যবহার করতে সক্ষম হতে ImageView। এটি সেট করতে layout_width="match_parent", এবং layout_height="wrap_content"। এটি গ্রহণযোগ্য সমাধানের চেয়েও অনেক বেশি সাধারণ। যেমন আপনি ফিট থেকে উচ্চতার পাশাপাশি ফিট-টু প্রস্থও করতে পারেন।

import android.content.Context;
import android.util.AttributeSet;
import android.widget.ImageView;

// This works around the issue described here: http://stackoverflow.com/a/12675430/265521
public class StretchyImageView extends ImageView
{

    public StretchyImageView(Context context)
    {
        super(context);
    }

    public StretchyImageView(Context context, AttributeSet attrs)
    {
        super(context, attrs);
    }

    public StretchyImageView(Context context, AttributeSet attrs, int defStyle)
    {
        super(context, attrs, defStyle);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
    {
        // Call super() so that resolveUri() is called.
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);

        // If there's no drawable we can just use the result from super.
        if (getDrawable() == null)
            return;

        final int widthSpecMode = MeasureSpec.getMode(widthMeasureSpec);
        final int heightSpecMode = MeasureSpec.getMode(heightMeasureSpec);

        int w = getDrawable().getIntrinsicWidth();
        int h = getDrawable().getIntrinsicHeight();
        if (w <= 0)
            w = 1;
        if (h <= 0)
            h = 1;

        // Desired aspect ratio of the view's contents (not including padding)
        float desiredAspect = (float) w / (float) h;

        // We are allowed to change the view's width
        boolean resizeWidth = widthSpecMode != MeasureSpec.EXACTLY;

        // We are allowed to change the view's height
        boolean resizeHeight = heightSpecMode != MeasureSpec.EXACTLY;

        int pleft = getPaddingLeft();
        int pright = getPaddingRight();
        int ptop = getPaddingTop();
        int pbottom = getPaddingBottom();

        // Get the sizes that ImageView decided on.
        int widthSize = getMeasuredWidth();
        int heightSize = getMeasuredHeight();

        if (resizeWidth && !resizeHeight)
        {
            // Resize the width to the height, maintaining aspect ratio.
            int newWidth = (int) (desiredAspect * (heightSize - ptop - pbottom)) + pleft + pright;
            setMeasuredDimension(newWidth, heightSize);
        }
        else if (resizeHeight && !resizeWidth)
        {
            int newHeight = (int) ((widthSize - pleft - pright) / desiredAspect) + ptop + pbottom;
            setMeasuredDimension(widthSize, newHeight);
        }
    }
}

আমি একটি বাগ রিপোর্ট জমা দিয়েছি । এটি যেমন উপেক্ষা করা হয় দেখুন!
টিএমএমএম

3
স্পষ্টতই আমাকে আমার কথাগুলি খেতে হবে - তারা বলে যে এটি ভবিষ্যতের প্রকাশে স্থির করা হয়েছে!
টিএমএমএম

আপনাকে অনেক ধন্যবাদ টিম। এটি চূড়ান্ত সঠিক একটি উত্তর হওয়া উচিত। আমি অনেক সময় অনুসন্ধান করেছি এবং আপনার সমাধানের চেয়ে ভাল আর কিছুই নয়!
টেইনি

উপরের স্ট্রেচিআইমেজভিউটি ব্যবহার করার সময় যদি আমার সর্বোচ্চ হাইট সেট করতে হয় তবে কী হবে। আমি এর জন্য কোনও সমাধান পাইনি।
টেইনি

17

অ্যাডজাস্টভিউবাউন্ডসকে সত্যে সেট করা এবং লিনিয়ারলআউট ভিউ গ্রুপটি ব্যবহার করা আমার পক্ষে খুব ভাল কাজ করেছে। ডিভাইস মেট্রিকগুলির জন্য সাবক্লাস বা জিজ্ঞাসা করার দরকার নেই:

//NOTE: "this" is a subclass of LinearLayout
ImageView splashImageView = new ImageView(context);
splashImageView.setImageResource(R.drawable.splash);
splashImageView.setAdjustViewBounds(true);
addView(splashImageView);

1
... বা ইমেজভিউ এক্সএমএল সম্পত্তি ব্যবহার করে - অ্যান্ড্রয়েড: অ্যাডজাস্টভিউবাউন্ডস "" সত্য "
আনাতোলি শুবা

পারফেক্ট! এটি এত সহজ ছিল এবং এটি চিত্রটিকে নিখুঁতভাবে প্রসারিত করে। উপায় কি এই উত্তরটি সঠিক নয়? কাস্টমভিউ সহ উত্তরটি আমার পক্ষে কার্যকর হয়নি (কিছু অদ্ভুত এক্সএমএল ত্রুটি)
ব্যবহারকারীর 3800924

13

আমি এই সমস্যাগুলির সাথে এক বা অন্য রূপে জিএসের জন্য লড়াই করে যাচ্ছি, আপনাকে ধন্যবাদ, ধন্যবাদ, আপনাকে ধন্যবাদ .... :)

আমি কেবল এটিই উল্লেখ করতে চেয়েছিলাম যে বব লি কী করেছেন তার থেকে আপনি সাধারণ সমাধান পেতে পারেন যা কেবলমাত্র ভিউ বাড়িয়ে ওমিশারকে ওভাররাইড করে। আপনি যে কোনও অঙ্কনযোগ্য এর সাথে আপনি এটি ব্যবহার করতে পারেন এবং কোনও চিত্র না থাকলে তা ভাঙবে না:

    public class CardImageView extends View {
        public CardImageView(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
        }

        public CardImageView(Context context, AttributeSet attrs) {
            super(context, attrs);
        }

        public CardImageView(Context context) {
            super(context);
        }

        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            Drawable bg = getBackground();
            if (bg != null) {
                int width = MeasureSpec.getSize(widthMeasureSpec);
                int height = width * bg.getIntrinsicHeight() / bg.getIntrinsicWidth();
                setMeasuredDimension(width,height);
            }
            else {
                super.onMeasure(widthMeasureSpec, heightMeasureSpec);
            }
        }
    }

2
এই সমস্যার অনেকগুলি, অনেকগুলি সমাধানের মধ্যে এটিই প্রথমটি যা কেবলমাত্র একটি ড্রপ-ইন সমাধান, যেখানে অন্যদের সর্বদা ত্রুটি থাকে (যেমন কোনও কোড পুনরায় না লিখে রানটাইমে চিত্রটি পরিবর্তন করতে সক্ষম না হওয়া)। ধন্যবাদ!
ম্যাকডি

এটি খাঁটি বিস্ময়করতা - কিছু সময়ের জন্য এটির সাথে লড়াই করে আসছে এবং এক্সএমএল বৈশিষ্ট্যগুলি ব্যবহার করে সমস্ত সুস্পষ্ট সমাধান কখনই কাজ করেনি। এটির সাহায্যে আমি কেবলমাত্র আমার ইমেজভিউটি বর্ধিত দৃশ্যের সাথে প্রতিস্থাপন করতে পারি এবং প্রত্যাশা অনুযায়ী সবকিছুই কাজ করে!
স্লোট

এটি এই সমস্যার একেবারে সেরা সমাধান।
এরল্যান্ডো

এটি একটি দুর্দান্ত উত্তর। আপনি এই ক্লাসটি এই জাতীয় উদ্বেগ ছাড়াই এক্সএমএল ফাইলে ব্যবহার করতে পারেন: <com.yourpackagename.CardImageView অ্যান্ড্রয়েড: লেআউট_উইথ = "ফিল_প্যারেন্ট" অ্যান্ড্রয়েড: লেআউট_উইট = "র‌্যাপ_কন্টেন্ট" অ্যান্ড্রয়েড: ব্যাকগ্রাউন্ড = "@ অঙ্কনযোগ্য / আপনার_ফোটো" />। গ্রেট!
আরনিওতাকি

11

কিছু ক্ষেত্রে এই যাদু সূত্রটি সুন্দরভাবে সমস্যাটি সমাধান করে।

অন্য যে প্ল্যাটফর্ম থেকে এটির সাথে লড়াইয়ের জন্য লড়াই করছেন, তার জন্য "আকার এবং মানানসই মানানসই" বিকল্পটি অ্যান্ড্রয়েডে খুব সুন্দরভাবে পরিচালনা করা হয়েছে তবে এটি খুঁজে পাওয়া শক্ত hard

আপনি সাধারণত এই সমন্বয়টি চান:

  • প্রস্থ ম্যাচ পিতা,
  • উচ্চতা মোড়ানো বিষয়বস্তু,
  • অ্যাডজাস্টভিউবাউন্ডগুলি চালু (sic)
  • স্কেল ফিট সেন্টার
  • ক্রপটোপ্যাডিং বন্ধ (sic)

তারপরে এটি স্বয়ংক্রিয় এবং আশ্চর্যজনক।

আপনি যদি কোনও আইওএস ডেভ হন তবে এটি সম্পূর্ণ আশ্চর্যজনক কীভাবে সহজভাবে, অ্যান্ড্রয়েডে আপনি কোনও টেবিল ভিউতে "সম্পূর্ণ গতিশীল সেল হাইটস" করতে পারেন .. ভুল, আমার মানে তালিকাভিউ। উপভোগ করুন।

<com.parse.ParseImageView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/post_image"
    android:src="@drawable/icon_192"
    android:layout_margin="0dp"
    android:cropToPadding="false"
    android:adjustViewBounds="true"
    android:scaleType="fitCenter"
    android:background="#eff2eb"/>

এখানে চিত্র বর্ণনা লিখুন


6

আমি এই এক্সএমএল কোডটি ব্যবহার করে এটি অর্জন করতে সক্ষম হয়েছি। এটি এমন ক্ষেত্রে হতে পারে যে গ্রহটি এটি ফিট করতে প্রসারিত দেখানোর জন্য উচ্চতা রেন্ডার করে না; তবে, আপনি যখন আসলে কোনও ডিভাইসে এটি চালান, এটি যথাযথভাবে রেন্ডার করে এবং পছন্দসই ফলাফল সরবরাহ করে। (ভাল, অন্তত আমার জন্য)

<FrameLayout
     android:layout_width="match_parent"
     android:layout_height="wrap_content">

     <ImageView
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:adjustViewBounds="true"
          android:scaleType="centerCrop"
          android:src="@drawable/whatever" />
</FrameLayout>

দুঃখিত এটি কাজ করে না। এটি প্রস্থকে স্কেল করে তবে সেন্টারক্রপ দিক অনুপাত বজায় রাখে না।
রিসোসেলাম

1
ইমেজভিউ প্রসারিত কাস্টম ক্লাসগুলির সাথে বহু ঘন্টা লড়াই করার পরেও (অনেক উত্তর এবং নিবন্ধে লেখা হিসাবে) এবং "নিম্নলিখিত ক্লাসগুলি পাওয়া যায়নি" এর মতো একটি ব্যতিক্রম থাকার পরে আমি সেই কোডটি সরিয়েছি। হঠাৎ আমি লক্ষ্য করলাম আমার ইমেজভিউতে একটি সমস্যা ব্যাকগ্রাউন্ড বৈশিষ্ট্যে ছিল! এটিতে পরিবর্তন হয়েছে srcএবং চিত্রভিউ আনুপাতিক হয়ে উঠেছে।
কুলমাইন্ড

5

আমি লিনিয়ারআউটআউট এর মধ্যে এই মানগুলি দিয়ে এটি করেছি:

Scale type: fitStart
Layout gravity: fill_horizontal
Layout height: wrap_content
Layout weight: 1
Layout width: fill_parent

আপনি একটি বাস্তব উদাহরণ দিতে পারেন? আমি আমার এক্সএমএল ফাইলটিতে এই মানগুলি কোথায় রাখব?
জন স্মিথ

5

প্রত্যেকে এই কর্মসূচিটি করছে তাই আমি ভেবেছিলাম এই উত্তরটি এখানে পুরোপুরি ফিট হবে। এই কোডটি এক্সএমএলটিতে আমার জন্য কাজ করেছিল। আমি এখনও অনুপাত সম্পর্কে চিন্তা করছি না, তবে এখনও যদি কেউ কারও সাহায্য করে তবে এই উত্তরটি রাখতে চাইছি।

android:adjustViewBounds="true"

চিয়ার্স ..


3

একটি খুব সহজ সমাধান কেবলমাত্র সরবরাহিত বৈশিষ্ট্যগুলি ব্যবহার করা RelativeLayout

এখানে এমন এক্সএমএল যা স্ট্যান্ডার্ড অ্যান্ড্রয়েড দিয়ে এটি সম্ভব করে তোলে Views:

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

    <RelativeLayout 
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        >
        <LinearLayout
            android:id="@+id/button_container"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:layout_alignParentBottom="true"
            >
            <Button
                android:text="button"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"/>
            <Button
                android:text="button"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"/>
            <Button
                android:text="button"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"/>
        </LinearLayout>
        <ImageView 
            android:src="@drawable/cat"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:adjustViewBounds="true"
            android:scaleType="centerCrop"
            android:layout_above="@id/button_container"/>
    </RelativeLayout>
</ScrollView>

কৌশলটি হ'ল আপনি ImageViewস্ক্রিনটি পূরণ করতে সেট করেছেন তবে এটি অন্যান্য লেআউটের উপরে থাকতে হবে। এইভাবে আপনি আপনার প্রয়োজনীয় সমস্ত অর্জন করুন।


2

সেটিং তার সহজ ব্যাপার adjustViewBounds="true"এবং scaleType="fitCenter"ImageView জন্য XML ফাইলে!

<ImageView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:src="@drawable/image"

        android:adjustViewBounds="true"
        android:scaleType="fitCenter"
        />

দ্রষ্টব্য: layout_widthসেট করা আছেmatch_parent


1

আপনি স্কেলটাইপকে স্কেলটাইপ.এফআইএক্সএক্সএইচ সেট করছেন। জাভাডোকদের মতে , এটি পুরো ক্ষেত্রের সাথে ফিট করার জন্য চিত্রটি প্রসারিত করবে, প্রয়োজনে অনুপাতের অনুপাত পরিবর্তন করবে। এটি আপনি যে আচরণটি দেখছেন তা ব্যাখ্যা করবে।

আপনি যে আচরণটি চান তা পেতে ... FIT_CENTER, FIT_START, বা FIT_END যদি কাছাকাছি থাকে তবে চিত্রটি লম্বা হওয়ার চেয়ে সংকীর্ণ হলে প্রস্থটি পূরণ করা শুরু করবে না। এগুলি কীভাবে কার্যকর করা হয় তা আপনি দেখতে পারেন এবং আপনার উদ্দেশ্যটির জন্য কীভাবে এটি সামঞ্জস্য করা যায় তা সম্ভবত আপনারাই বুঝতে সক্ষম হওয়া উচিত।


2
আমি FIT_CENTER চেষ্টা করেছিলাম, কিন্তু অন্যদের জন্য নয়। দুর্ভাগ্যক্রমে তারা উভয়ই কাজ করে না, সেটএডজাস্টভিউবাউন্ডস উভয়ই সত্য ও মিথ্যাতে সেট করে। ডিভাইসের স্ক্রিনের পিক্সেল প্রস্থের পাশাপাশি ডাউনলোড করা চিত্রটির প্রস্থ / উচ্চতা এবং ম্যানুয়ালি আকার সেট করার কি কোনও উপায় আছে?
ফ্রেডলি

1

স্কেলটাইপ.সেন্টেলক্রিপ আপনি যা চান তা করবে: পূর্ণ প্রস্থে প্রসারিত করুন এবং সেই অনুযায়ী উচ্চতা স্কেল করুন। যদি স্কেলড উচ্চতা স্ক্রিনের সীমা অতিক্রম করে, চিত্রটি ক্রপ করা হবে।


1

দেখুন আপনার সমস্যার আরও সহজ সমাধান রয়েছে:

ImageView imageView;

protected void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.your_layout);
    imageView =(ImageView)findViewById(R.id.your_imageView);
    Bitmap imageBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.your_image);
    Point screenSize = new Point();
    getWindowManager().getDefaultDisplay().getSize(screenSize);
    Bitmap temp = Bitmap.createBitmap(screenSize.x, screenSize.x, Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(temp);
    canvas.drawBitmap(imageBitmap,null, new Rect(0,0,screenSize.x,screenSize.x), null);
    imageView.setImageBitmap(temp);
}

1

আপনি অঙ্কনযোগ্য প্রস্থ এবং উচ্চতার উপর নির্ভর করে দিক অনুপাত (প্রস্থ বা উচ্চতা দ্বারা) সংরক্ষণ করে আমার স্ট্রেচিয়েবল ইমেজভিউটি ব্যবহার করতে পারেন :

import android.content.Context;
import android.util.AttributeSet;
import android.widget.ImageView;

public class StretchableImageView extends ImageView{

    public StretchableImageView(Context context) {
        super(context);
    }

    public StretchableImageView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public StretchableImageView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        if(getDrawable()!=null){
            if(getDrawable().getIntrinsicWidth()>=getDrawable().getIntrinsicHeight()){
                int width = MeasureSpec.getSize(widthMeasureSpec);
                int height = width * getDrawable().getIntrinsicHeight()
                            / getDrawable().getIntrinsicWidth();
                setMeasuredDimension(width, height);
            }else{
                int height = MeasureSpec.getSize(heightMeasureSpec);
                int width = height * getDrawable().getIntrinsicWidth()
                            / getDrawable().getIntrinsicHeight();
                setMeasuredDimension(width, height);
            }
        }
    }
}

0

আমার জন্য অ্যান্ড্রয়েড: স্কেলটাইপ = "সেন্টারক্রপ" আমার সমস্যার সমাধান করেনি। এটি চিত্রের আরও বেশি প্রসারিত করেছে। তাই আমি অ্যান্ড্রয়েডের সাথে চেষ্টা করেছি: স্কেলটাইপ = "ফিট এক্সওয়াই" এবং এটি দুর্দান্ত কাজ করেছে।


0

এটি আমার প্রয়োজন অনুসারে কাজ করছে fine

<ImageView android:id="@+id/imgIssue" android:layout_width="fill_parent" android:layout_height="wrap_content" android:adjustViewBounds="true" android:scaleType="fitXY"/>

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.