【问题标题】:Shared Element Transition in GridView Weird behaviorGridView 中的共享元素转换奇怪的行为
【发布时间】:2015-10-01 07:57:00
【问题描述】:

我在 gridView 适配器中的 imageView 和 details 活动中的 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的监听器启动detailsActivtiy:

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>

在我的主题中我声明&lt;item name="android:windowContentTransitions"&gt;true&lt;/item&gt;我没有使用任何自定义动画,尽管我尝试了一些并且我也尝试推迟过渡但没有解决问题。

【问题讨论】:

    标签: android gridview shared-element-transition


    【解决方案1】:

    我发现问题在于我正在使用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;
              }
          });
      }
    

    【讨论】:

      【解决方案2】:

      尝试将您的课程放入 manifest.AS

      【讨论】:

      • 抱歉,您将我的课程放入 manifest.AS 是什么意思?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-11
      • 2021-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多