GridView中的共享元素转换奇怪的行为

时间:2015-09-23 04:21:43

标签: android gridview shared-element-transition

我在gridView适配器中的imageView和详细活动中的imageView之间使用共享元素转换,但是当我单击GridView中的某个项目时,imageView将开始从右侧开始动画位置它总是从原始位置开始,当我回击时,图像会正确地动画到正确的位置,这样只有在输入新活动时才会出现故障。

https://youtu.be/cprBHWPVNbk(我已经放慢了动画的速度,以便明白故障)。

在BrowseFragment的OnCreate中

gridView.setOnItemClickListener(new OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        ImageView gridPoster = (ImageView) view.findViewById(R.id.movie_poster);
        gridPoster.setTransitionName("poster" + position);
        listener.onItemSelected(movie,gridPoster);

然后,BrowseActivity的监听器启动详细信息:

ActivityOptionsCompat optionsCompat = ActivityOptionsCompat.makeSceneTransitionAnimation
                    (this, posterView,posterView.getTransitionName());
Intent detailsIntent = new Intent(this, MovieDetalisActivity.class);
detailsIntent.putExtra(getString(R.string.movie_details_extra_key), movie);
detailsIntent.putExtra("transition",posterView.getTransitionName());
            ActivityCompat.startActivity(this, detailsIntent, optionsCompat.toBundle());

然后在DetailsFragment的OnCreate中

ImageView poster = (ImageView) rootView.findViewById(R.id.poster);
poster.setTransitionName(getActivity().getIntent().getStringExtra("transition"));

GridViewItem布局:

<LinearLayout 

xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:id="@+id/gird_layout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="2dp"
    android:background="#4e585c"
    android:clipChildren="false">
    <ImageView
        android:layout_width="match_parent"
        android:layout_height="240dp"
        android:id="@+id/movie_poster" />

    <RelativeLayout
        android:id="@+id/thumb_bottom_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:minHeight="48dp"
        android:gravity="center_vertical">

        <TextView
            android:id="@+id/movie_name"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:gravity="center_vertical"
            android:paddingLeft="16dp"
            android:paddingRight="16dp"
            android:fontFamily="sans-serif"
            android:textColor="#aaa"
            android:textSize="16sp"

            />    
    </RelativeLayout>
</LinearLayout>

DetailsView布局的一部分:

 <android.support.v4.widget.NestedScrollView
        android:layout_height="match_parent"
        android:layout_width="match_parent"
        android:id="@+id/scrollView"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"
        android:clipChildren="false">
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            tools:context="com.example.rashwan.popularmovies.MovieDetailsActivityFragment"
            android:orientation="vertical"
            android:focusableInTouchMode="true">
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:minHeight="310dp"
                android:orientation="horizontal"
                android:padding="10dp"
                android:baselineAligned="false"
                android:clipChildren="false">
                <FrameLayout
                    android:layout_width="0dp"
                    android:layout_weight="1"
                    android:layout_height="match_parent"
                    android:clipChildren="false">
                    <ImageView
                        android:layout_width="wrap_content"
                        android:minWidth="220dp"
                        android:layout_height="fill_parent"
                        android:layout_gravity="center_horizontal"
                        android:id="@+id/poster" />
                </FrameLayout>

                <LinearLayout
                    android:layout_width="0dp"
                    android:layout_height="match_parent"
                    android:layout_weight="1"
                    android:orientation="vertical"
                    android:padding="5dp"
                    android:gravity="center_vertical">

                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="ReleaseDate"
                        android:id="@+id/release_date"
                        android:layout_gravity="center_horizontal"
                        android:textAppearance="?android:attr/textAppearanceLarge"
                        android:padding="5dp"
                        />
                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="UserRating"
                        android:id="@+id/user_rating"
                        android:layout_gravity="center_horizontal"
                        android:textAppearance="?android:textAppearanceLarge"/>

                </LinearLayout>
            </LinearLayout>

在我的主题中,我声明<item name="android:windowContentTransitions">true</item>我没有使用任何自定义动画,虽然我尝试了一些,但我也尝试推迟过渡,但没有解决问题。

2 个答案:

答案 0 :(得分:0)

我发现问题在于我使用picasso库加载详细信息片段中的图像,因此我需要在详情活动中使用postponeEnterTransition();细节片段我使用getActivity().startPostponedEnterTransition();开始转换,但仅在使用picasso加载图片后。

以下是详细信息片段中的代码:

Picasso.with(getActivity()).load(posterUri).fit().into(poster, new Callback() {
  @Override
  public void onSuccess() {
      poster.getViewTreeObserver().addOnPreDrawListener(
      new ViewTreeObserver.OnPreDrawListener() {
          @Override
          public boolean onPreDraw() {
              if (isLollipop) {
                  poster.getViewTreeObserver().removeOnPreDrawListener(this);
                  getActivity().startPostponedEnterTransition();
              }
              return true;
          }
      });
  }

答案 1 :(得分:-3)

尝试将您的课程放在manifest.AS中