ইমেজভিউ - উচ্চতার ম্যাচের প্রস্থ রয়েছে?


166

আমি একটি চিত্র দেখুন। আমি চাই এর প্রস্থটি পূর্ণ_পিতা হোক। আমি চাই এর উচ্চতা প্রস্থে যতটুকু সমাপ্ত হয় তা হোক। উদাহরণ স্বরূপ:

<ImageView
  android:layout_width="fill_parent"
  android:layout_height="whatever the width ends up being" />

নিজস্ব ভিউ ক্লাস তৈরি না করে কোনও লেআউট ফাইলে কি এমন কিছু সম্ভব?

ধন্যবাদ


আপনি কীভাবে এটি করবেন তা বুঝতে পেরেছিলেন? আমি ধরে নিচ্ছি আপনি চান অনুপাতটি একই রকম থাকে। এই উত্তরগুলির বেশিরভাগই ধরে নিলে আপনি চিত্রটি বর্গক্ষেত্র হতে চান।
আদম

@ জো ব্লো এটি করা খুব খারাপ উপায়
আগ্রাসী

উত্তর:


170

আপডেট: সেপ্টেম্বর 14 2017

নীচের একটি মন্তব্য অনুসারে, শতাংশ সমর্থন লাইব্রেরি অ্যান্ড্রয়েড সমর্থন লাইব্রেরি 26.0.0 হিসাবে অবচয় করা হয়েছে। এটি করার নতুন উপায়:

<android.support.constraint.ConstraintLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="0dp"
        app:layout_constraintDimensionRatio="1:1" />

</android.support.constraint.ConstraintLayout>

এখানে দেখুন

থামানো হয়েছে:

অ্যান্ড্রয়েড বিকাশকারীদের এই পোস্ট অনুসারে , আপনাকে এখন যা করতে হবে তা হ'ল পার্সেন্টালিলিটিভ লেআউট বা পার্সেন্টফ্রেমলাইআউটের মধ্যে যা যা চান তা মোড়ানো এবং তার অনুপাতগুলি নির্দিষ্ট করে, যেমন

<android.support.percent.PercentRelativeLayout 
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <ImageView
        app:layout_widthPercent="100%"
        app:layout_aspectRatio="100%"/>

</android.support.percent.PercentRelativeLayout>

8
এই উত্তরটির লিঙ্কটিতে গুগল সরবরাহ করা সবচেয়ে মার্জিত সমাধান রয়েছে। আমার ক্ষেত্রে, আমি ইমেজটি 16: 9 অনুপাতে প্রদর্শিত হতে চেয়েছিলাম আসল চিত্রের অনুপাত যাই হোক না কেন। দুর্দান্ত কাজ করে। ধন্যবাদ!
এলইটি

আমার ক্ষেত্রে IM, যেমন সমাধান হিসাবে এই এক কাজ করে নি, এই এক করেনি!
গুয়


দেখে মনে হচ্ছে এই পদ্ধতির মোড়কযুক্ত ভিউপাগারে সমস্যা রয়েছে যা তার বাচ্চাদের সামগ্রীর উপর ভিত্তি করে উচ্চতার গণনা করে। WrappedViewPager জন্য উত্স অনুরূপ gist.github.com/egslava/589b82a6add9c816a007
Sha

1
অ্যান্ড্রয়েড সমর্থন লাইব্রেরি ২.0.০.০ এর পর থেকে শতাংশ সমর্থন মডিউলটিকে অবহেলা করা হয়েছে। সূত্র: ডেভেলপার.আ্যান্ড্রয়েড
টপিক

97

সম্ভবত এটি আপনার প্রশ্নের উত্তর দেবে:

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

আপনি scaleTypeএই বিশেষ পরিস্থিতির জন্য বৈশিষ্ট্যটি উপেক্ষা করতে পারেন ।


12
হ্যাঁ, এটি অকেজো
ফ্যাটি

4
এটি খুব অকার্যকর নয়। এটি আমার ব্যবহারের জন্য সূক্ষ্মভাবে কাজ করে, স্কয়ার বাকী থাকা অবস্থায় উচ্চতা পূরণ করার জন্য আমি একটি শিরোনামবারে একটি আইকন রেখেছি।
আনুবিয়ান নুব

3
আমার সমস্যাও সমাধান করেছেন।
ডিলসন বিক্রয় 5

সহজতম পথ! এটি সেরা উত্তর হিসাবে চিহ্নিত করা উচিত।
এইচ ফরিদ

