2013-03-13 9 views
32

Ich habe eine Aktivität mit einem Headerbild erstellt. Dieses Header-Image wird ursprünglich im Layout-XML-Code der Aktivität mit einem ImageView erstellt, wobei der scaleType auf centerCrop gesetzt ist. Dies macht, was ich will, zentriert das Bild, schneidet es im Hochformat links und rechts ab und zeigt alles im Querformat.Entsprechung von ImageView scaleType 'centerCrop' zu Bitmap Drawable Gravity

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingTop="30dp" 
    android:paddingBottom="6dp" 
    android:paddingLeft="6dp" 
    android:paddingRight="6dp" 
    android:background="#919EAC" 
    android:orientation="vertical" > 

<ImageView 
    android:id="@+id/header_image" 
    android:layout_width="match_parent" 
    android:layout_height="120dp" 
    android:contentDescription="@string/header_description" 
    android:scaleType="centerCrop" 
    android:src="@drawable/header" /> 

    .... <other views> ... 

Ich möchte dies mit einem Hintergrund ziehbar ersetzen, so dass ich den Header Bildraum verwenden kann, um Daten anzuzeigen, und es spart ich in den verschiedenen Aktivitäten das gleiche Layout zu wiederholen.

Aus diesem Grund habe ich eine ziehbar geschaffen haben, die ich im Android verweisen: Hintergrund Attribut:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android" > 
     <item> 
      <shape android:shape="rectangle" > 
       <solid android:color="#919EAC" /> 
      </shape> 
     </item> 
     <item> 
      <bitmap 
       android:antialias="true" 
       android:gravity="top|center_horizontal" 
       android:src="@drawable/header" /> 
     </item> 
    </layer-list> 

Diese ziehbar definiert den farbigen Hintergrund, die sonst das Layout definieren würde und definiert einen Header-Bild, das Andernfalls würde es als ImageView im Layout enthalten sein.

Aber jetzt ist mein Bild skaliert, während ich möchte, dass es beschnitten wird.

Überprüfung der Android-Dokumentation ich andere Schwerkraft Modi versucht, wie

android:gravity="top|clip_horizontal" 

Aber es scheint immer noch angezeigt werden/Maßstab anders als die Bildansicht.

Was wäre die korrekte Definition des Hintergrunds zeichnbar?

+4

Konnten Sie eine Lösung für Ihr Problem finden? Ich kämpfe mit der gleichen Sache. – Marty

+0

bezogen http://stackoverflow.com/questions/5119366/set-size-of-layered-drawable – mathheadinclouds

+1

Wie wäre es mit "fill_vertical | clip_horizontal" –

Antwort

-3

Mit scaleType = "centerCrop" haben Sie ein gewünschtes Ergebnis erreicht, Schneiden Sie die Ränder des Bildes und zeigen Sie den mittleren Teil, der zu dieser Größe passt.

Für Image:

ImageView haben scaleType Attribut, das nur für das Bild arbeitet, die, um es als Quelle eingestellt wird angezeigt. als wäre es TextView dann Text ist es die Quelle.

Auch Sie haben vielleicht bemerkt, dass scaleType nicht für Bild funktioniert, das als Hintergrund eingestellt ist, das nur mit Bild funktioniert, das als Quelle entweder in XML zur Laufzeit geliefert wird.

Layout

Layout können Hintergrundbilder zeigen, aber gibt es kein jedes Attribut für das Layout gegeben, die die Hintergrundbilder und skalieren es gemäß dem Wert des Attributs verarbeiten können.

So sollten Sie aufhören zu fragen, die Einrichtung ImageView von Layout, weil es es nicht hat.

2 verschiedene Lösungen für Ihr Problem

1) Halten Sie die richtige Bilder Hintergrund-Header in verschiedenen ziehbar Ordner und es verwenden, so benötigen Sie es nicht maßstabsLaufZeit, wie Sie bereits für das entwickelte Größe unterschiedlich.

2) Sie müssen nur Ihre XML-Redesign, wie unter Beispiel

<RelativeLayout 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    > 

    <ImageView 
     android:id="@+id/imageView1" 
     android:layout_width="wrap_content" 
     android:layout_height="50dp" 
     android:background="@drawable/subway" 
     android:scaleType="centerCrop" /> 

    <Button 
     android:layout_width="50dp" 
     android:layout_height="50dp" 
     android:layout_alignParentLeft="true" 
     /> 

    <EditText 
     android:id="@+id/editText1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentRight="true" 
     /> 
</RelativeLayout> 
0

Ich weiß nicht, wie es mit dem Hintergrund zu tun. Sie können andere Lösungen versuchen:

1) Einfachste Lösung zum Anzeigen von etwas auf Bild oben ist, sie beide in ein Layout zu legen, so dass sie sich überschneiden. Sie können zum Beispiel ein RelativeLayout mit den Dimensionen von ImageView verwenden, das ImageView ist in beiden Dimensionen match_parent und in der Mitte eine TextView.

2) Sie können das Imageview in einem anderen Layout speichern, z. B. header.xml, und es verwenden, indem Sie header.xml überall dort, wo Sie es brauchen.

3) Wenn das Layout, das oben auf ImageView angezeigt wird, überall gleich ist, können Sie ein benutzerdefiniertes Layout mit einem ImageView erstellen und ein TextView in der Mitte verwenden und dieses Layout überall verwenden. Sie können dann die TextView-Zeichenfolge für dieses benutzerdefinierte Layout festlegen. Sie können mehr über benutzerdefinierte Layouts lesen, sie sind einfach.

2

Um ein Bitmap in Code-Center Ernte dies zu tun:

public static Bitmap cropCenter(Bitmap bmp) { 
    int dimension = Math.min(bmp.getWidth(), bmp.getHeight()); 
    return ThumbnailUtils.extractThumbnail(bmp, dimension, dimension); 
} 

Ich weiß nicht von irgendeiner anderen Art und Weise weise eine Bitmap xml centerCrop.

Ich hoffe, es hilft jedem.

fand ich diese Lösung aus diesem Beitrag: Android Crop Center of Bitmap

1

ich dieses Problem mit einem Dekorateur gelöst, die das Seitenverhältnis des zugrunde liegenden ziehbar hält: https://gist.github.com/rudchenkos/e33dc0d6669a61dde9d6548f6c3e0e7e

Leider gibt es keine Möglichkeit, sie anzuwenden ist aus XML so mache ich das am Anfang meiner splash Aktivität:

public class SplashActivity extends AppCompatActivity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     final Drawable bg = getResources().getDrawable(R.drawable.screen); 
     getWindow().setBackgroundDrawable(new CenterCropDrawable(bg)); 

     ... 
    } 
} 

, die auf die Angabe der ziehbar als android:windowBackground entspricht in etwa in das Aktivitätsthema

Verwandte Themen