Scalare ImageView alla width del dispositivo

Nella mia applicazione Android ho un'attività che mostra le immagini che hanno la seguente dimensione 244 x 330 . Voglio mostrare quelle immagini in width completa del dispositivo.

Il mio file di layout sembra questo:

  • Come posso usare l'opzione "multi-dex"?
  • Crittografia con AES-256 e il vector di initialization
  • Utilizza il carattere Roboto in app con il livello API minimo 14
  • Come filtrare il logcat Android per applicazione?
  • Apertura di webview non in un nuovo browser
  • Frammento di un altro frammento di emissione
  •  <?xml version="1.0" encoding="utf-8"?> <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent"> <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical"> <ImageView android:id="@+id/news_image" android:layout_height="fill_parent" android:layout_width="fill_parent" android:layout_marginLeft="18dip" android:layout_marginRight="18dip" android:background="#aaaaaa" /> </LinearLayout> </ScrollView> 

    Ho provato a impostare la ScaleType dell'ImagineView ma non esiste un tipo di scala che scala l'image ImageView proporzionale. Come posso scalare l'image proporzionalmente per adattarsi all'integer schermo in modalità orizzontale e in modalità ritratto?

    Fondamentalmente ciò che voglio è qualcosa di simile a ScaleType.CENTER_CORP ma che imposta anche l'altezza proporzionale per l'image in modo da poterlo vedere tutto e non solo una parte dell'image.

    Modifica la causa So che ti sto confondendo con la mia "strana" questing.

    Voglio mostrargli un'image. Questo è quello che ottengo al momento con il mio layout. Voglio riempire l'intera area grigia riducendo l'image come grande come necessario. Come posso realizzarlo?

    Quando imposta il ScaleType a CENTER_CROP ottengo questo

    ma questo non è quello che voglio perché non vedi l'intera image solo una parte dal centro.

    E questo è quello che voglio che sia:

    Spero che questo ti aiuti a capire quello che sto cercando di realizzare. Qualcuno sa come farlo?

    Modifica 2:

    Potrebbe sembrare strano e poco confuso che sto cercando di visualizzare un'image più grande dell'altezza rispetto alla dimensione dello schermo, ma poiché sto utilizzando un ScrollView nel mio layout di esempio questo dovrebbe essere ok e l'utente potrebbe scorrere se vuole per visualizzare l'area non visualizzata.

    Spero che questo aiuta a capire quello che sto cercando di fare.

  • Servizio di notifica Google / Apple Push (APNS / GCM)
  • come get il nome di file da URI
  • Android impedisce l'triggerszione immediata del servizio di allarme se il tempo di allarme è passato per il giorno
  • Come impostare un'etichetta diversa per il lancio anziché il titolo di attività?
  • Come rimuovere lo spazio superiore e inferiore sulla visualizzazione di text di Android
  • Vista di Android sparisce quando si esce dal genitore
  • 9 Solutions collect form web for “Scalare ImageView alla width del dispositivo”

    Ho provato veramente each ScaleType nel mio ImageView con fill_parent e wrap_content ma nessuno di loro ha funzionato. Ho anche provato tutto quello che ho trovato su Google, ma niente ha funzionato per me o così è venuto su qualcosa da solo.

    Era chiaro che l'ImageView non sta scalando la mia image come volevo essere ridimensionata, per cui wherevo scalare da solo. Dopo aver scalato la bitmap, imposterei la nuova Bitmap come sorgente dell'image per ImageView. Questo funziona abbastanza bene e sembra molto buono sul G1 e sul Motorola Milestone 2.

    Ecco tutti i pezzi del mio codice

    Disposizione:

     <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent"> <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:id="@+id/news_wrapper"> <ImageView android:id="@+id/news_image" android:layout_height="fill_parent" android:layout_width="fill_parent" android:layout_marginLeft="18dip" android:layout_marginRight="18dip" android:background="#aaaaaa" /> </LinearLayout> </ScrollView> 

    Attività

     public class ScalingImages extends Activity { private ImageView imageView; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.test_margin); this.imageView = (ImageView)findViewById(R.id.news_image); // The image is coming from resource folder but it could also // load from the internet or whatever Drawable drawable = getResources().getDrawable(R.drawable.img); Bitmap bitmap = ((BitmapDrawable)drawable).getBitmap(); // Get scaling factor to fit the max possible width of the ImageView float scalingFactor = this.getBitmapScalingFactor(bitmap); // Create a new bitmap with the scaling factor Bitmap newBitmap = Util.ScaleBitmap(bitmap, scalingFactor); // Set the bitmap as the ImageView source this.imageView.setImageBitmap(newBitmap); } private float getBitmapScalingFactor(Bitmap bm) { // Get display width from device int displayWidth = getWindowManager().getDefaultDisplay().getWidth(); // Get margin to use it for calculating to max width of the ImageView LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams)this.imageView.getLayoutParams(); int leftMargin = layoutParams.leftMargin; int rightMargin = layoutParams.rightMargin; // Calculate the max width of the imageView int imageViewWidth = displayWidth - (leftMargin + rightMargin); // Calculate scaling factor and return it return ( (float) imageViewWidth / (float) bm.getWidth() ); } } 

    Utilizzare la class

     public class Util { public static Bitmap ScaleBitmap(Bitmap bm, float scalingFactor) { int scaleHeight = (int) (bm.getHeight() * scalingFactor); int scaleWidth = (int) (bm.getWidth() * scalingFactor); return Bitmap.createScaledBitmap(bm, scaleWidth, scaleHeight, true); } } 

    Se esiste un modo migliore o più preciso di realizzare la stessa scalatura, per favore fatecelo sapere perché non riesco a credere che una cosa così banale sia così difficile da realizzare.

    Spero davvero di vedere un modo migliore per farlo.

    Grazie per aver letto.

    il modo più semplice è quello di aggiungere android: adjustViewBounds = "true" al ImageView e impostare il tipo di scala in "fitCenter"

    Un po 'confuso su quello che stai cercando, esattamente. Se si sta scalando per adattarsi allo schermo, hai tre opzioni, due delle quali sono valide se stai mantenendo le proporzioni. È ansible utilizzare ScaleType fitCenter, che renderà l'image adatta entro i limiti proporzionalmente, oppure è ansible utilizzare centerCrop (di cui si è provato), che estenderà il lato più corto dell'image per adattarsi al contenitore (il che significa che alcuni saranno tagliati fuori sulla dimensione più lunga). Non si può allungare per adattarsi alla width e all'altezza senza la possibilità di tagliare o sporgere in modo sproporzionato.

    EDIT : Okay, credo di avere il tuo punto ora. In primo luogo, avrei impostato il tuo LinearLayout a wrap_content per l'altezza. In secondo luogo, in codice, ecco un modo in cui puoi farlo in che modo posso pensare. Probabilmente c'è anche un altro modo per farlo prima di get le size dello schermo e quindi fare createScaledBitmap con le nuove size e quindi impostare la risorsa di background.

     final ImageView newsImage = (ImageView)findViewById(R.id.news_image); //get details on resolution from the display DisplayMetrics metrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(metrics); //going to set what happens as the layout happens newsImage.getViewTreeObserver().addOnGlobalLayoutListener( new ViewTreeObserver.OnGlobalLayoutListener() { public void onGlobalLayout() { int oldHeight, oldWidth, newHeight, newWidth; //we want the new width to be as wide as the screen newWidth = metrics.widthPixels; oldHeight = newsImage.getDrawable().getIntrinsicHeight(); oldWidth = newsImage.getDrawable().getIntrinsicWidth(); //keeping the aspect ratio, the new height should be w1/h1 = w2/h2 newHeight = Math.floor((oldHeight * newWidth) / oldWidth); LinearLayout.LayoutParams params = (LinearLayout.LayoutParams)newsImage.getLayoutParams(); params.height = newHeight; params.width = newWidth; newsImage.setLayoutParams(params); newsImage.setScaleType(ScaleType.CENTER); newsImage.invalidate(); newsImage.getViewTreeObserver().removeGlobalOnLayoutListener(this); } } } 

    Ho girato dappertutto e non ho potuto trovare una soluzione. Ecco quello che ho fatto, che ha funzionato per me e con una vista di scorrimento.

    File XML:

     <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:fillViewport="true" > <ImageView android:id="@+id/manga_page_image" android:layout_width="match_parent" android:layout_height="0dp" android:adjustViewBounds="true" android:scaleType="fitCenter" /> </ScrollView> 

    Hai provato a impostarlo in modo programmato tramite ImageView.setScaleType() ?

    setAdjustViewBounds( false ) potrebbe anche aiutare.

    Modifica: mi dispiace, ho letto male la domanda. Indipendentemente, setAdjustViewBounds() potrebbe ancora aiutare. Mai usato però.

    Voglio mostrare quelle immagini in width completa del dispositivo.

    Questo è semplice. Hai solo impostazioni di margine sbagliate. Rimuove queste righe e la tua image verrà visualizzata in width completa del dispositivo:

     android:layout_marginLeft="18dip" android:layout_marginRight="18dip" 

    Non vedo più le immagini e la domanda è vecchia, ma solo nel caso in cui qualcun altro lo trovi e ha lo stesso problema. Non sarebbe meglio get lo float screenWidth = getResources().getDisplayMetrics().widthPixels e impostare i LayoutParamters ImageView in modo programmato per scalare l'image in screenWidth . Solo un'idea !!

    riescono a raggiungere quello che volevo, che spera sia lo stesso del tuo objective:

     @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.pgviewer); ImageView PgContainer = (ImageView)findViewById(R.id.imageView1); String Page = String.valueOf(getIntent().getExtras().getInt("Page")); try { PgContainer.setImageBitmap(getBitmapFromAsset(Page)); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } PgContainer.setScaleType(ScaleType.FIT_CENTER); PgContainer.scrollTo(0, 0); PgContainer.setScrollBarStyle(0); } 

    quindi per scalare la bitmap:

     private Bitmap getBitmapFromAsset(String strName) throws IOException { AssetManager assetManager = getAssets(); InputStream istr = assetManager.open(strName+".png"); Bitmap bitmap = BitmapFactory.decodeStream(istr); float screenWidth = getResources().getDisplayMetrics().widthPixels; int ih=bitmap.getHeight(); int iw=bitmap.getWidth(); float scalefactor = screenWidth/iw; //w = 480, h=~ //int newh = bitmap.getHeight()/bitmap.getWidth(); return android.graphics.Bitmap.createScaledBitmap(bitmap, (int)(iw*scalefactor), (int)(ih*scalefactor), true); //return bitmap; } 

    Quello che ho usato per ridimensionare ImageView con la risoluzione del dispositivo è impostare le properties; rispetto al genitore. Così come le size del padre cambiano, la dimensione degli elementi wil scala pure. Ecco un esempio del mio activity_main.xml

     <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.csci567.singleimagerequest.MainActivity"> <ImageView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/image_display" android:layout_marginBottom="100dp" android:layout_marginLeft="15dp" android:layout_marginRight="15dp" android:layout_centerHorizontal="true" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Upload Image" android:id="@+id/upload_button" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:layout_marginBottom="22dp" /> </RelativeLayout 

    È ansible mettere più elementi regolando i margini.

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.