1

Google I/O 2016 で示されているように、共有 TextView を使用して 2 つのアクティビティ間で遷移を作成しようとしましたが、テキストが一部のコンテナーに収まらないように見え、アニメーションの再生時にその端が切れてしまうため、奇妙な動作をします。ただし、そのスケーリングを妨げるものは何もありません。他の容器に入れて色々組み合わせてみましたが全く同じでした。とはいえ、2 番目のアクティビティから最初のアクティビティに戻ると、すべてが正常に機能します。テキストをスケーリングするためのクラスTextResize.javaもプロジェクトに追加され、2 つのアクティビティ間の共有要素トランジション セットに含まれています。

2 番目のアクティビティに移動するときのテキスト スケーリング アニメーションの誤りを修正するにはどうすればよいですか?

現在の動作のビデオ (スローモーション):リンク

主な活動:

public class MainActivity extends AppCompatActivity {

    private TextView textView;
    public static final String SHARED_TEXT_SIZE = "textSize";
    public static final String PADDING = "textPadding";
    public static final String TEXT_COLOR = "textColor";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        textView = findViewById(R.id.textView1);

        textView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                Intent sharedIntent = new Intent(MainActivity.this, SharedActivity.class);

                sharedIntent.putExtra(SHARED_TEXT_SIZE, textView.getTextSize());
                sharedIntent.putExtra(PADDING,
                        new Rect(textView.getPaddingLeft(),
                                textView.getPaddingTop(),
                                textView.getPaddingRight(),
                                textView.getPaddingBottom()));
                sharedIntent.putExtra(TEXT_COLOR, textView.getCurrentTextColor());

                Pair[] pairs = new Pair[1];
                pairs[0] = new Pair<View, String>(textView, "textTransition");

                ActivityOptions activityOptions = ActivityOptions.makeSceneTransitionAnimation(MainActivity.this, pairs);

                startActivity(sharedIntent, activityOptions.toBundle());
            }
        });
    }
}

activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/textView1"
        android:layout_alignParentTop="true"
        android:transitionName="textTransition"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:layout_marginStart="20dp"
        android:text="Hello World!" />

</RelativeLayout>

2 番目のアクティビティ:

public class SharedActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_shared);

        final TextView textView = findViewById(R.id.textView1);

        setEnterSharedElementCallback(new SharedElementCallback() {

            private float targetTextSize;
            private ColorStateList targetTextColors;
            private Rect targetPadding;

            @Override
            public void onSharedElementStart(List<String> sharedElementNames, List<View> sharedElements, List<View> sharedElementSnapshots) {
                super.onSharedElementStart(sharedElementNames, sharedElements, sharedElementSnapshots);

                targetTextSize = textView.getTextSize();
                targetTextColors = textView.getTextColors();
                targetPadding = new Rect(textView.getPaddingLeft(),
                        textView.getPaddingTop(),
                        textView.getPaddingRight(),
                        textView.getPaddingBottom());

                textView.setTextColor(getIntent().getIntExtra(MainActivity.TEXT_COLOR, Color.BLACK));
                float textSize = getIntent().getFloatExtra(MainActivity.SHARED_TEXT_SIZE, targetTextSize);
                textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize);
                Rect padding = getIntent().getParcelableExtra(MainActivity.PADDING);
                assert padding != null;
                textView.setPadding(padding.left, padding.top, padding.right, padding.bottom);
            }

            @Override
            public void onSharedElementEnd(List<String> sharedElementNames, List<View> sharedElements, List<View> sharedElementSnapshots) {
                super.onSharedElementEnd(sharedElementNames, sharedElements, sharedElementSnapshots);

                textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, targetTextSize);
                if (targetTextColors != null) {
                    textView.setTextColor(targetTextColors);
                }
                if (targetPadding != null) {
                    textView.setPadding(targetPadding.left, targetPadding.top,
                            targetPadding.right, targetPadding.bottom);
                }
            }
        });
    }
}

activity_shared.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".SharedActivity">

    <TextView
        android:id="@+id/textView1"
        android:transitionName="textTransition"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        android:layout_centerHorizontal="true"
        android:layout_centerInParent="true"
        android:textSize="36sp" />

</RelativeLayout>

スタイル.xml:

<resources>
    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>

        <item name="android:windowSharedElementEnterTransition">
            @transition/shared_main_detail
        </item>
    </style>

</resources>

shared_main_detail.xml:

<transitionSet xmlns:android="http://schemas.android.com/apk/res/android">
    <transitionSet>
        <targets>
            <target android:targetId="@id/textView1" />
        </targets>
        <transition class="com.example.sharedanimation.TextResize" />
        <changeBounds />
    </transitionSet>
    <recolor>
        <targets>
            <target android:targetId="@android:id/statusBarBackground" />
            <target android:targetId="@android:id/navigationBarBackground" />
        </targets>
    </recolor>
</transitionSet>
4

0 に答える 0