5

2 つのアクティビティがあり、どちらにも画像が含まれています。Fresco を使用して 1 つのアクティビティで画像を読み込み、Picasso を使用して別のアクティビティで画像を読み込みます。私のコードの関連部分は次のとおりです。

最初の活動のイメージ

<com.facebook.drawee.view.SimpleDraweeView
                android:id="@+id/imageView102"
                android:transitionName="image"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_gravity="center_horizontal"
                android:layout_marginLeft="9dp"
                android:layout_marginRight="9dp"
                android:layout_marginTop="10dp"
                fresco:actualImageScaleType="centerCrop"
                fresco:placeholderImage="@color/wait_color"
                fresco:placeholderImageScaleType="fitCenter"
                fresco:viewAspectRatio="1.33"
                android:layout_marginBottom="10dp" />

2 回目の活動のイメージ

<uk.co.senab.photoview.PhotoView
        android:id="@+id/zoomable"
        android:transitionName="image"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_centerInParent="true" />

2 番目のアクティビティで PhotoView を使用して、画像をズームインおよびズームアウトしています。

最初の活動

Uri uri = Uri.parse(photoUrl);
        ImageRequest request = ImageRequestBuilder.newBuilderWithSource(uri)
                .setProgressiveRenderingEnabled(true)
                .build();
        DraweeController controller = Fresco.newDraweeControllerBuilder()
                .setImageRequest(request)
                .setOldController(image.getController())
                .build();
        image.setController(controller);
image.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(ImageActivity.this, AlternateFullImageActivity.class);
                intent.putExtra("ID", photoId);
                intent.putExtra("photoUrl", photoUrl);
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                    ActivityOptionsCompat options = ActivityOptionsCompat.
                            makeSceneTransitionAnimation(ImageActivity.this, (View)image, "image");
                    startActivity(intent, options.toBundle());
                }
                else {
                    startActivity(intent);
                }
            }
        });

第二の活動

Intent intent = getIntent();
        photoId = intent.getExtras().getString("ID");
        photoUrl = intent.getExtras().getString("photoUrl");

        Picasso.with(AlternateFullImageActivity.this)
                .load(photoUrl)
                .into(image);
        mAttacher = new PhotoViewAttacher(image);

問題は、移行がスムーズではなく、非常に高速であることです。ここで、トランジションを に変更する必要があることを読みましたChangeBounds。トランジションをそれに変更するにはどうすればよいですか?また、このトランジションに 1000ms のように期間を追加するにはどうすればよいですか?

4

3 に答える 3

9

Fresco の新しいバージョンには、それを簡単に行うためのカスタム トランジションがあります。

独自のリポジトリでこの例を見てください。

https://github.com/facebook/fresco/tree/master/samples/transition

基本的に、オープニングアクティビティsetSharedElementEnterTransition()の対応するトランジションで呼び出す必要があります。

getWindow().setSharedElementEnterTransition(DraweeTransition.createTransitionSet(ScalingUtils.ScaleType.CENTER_CROP,ScalingUtils.ScaleType.FIT_CENTER));
getWindow().setSharedElementReturnTransition(DraweeTransition.createTransitionSet(ScalingUtils.ScaleType.FIT_CENTER,ScalingUtils.ScaleType.CENTER_CROP));
于 2016-07-21T13:26:03.877 に答える
4

ChangeBounds のように、TransitionSet を拡張してトランジションを指定するクラスを作成できます。例えば...

@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public class DetailTransition extends TransitionSet {
    public DetailsTransition(int duration, int delay) {
        setOrdering(ORDERING_TOGETHER);
        addTransition(new ChangeBounds()).
                addTransition(new ChangeTransform()).
                addTransition(new ChangeImageTransform()).setDuration(duration).setStartDelay(delay).setInterpolator(new AnticipateOvershootInterpolator());
    }
}

次に、共有要素遷移をフラグメントまたはアクティビティ/ウィンドウに設定します。このようなフラグメントの場合

currentFragment.setSharedElementEnterTransition(new DetailsTransition(1000, 400));

またはこのような活動のために

getWindow().setSharedElementEnterTransition(new DetailsTransition(1000, 400));
于 2016-05-27T13:37:31.133 に答える