0

Androidでいくつかのアニメーションを含むシンプルなアプリを作成しました。私のレイアウトには、sourceImage とボタンを含む ImageView があります。ボタンをクリックすると、同時に移動とサイズ変更が必要になります。ObjectAnimator と ValueAnimator を使用してアニメーションを作成し、animatorSet と一緒に再生しました。私の問題は、ボタンがスムーズに動かないことです。Transitions Everywhere や APIDemos などのいくつかのアニメーション ライブラリを確認しました。これらのライブラリで ImageBackground を設定すると、ビューがスムーズに移動できず、すべてに問題があります。誰でもこの問題を解決するのを手伝ってもらえますか?

私のレイアウトコード:

<android.support.design.widget.CoordinatorLayout
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:fitsSystemWindows="true"
tools:context=".MainActivity">

<ImageView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/imageview"
    android:fitsSystemWindows="true"
    android:src="@drawable/image"
    android:scaleType="fitXY" />

<FrameLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/frame">

    <Button
        android:layout_width="100dp"
        android:layout_height="45dp"
        android:id="@+id/btn_start"
        android:layout_gravity="center_horizontal|bottom"
        android:gravity="center_vertical|center_horizontal"
        android:textAllCaps="false"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:text="Start" />
//  ....................
</FrameLayout>
</android.support.design.widget.CoordinatorLayout>

私のアニメーションコード:

btn_start.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            ButtonAnimation();
     }
 });

private void ButtonAnimation() {
    Animator moveButtonAnimY = ObjectAnimator.ofFloat(btn_start, "translationY", 0, 200)
            .setDuration(500);
    final ValueAnimator valueAnimator = ValueAnimator.ofFloat(width_btn_start, width_btn_start * 2.0f);
    valueAnimator.setDuration(500);
    valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
        public void onAnimationUpdate(ValueAnimator animation) {
            Integer value = (Integer) animation.getAnimatedValue();
            btn_start.getLayoutParams().width = value.intValue();
            btn_start.requestLayout();
        }
    });

    AnimatorSet animatorSet = new AnimatorSet();
    animatorSet.playTogether(moveButtonAnimY, valueAnimator);
    animatorSet.start();
}    
4

1 に答える 1

0

ウィキペディアによると:

アニメーションとは、互いに最小限の違いしかない一連の静止画像をすばやく表示することによって、動きと変化の錯覚を作り出すプロセスです。

したがって、アニメーションはデバイスが処理するのはかなり重いタスクであり、あなたが言及した滑らかさはデバイスの構成に依存します。

そのため、最初にデバイスにそのアニメーションをスムーズに実行するのに十分な電力があるかどうかを確認してください。

第二に、コードはボタンがクリックされるたびにアニメーションを初期化します。代わりに、アニメーションを一度初期化し、アニメーションを開始する必要があるたびにそれらのインスタンスを使用する必要があります。

コードのより良いバージョンは次のようになります。

btn_start.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        ButtonAnimation();
    }
});
Animator moveButtonAnimY = ObjectAnimator.ofFloat(btn_start,"translationY", 0, 200).setDuration(500);
ValueAnimator valueAnimator = ValueAnimator.ofFloat(width_btn_start, width_btn_start * 2.0f);
valueAnimator.setDuration(500);
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
    public void onAnimationUpdate(ValueAnimator animation) {
        Integer value = (Integer) animation.getAnimatedValue();
        btn_start.getLayoutParams().width = value.intValue();
        btn_start.requestLayout();
    }
});
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.playTogether(moveButtonAnimY, valueAnimator);

private void ButtonAnimation() {
    animatorSet.start();
}  
于 2016-04-25T12:53:07.367 に答える