30

রানটাইমটিতে ভিউ প্রশস্ততাগুলি একবার জানার পরে এটি গৌণিকভাবে দর্শনের উচ্চতা সেট করতে লেআউটপ্যারাম ব্যবহার করে করা যেতে পারে। রানটাইমের সময় দর্শনের প্রস্থ পাওয়ার জন্য আপনাকে একটি রান্নেবল থ্রেড ব্যবহার করতে হবে অন্যথায় আপনি দৃশ্যের প্রস্থটি জানার আগে উচ্চতা সেট করার চেষ্টা করবেন কারণ লেআউটটি এখনও আঁকেনি।

আমি কীভাবে আমার সমস্যার সমাধান করেছি তার উদাহরণ:

final FrameLayout mFrame = (FrameLayout) findViewById(R.id.frame_id);

    mFrame.post(new Runnable() {

        @Override
        public void run() {
            RelativeLayout.LayoutParams mParams;
            mParams = (RelativeLayout.LayoutParams) mFrame.getLayoutParams();
            mParams.height = mFrame.getWidth();
            mFrame.setLayoutParams(mParams);
            mFrame.postInvalidate();
        }
    });

লেআউটপ্যারামগুলি অবশ্যই আপনার ভিউর মধ্যে থাকা প্যারেন্ট ভিউর ধরণের হতে হবে My আমার ফ্রেমলাইআউটটি এক্সএমএল ফাইলে কোনও রিলেটিভলআউটের অভ্যন্তরে।

    mFrame.postInvalidate();

ইউআই থ্রেডের চেয়ে পৃথক থ্রেড চলাকালীন দৃশ্যকে পুনরায় আঁকতে বাধ্য করতে বলা হয়


4
দারুণ উত্তর, বিশেষত রান্নেবলের সাথে, ধন্যবাদ!
jesses.co.tt

1
যদিও এটি কাজ করে, এটি আদর্শ নয়। পোস্টে চালানো মানে ভিউটি বিন্যাস পরিবর্তনের আগে একবার রেন্ডার হয়। সঠিকভাবে অঙ্কন করার আগে ভুল উচ্চতায় একটি ফ্ল্যাশ সামগ্রীর অনুমতি দিতে পারে। আগে সমাধান করা ভাল। সমাধানের সর্বাধিকতম মুহূর্তটি একটি কাস্টম চলাকালীন onMeasure, রেজিসের উত্তরে দেখানো হয়েছে । একটি বিকল্প, তবে কেবলমাত্র অ্যাডাপ্টারের মাধ্যমে রেন্ডার করা দর্শনগুলির জন্য, যেমন ভিতরে GridView, ম্যাট এর উত্তর
টুলমেকারস্টেভ

1
requestLayout()প্যারামিটার সেট করার পরে কল করার পরে এটি আমার পক্ষে কাজ করেছিল। কেন হবে?
ডিভাইনস ম্যাথিউ

mFrame.postInvalidate (); এটি কি করেছে, এটি ছাড়া আমি অবস্থানের বাইরে ভিউ পাচ্ছি।
জ্যাকোল্যাক

17

আমি একটি পুনর্ব্যবহারযোগ্য আইটেমের জন্য কাজ করার জন্য ডেভিড চুর উত্তর পেতে পারি না এবং চিত্রকল্পটি পিতামাতার কাছে সীমাবদ্ধ করার দরকার পড়েছিলাম। ইমেজভিউ প্রস্থটি সেট করুন 0dpএবং এর শুরু এবং পিতামাতার কাছে সীমাবদ্ধ করুন। আমি প্রস্থটি নির্দিষ্ট করে দিচ্ছি wrap_contentবা match_parentকিছু ক্ষেত্রে কাজ করে কিনা তা আমি নিশ্চিত নই , তবে আমি মনে করি কনস্ট্রেন্টলয়েটের সন্তানকে তার পিতামাতাকে পূরণ করার জন্য এটি আরও ভাল উপায়।

<android.support.constraint.ConstraintLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <ImageView
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintDimensionRatio="1:1"/>

</android.support.constraint.ConstraintLayout>

13

আমি এখানে আমি যা করেছি তা ইমেজবটন যা সর্বদা প্রস্থের দৈর্ঘ্যের সমান হয় (এবং একদিকে বোকা খালি মার্জিন এড়ানো ... যা আমি এসডিকে একটি বাগ হিসাবে বিবেচনা করি ...):

