J'ai une application avec deux activities
, où la seconde fonctionne comme un «sélecteur» d'image et fournit des informations à la première, de sorte qu'un ImageView
peut être mis à jour en conséquence.Elément partagé lors de l'utilisation de startActivityForResult
Pour cela, je vous appelle la deuxième activity
par startActivityForResult()
et mise à jour du ImageView
selon les informations reçues sur onActivityResult()
.
Le problème se pose lorsque je tente d'animer un élément partagé entre le sélecteur et le principal Activity
: il semble que la transition « instantanés » la première Activity
, et même si le ImageView
est mis à jour dès que les Activity
CV, la animation de transition va "scintiller" une ancienne version du View
avant d'afficher la version actuelle.
Voici un exemple d'application que j'ai fait pour illustrer ce dont je parle:
Quelle serait la meilleure façon de mettre en œuvre cette animation en toute transparence? Une autre approche devrait-elle être utilisée?
Voici le code utilisé pour l'exemple:
Activité principale
public class MainActivity extends AppCompatActivity {
ImageView mainImageView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getSupportActionBar().setTitle("Main Activity");
mainImageView = (ImageView) findViewById(R.id.imageView);
findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, PickerActivity.class);
ActivityOptionsCompat options = ActivityOptionsCompat.
makeSceneTransitionAnimation(MainActivity.this, mainImageView, "shape_transition");
startActivityForResult(intent, 1, options.toBundle());
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
super.onActivityResult(requestCode, resultCode, intent);
int shapeNumber = intent.getIntExtra("shape_number", -1);
switch (shapeNumber) {
case 1:
mainImageView.setImageResource(R.drawable.blue);
break;
case 2:
mainImageView.setImageResource(R.drawable.green);
break;
default:
//something else
break;
}
}
}
Picker Activité:
public class PickerActivity extends AppCompatActivity {
ImageView blueImageView;
ImageView greenImageView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_picker);
getSupportActionBar().setTitle("Picker Activity");
blueImageView = (ImageView) findViewById(R.id.imageView2);
blueImageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
blueImageView.setTransitionName("shape_transition");
Intent intent = new Intent(PickerActivity.this, MainActivity.class);
intent.putExtra("shape_number", 1);
setResult(RESULT_OK, intent);
finishAfterTransition();
}
});
greenImageView = (ImageView) findViewById(R.id.imageView3);
greenImageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
greenImageView.setTransitionName("shape_transition");
Intent intent = new Intent(PickerActivity.this, MainActivity.class);
intent.putExtra("shape_number", 2);
setResult(RESULT_OK, intent);
finishAfterTransition();
}
});
}
}
xml Activité principale:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="demonstration.sharedelementproblemexample.MainActivity">
<ImageView
android:layout_width="128dp"
android:layout_height="128dp"
android:id="@+id/imageView"
android:transitionName="shape_transition"
android:layout_alignParentTop="true"
android:layout_alignParentStart="true"
android:src="@drawable/red" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Pick"
android:id="@+id/button"
android:layout_below="@+id/imageView"
android:layout_alignParentStart="true" />
</RelativeLayout>
Picker Activité xml:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="demonstration.sharedelementproblemexample.PickerActivity">
<ImageView
android:layout_width="128dp"
android:layout_height="128dp"
android:id="@+id/imageView2"
android:layout_alignParentBottom="true"
android:layout_alignParentEnd="true"
android:src="@drawable/blue" />
<ImageView
android:layout_width="128dp"
android:layout_height="128dp"
android:id="@+id/imageView3"
android:src="@drawable/green"
android:layout_alignParentStart="true"
android:layout_alignTop="@+id/imageView2" />
</RelativeLayout>