Am un imageview. Vreau lățimea sa să fie fill_parent. Vreau înălțimea sa de a fi, indiferent de lățimea sfârșește prin a fi. De exemplu:
<ImageView
android:layout_width="fill_parent"
android:layout_height="whatever the width ends up being" />
Este posibil așa ceva într-un layout fișier fără a fi nevoie pentru a crea propriul meu punct de vedere de clasă?
Multumesc
Actualizare: 14 Sep 2017
Potrivit unui comentariu de mai jos, procentul support library este învechită începând cu Android Support Library 26.0.0. Acesta este noul mod de a face asta:
<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>
Vezi here
Depreciat:
În conformitate cu acest mesaj de către Dezvoltatorii Android, tot ce trebuie să faci acum este să-și încheie ce vrei într-un PercentRelativeLayout sau un PercentFrameLayout, și apoi specificați raporturile sale, așa
<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>
Poate că acest lucru va răspunde la întrebarea dumneavoastră:
<ImageView
android:id="@+id/cover_image"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:scaleType="fitCenter"
android:adjustViewBounds="true" />
Puteți ignora scaleType
atribut pentru această situație specială.
Acest lucru poate fi realizat folosind LayoutParams pentru a seta dinamic în Vedere înălțimea odată ce știi Vedere lățimea la runtime. Aveți nevoie pentru a utiliza un Runnable fir, în scopul de a obține Opinii cu lățimea la runtime sau altceva ce'll încerca să setați Înălțimea înainte de a ști View's lățime pentru că aspectul nu't a fost atras încă.
Exemplu de cum am rezolvat problema mea:
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();
}
});
La LayoutParams trebuie să fie de tipul de Părinte Vedere că opinia dumneavoastră este în. Mi FrameLayout este în interiorul unui RelativeLayout în fișierul xml.
mFrame.postInvalidate();
este numit pentru a forța vedere pentru a aspira în timp ce pe un thread separat decât firul UI
Aici am ceea ce am făcut pentru a avea o ImageButton care întotdeauna au o lățime egală cu înălțimea sa (și pentru a evita prost margini goale într-o direcție, pe care o consider ca un bug al SDK...):
Am definit un SquareImageButton clasa care se extinde de la ImageButton:
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);
}
}
Aici este meu xml:
<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"
/>
Funcționează ca un farmec !
Nu puteam't obține David Chu's a răspunde pentru a lucra pentru o RecyclerView element și-a dat seama ca am nevoie pentru a constrânge ImageView la mamă. Set ImageView lățime a 0dp și constrânge ei de început și de sfârșit pentru mamă. Am'm nu sunt sigur dacă setarea de lățime a
wrap_content " sau " match_parent` funcționează, în unele cazuri, dar cred că aceasta este o modalitate mai bună de a obține copilul de un ConstraintLayout pentru a umple părintelui său.
<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>
Puteți't face cu layout-ul singur, am'am incercat. Am terminat de scris un foarte simplu de clasă să se ocupe de ea, puteți să-l verifica pe github. SquareImage.java Său parte dintr-un proiect mai mare, dar nimic un pic copiați și inserați poate't fix (licențiat sub Apache 2.0)
În esență, trebuie doar să setați înălțimea/lățimea egală cu alte dimensiuni (în funcție de modul în care doriți să-l scară)
Notă: puteți să-l pătrat fără o clasă personalizat folosind scaleType
atribut dar punctul de vedere's limite se extind dincolo de imagine vizibilă, ceea ce face din aceasta o problemă dacă sunteți plasarea alte puncte de vedere aproape.
În Android 26.0.0 PercentRelativeLayout a fost depreciat.
Cel mai bun mod de a rezolva aceasta este acum cu ConstraintLayout
astfel:
<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>
Aici este o tutorial despre cum să adăugați ConstraintLayout
pentru proiectul dumneavoastră.
Pentru a seta ImageView egală cu jumătate din ecran, trebuie să adăugați următoarele la XML pentru ImageView:
<ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_centerInParent="true"
android:scaleType="fitXY"
android:adjustViewBounds="true"/>
Apoi setați înălțimea egală cu lățimea, aveți nevoie pentru a face în cod. În anii getView
metoda GridView
adaptor, set `ImageView înălțime egală cu a sa a măsurat lățimea:
mImageView.getLayoutParams().height = mImageView.getMeasuredWidth();
Pentru persoanele care trec prin acum, în 2017, noul cel mai bun mod de a obține ceea ce doriți este de a folosi ConstraintLayout astfel:
<ImageView
android:layout_width="0dp"
android:layout_height="0dp"
android:scaleType="centerCrop"
app:layout_constraintDimensionRatio="1:1" />
Și don't uita pentru a adăuga constrângeri la toate cele patru direcții necesare de layout.
Construi un UI Receptiv cu ConstraintLayout
În plus, până acum, PercentRelativeLayout a fost depreciat (a se vedea documentația Android).
Aici's cum am rezolvat problema:
int pHeight = picture.getHeight();
int pWidth = picture.getWidth();
int vWidth = preview.getWidth();
preview.getLayoutParams().height = (int)(vWidth*((double)pHeight/pWidth));
preview - imageView cu lățimea asezata la "match_parent" și scaleType la "cropCenter"
imagine - Bitmap obiect pentru a seta în imageView src.
Ca's, merge destul de bine pentru mine.
Dacă imaginea dvs. de vedere este în interiorul o constrângere layout, puteți utiliza următoarele constrângeri pentru a crea o imagine pătrată vedere
<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"/>
ImageView "scaleType" funcția poate ajuta aici.
Acest cod se va păstra raportul de aspect și poziția imaginii în partea de sus:
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:scaleType="fitStart"
Aici este un mare post arată posibilitățile și apariții la utilizarea scaleType.
Eu nu't cred că's nici un fel puteți face în XML layout fișier, și eu nu't cred că android:scaleType` atribut va funcționa ca și cum ai vrea să fie. Singura modalitate ar fi sa o faci programatic. Puteți seta lățimea de fill_parent și poate lua fie lățimea ecranului ca înălțimea de "Vedere" sau pot folosi de Vedere.getWidth () metodă.