আমি স্কোয়ারআইমেজবটন ক্লাসটি সংজ্ঞায়িত করেছি যা ইমেজবটন থেকে প্রসারিত:

package com.myproject;

import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.widget.ImageButton;

    public class SquareImageButton extends ImageButton {

        public SquareImageButton(Context context) {
        super(context);


        // TODO Auto-generated constructor stub
    }

    public SquareImageButton(Context context, AttributeSet attrs) {
        super(context, attrs);
        // TODO Auto-generated constructor stub

    }

    public SquareImageButton(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        // TODO Auto-generated constructor stub

    }

    int squareDim = 1000000000;

    @Override
    public void onMeasure(int widthMeasureSpec, int heightMeasureSpec){
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);


        int h = this.getMeasuredHeight();
        int w = this.getMeasuredWidth();
        int curSquareDim = Math.min(w, h);
        // Inside a viewholder or other grid element,
        // with dynamically added content that is not in the XML,
        // height may be 0.
        // In that case, use the other dimension.
        if (curSquareDim == 0)
            curSquareDim = Math.max(w, h);

        if(curSquareDim < squareDim)
        {
            squareDim = curSquareDim;
        }

        Log.d("MyApp", "h "+h+"w "+w+"squareDim "+squareDim);


        setMeasuredDimension(squareDim, squareDim);

    }

}

এখানে আমার এক্সএমএল:

<com.myproject.SquareImageButton
            android:id="@+id/speakButton"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:scaleType="centerInside"
            android:src="@drawable/icon_rounded_no_shadow_144px"
            android:background="#00ff00"
            android:layout_alignTop="@+id/searchEditText"
            android:layout_alignBottom="@+id/searchEditText"
            android:layout_alignParentLeft="true"
           />

একটি যাদুমন্ত্র মত কাজ করে !


