2016-06-14 12 views
1

Ich habe eine Aktivität mit einem Bild in einer Symbolleiste und eine Aktivität, die wie ein Dialog mit dem gleichen Bild im großen themed ist. Dies sind die Layout-Dateien:Android Shared Element zu Dialog Activity

my_activity.xml:

... 

<com.makeramen.roundedimageview.RoundedImageView 
    android:id="@+id/my_image" 
    android:layout_width="40dp" 
    android:layout_height="40dp" 
    android:scaleType="centerCrop" 
    android:src="@drawable/my_drawable" 
    android:transitionName="@string/my_image_transition" 
    app:riv_oval="true" /> 

... 

my_dialog_activity.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical"> 

    <ImageView 
     android:id="@id/my_image" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:scaleType="centerCrop" 
     android:src="@drawable/my_drawable" 
     android:tint="@color/accent" 
     android:transitionName="@string/my_image_transition" /> 

</LinearLayout> 

Der Dialog Aktivität ein Dialog wird durch dieses Thema im Manifest Anwendung:

<style name="MyDialogActivity" parent="Theme.AppCompat.Light.Dialog.MinWidth"> 
    <item name="windowNoTitle">true</item> 
    <item name="android:windowMinWidthMajor">@dimen/abc_dialog_min_width_major</item> 
    <item name="android:windowMinWidthMinor">@dimen/abc_dialog_min_width_minor</item> 
</style> 

Sowohl die Aktivität als auch der Dialog sehen genau so aus, wie sie aussehen sollen.

Jetzt möchte ich eine gemeinsame Elementanimation mit diesen ImageViews implementieren: Wenn der Benutzer auf das Bild der ersten Aktivität klickt, muss es wachsen und sich in die Mitte des Bildschirms bewegen, damit es dem größeren Dialogbild entspricht.

Also schrieb ich diesen Code:

Intent intent = new Intent(MyActivity.this, MyDialogActivity.class); 

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
    ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(
     MyActivity.this, v, getString(R.string.my_image_transition) 
    ); 
    startActivityForResult(intent, 999, options.toBundle()); 
} else { 
    startActivityForResult(intent, 999); 
} 

Die Animation tatsächlich passiert, aber das bewegte Bild ist nur sichtbar innerhalb des Bereichs des Dialogs. Sie sehen also ein Bild, das aus der oberen linken Ecke des Dialogfelds kommt, aber Sie sehen es nicht von der ersten Aktivität außerhalb des Dialogs.

Hier ist eine HTML-Version, wie es aussehen soll und was es derzeit wie folgt aussieht: https://jsfiddle.net/wutqdh9d/1/

+0

Warum brauchen Sie aus diesem Grund Dialogaktivität? animiere einfach dein Bild in der Hauptaktivität in die Mitte und platziere ein Layout mit weißem Hintergrund und lasse es erscheinen, wenn das Animieren endet. – uguboz

+0

Die Dialogaktivität enthält auch andere Ansichten wie eine Werkzeugleiste. –

Antwort

4

Die Aktie Element Animation in der zweiten Tätigkeit gezogen wurde. Wenn Sie das Thema Theme.AppCompat.Light.Dialog.MinWidth verwenden, ist die Fenstergröße der zweiten Aktivität kleiner als der Zeichnungsbereich der Animation.

Daher nur loswerden mit dem Dialogfeld Thema. Um dies weiter unten zu ändern:

<style name="MyDialogActivity" parent="Theme.AppCompat.NoActionBar"> 
    <item name="android:windowNoTitle">true</item> 
    <item name="android:windowBackground">@android:color/transparent</item> 
    <item name="android:windowIsTranslucent">true</item> 
    <item name="android:windowContentOverlay">@null</item> 
    <item name="android:backgroundDimEnabled">true</item> 
</style> 

Die zweite Aktivität Layout:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:orientation="vertical" 
      android:gravity="center"> 

<ImageView 
     android:id="@id/my_image" 
     android:layout_width="200dp" 
     android:layout_height="200dp" 
     android:scaleType="centerCrop" 
     android:src="@drawable/your_icon" 
     android:transitionName="@string/my_image_transition"/> 

Dann wird es diesen Effekt (http://gph.is/1UzZZzV) sein.

Ich hoffe, es hilft.

Referenz: https://stackoverflow.com/a/28508306/3171537

+0

Vielen Dank! Ich habe auch die ImageView mit einer CardView umwickelt, um den Dialog zu erhalten. Was nicht funktioniert, ist das Schließen des Dialogs durch Tippen auf die Außenseite, aber dies könnte mit einigen Klick-Listenern gelöst werden. –

+0

Ja, einfach hinzufügen Klick-Listener auf einigen Layouts. Das ist sehr einfach. – JohnWatsonDev

0
<style name="dialog_style_activity"> 
     <item name="android:windowIsTranslucent">true</item> 
     <item name="android:windowBackground">@android:color/transparent</item> 
     <item name="android:windowContentOverlay">@null</item> 
     <item name="android:windowNoTitle">true</item> 
     <item name="android:backgroundDimEnabled">true</item> 
    </style> 

Above Stil ist für mich Arbeit. Referenzieren Sie diesen Stil in manifest.xml.