হ্যাঁ, এটি সেরা উত্তর। (এবং একমাত্র সত্যিকারের
ওপিএস

6

অ্যান্ড্রয়েডে 26.0.0 শতাংশ শতাংশ রিলেটিভলআউট অবমূল্যায়ন করা হয়েছে

এটির সমাধানের সর্বোত্তম উপায় এখন এর ConstraintLayoutমতো:

<android.support.constraint.ConstraintLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content">

    <ImageView android:layout_width="match_parent"
               android:layout_height="0dp"
               android:scaleType="centerCrop"
               android:src="@drawable/you_image"                       
               app:layout_constraintDimensionRatio="1:1"/>


</android.support.constraint.ConstraintLayout>


আপনার প্রকল্পে কীভাবে যুক্ত করবেন তার একটি টিউটোরিয়াল এখানে ConstraintLayout


6

আপনার চিত্রের ভিউ যদি কোনও সীমাবদ্ধ বিন্যাসের অভ্যন্তরে থাকে তবে আপনি বর্গক্ষেত্র চিত্র প্রদর্শনের জন্য নিম্নলিখিত সীমাবদ্ধতাগুলি ব্যবহার করতে পারেন

<ImageView
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:id="@+id/ivImageView"
    app:layout_constraintDimensionRatio="W,1:1"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintEnd_toEndOf="parent"/>

5

আপনি একা লেআউটটি দিয়ে এটি করতে পারবেন না, আমি চেষ্টা করেছি। আমি এটি পরিচালনা করার জন্য খুব সাধারণ ক্লাস লিখেছিলাম, আপনি এটি গিথুবটিতে পরীক্ষা করে দেখতে পারেন। SquareImage.java এটির বৃহত প্রকল্পের অংশ তবে সামান্য কপি এবং পেস্ট কিছুই ঠিক করতে পারে না (অ্যাপাচি ২.০ এর অধীনে লাইসেন্সযুক্ত)

মূলত আপনাকে কেবল উচ্চতা / প্রস্থকে অন্য মাত্রার সমান করতে হবে (আপনি কোন উপায়ে এটি স্কেল করতে চান তার উপর নির্ভর করে)

দ্রষ্টব্য: আপনি scaleTypeএট্রিবিউটটি ব্যবহার করে কোনও কাস্টম শ্রেণিবিহীন এটিকে বর্গক্ষেত্র তৈরি করতে পারেন তবে দেখার সীমাটি দৃশ্যমান চিত্রের বাইরে প্রসারিত হবে, এটি যদি আপনার কাছে অন্যান্য মতামত রাখে তবে এটি একটি বিষয় হয়ে দাঁড়ায়।


3

আপনার চিত্রভিউ অর্ধেক স্ক্রিনের সমান সেট করতে, আপনাকে চিত্রভিউয়ের জন্য আপনার এক্সএমএলে নিম্নলিখিতটি যুক্ত করতে হবে:

<ImageView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_centerInParent="true"
    android:scaleType="fitXY"
    android:adjustViewBounds="true"/>

এরপরে এই প্রস্থের সমান উচ্চতা নির্ধারণ করতে আপনাকে কোডে এটি করতে হবে। ইন getViewআপনার পদ্ধতি GridViewঅ্যাডাপ্টারের সেট ImageViewউচ্চতা তার মাপা প্রস্থের সমান:

mImageView.getLayoutParams().height = mImageView.getMeasuredWidth();

3

2017 এর মধ্য দিয়ে চলে যাওয়া লোকেদের জন্য, আপনি যা চান তা অর্জনের নতুন সেরা উপায়টি হ'ল কনস্ট্রেন্টলয়েটকে এভাবে ব্যবহার করে :

<ImageView
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:scaleType="centerCrop"
    app:layout_constraintDimensionRatio="1:1" />

এবং আপনার বিন্যাসের প্রয়োজন অনুসারে চার দিকের সমস্ততে বাধা যুক্ত করতে ভুলবেন না।

কনস্ট্রেন্টলয়েট সহ একটি প্রতিক্রিয়াশীল ইউআই তৈরি করুন

তদ্ব্যতীত, এখন অবধি, পারসেন্টারেলেটিভালআউট অবমুক্ত করা হয়েছে ( অ্যান্ড্রয়েড ডকুমেন্টেশন দেখুন )।


1

আমি কীভাবে এই সমস্যার সমাধান করেছি তা এখানে:

int pHeight =  picture.getHeight();
int pWidth = picture.getWidth();
int vWidth = preview.getWidth();
preview.getLayoutParams().height = (int)(vWidth*((double)pHeight/pWidth));

পূর্বরূপ - চিত্রটি "প্রসারক_পিতা" এবং স্কেলটাইপকে "ক্রপকেন্দ্র" এ সেট করা হয়েছে

ছবি - বিটম্যাপ অবজেক্টটি ইমেজভিউ src এ সেট করতে হবে।

এটা আমার জন্য বেশ ভাল কাজ করে।


এই কোডটি কোথায় রাখা উচিত তা আপনি ব্যাখ্যা করেন নি । আপনি = vw*ph/pwসরল পরিবর্তে কেন করেন তাও আপনি ব্যাখ্যা করেননি = vw। (আমি মনে করি আপনি বর্গাকার প্রাকদর্শন জোর না করে উত্স চিত্রের দিক অনুপাত সংরক্ষণের জন্য এটি করেন))
টুলমেকারস্টেভ

0

এক্সএমএল লেআউট ফাইলে আপনি এটি করার কোনও উপায় আছে বলে আমি মনে করি না, এবং আমি মনে করি না android:scaleTypeআপনি যেমন চান তেমন বৈশিষ্ট্য কাজ করবে।
একমাত্র উপায় হ'ল এটি প্রোগ্রামগতভাবে করা। আপনি প্রস্থটি পূর্ণ_পিতাতে সেট করতে পারেন এবং হয় স্ক্রিনের প্রস্থকে উচ্চতার হিসাবে নিতে Viewপারেন বা View.getWidth()পদ্ধতিটি ব্যবহার করতে পারেন ।


0

ইমেজভিউ "স্কেলটাইপ" ফাংশন আপনাকে এখানে সহায়তা করতে পারে।

এই কোডটি অনুপাতটি রাখে এবং চিত্রটিকে শীর্ষে রাখবে:

android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:scaleType="fitStart"

স্কেলটাইপ ব্যবহার করে সম্ভাবনা এবং উপস্থিতিগুলি দেখানোর জন্য এখানে একটি দুর্দান্ত পোস্ট।

ইমেজভিউ স্কেলটাইপ নমুনা


"স্কেলটাইপ" এখানে সহায়তা করে না। লক্ষ্যটি হ'ল ইমেজভিউটি নিজেই সর্বদা বর্গক্ষেত্রের হয়, কেবল তার ভিতরে থাকা চিত্রটি নয়। স্কেলটাইপ সহ, চিত্রটি ভিউ চিত্রের চেয়ে বড় হতে পারে।
নির্মাতা স্টিভ

0

আমি এটি পছন্দ করেছিলাম -

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