29

Androidでボタンを下から上にアニメーション化するためにobjectAnimatorを使用しています。今、私は以下のコードを使用しています

ObjectAnimator transAnimation = ObjectAnimator.ofFloat(button,"translationY",0,440);
        transAnimation.setDuration(440);
        transAnimation.start();

以下のサンプルコードも試してみました。しかし、それでも問題は存在します

ObjectAnimator transAnimation = ObjectAnimator.ofFloat(loginLayout, "translationY",0f,0.8f);
                    transAnimation.setDuration(480);
                    transAnimation.start();

大画面デバイスで問題なく動作します。しかし、小さな画面のデバイスになると、画面からはみ出してしまいます。画面サイズに関係なく、画面の上部に表示したい。パーセンテージで値を指定する必要があると思います (0% から 100% または 0 から 100%p とします)。私の質問は、Android の objectAnimator でパーセンテージで値を与える方法です。また、この objectAnimator は HoneyComb だけに導入されていることに気付きました。低バージョンで実行するための下位互換性ライブラリはありますか。これに対する解決策を見つけるために誰かが私を案内してくれますか?

また、View を拡張して、プロパティの getter と setter を に記述してみましたoffset()。それでも画面上部まで完全には移動しません。これが私が使用したコードです。

@SuppressLint("NewApi") public float getXFraction()
    {
        int width = context.getWindowManager().getDefaultDisplay().getHeight();
        return (width == 0) ? 0 : (getY());
    }

    @SuppressLint("NewApi") public void setXFraction(float xFraction) {
        int width = context.getWindowManager().getDefaultDisplay().getWidth();
        setY((width > 0) ? (width) : 0);
    }

前もって感謝します

4

5 に答える 5

10

ObjectAnimatorHoneycomb 以前のデバイスで使用するには、 NineOldAndroidsライブラリをプロジェクトに追加し、インポートを使用するように変更しますcom.nineoldandroids.animation.ObjectAnimator

andObjectAnimatorの代わりにパーセンテージ値を使用するには、このようなメソッドを追加する必要がありますgetXFractionsetXFractiongetYFractionsetYFraction

public float getYFraction() {
    final WindowManager wm = (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE);
    int height = wm.getDefaultDisplay().getHeight();
    return (height == 0) ? 0 : getY() / (float) height;
}

public void setYFraction(float yFraction) {
    final WindowManager wm = (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE);
    int height = wm.getDefaultDisplay().getHeight();
    setY((height > 0) ? (yFraction * height) : 0);
}

そして、project-folder/res/animator/move_bottom.xmlこのようなxmlファイルを作成できます

<?xml version="1.0" encoding="utf-8"?>
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="500"
    android:propertyName="yFraction"
    android:valueFrom="0"
    android:valueTo="0.8"
    android:valueType="floatType" />

またはコードでアニメーションを作成する

final LoginLayout loginLayout = (LoginLayout) findViewById(R.id.login_layout);
final ObjectAnimator oa = ObjectAnimator.ofFloat(loginLayout, "yFraction", 0f, 0.8f);
oa.start();
于 2013-04-15T17:11:36.313 に答える
2

カスタム プロパティでカスタム ビューを作成する代わりに、ObjectAnimator のカスタム プロパティを使用してみてください。「分数」を受け入れるカスタム プロパティを作成できます。

Property<View, Float> property = new Property<View, Float>(Float.TYPE, "translation_x_fraction") {
        @Override public Float get(View view) { 
            return view.getWidth() <= 0 ? 0 : view.getTranslationX() / view.getWidth();
        }

        @Override public void set(View view, Float value) {
            view.setTranslationX(view.getWidth() * value);
        }
}

ObjectAnimator.ofFloat(view, property, 0f, 1f);
于 2015-10-28T22:52:50.357 に答える
0

私はこのようにしました、私はあまりにも多くの時間を費やしましたが、それはあなたの時間を節約します.

引数:

  1. View (あなたのサポート View)
  2. 親の幅(ビューのルート)
  3. 子の幅(アニメーションを適用する対象)
  4. % (オブジェクトまたはビューを移動するパーセンテージ)

引数を恐れる必要はありません。ここでは例を挙げて説明します。

XMLおよびJavaコード:

activity_main.xml :

<LinearLayout
     android:id="@+id/llProgressParent"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:layout_margin="5dp"
     android:layout_gravity="center"
     android:orientation="horizontal"
     android:weightSum="1" >

     <View
        android:id="@+id/viewSuppot"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="0" >
     </View>

     <ImageView
        android:id="@+id/ivProgressChild"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:src="@drawable/ic_launcher" />

</LinearLayout>

MainActivity.java :

private LinearLayout llProgressParent;
private View viewSuppot;
private ImageView ivProgressChild;
private int childWidth, parentWidth;
private int percentage = 75;

onCreate( ) :

viewSuppot = findViewById(R.id.viewSuppot);

llProgressParent = (LinearLayout)findViewById(R.id.llProgressParent);
llProgressParent.post(new Runnable() {
      @Override
      public void run() {
          parentWidth = llProgressParent.getMeasuredWidth();
      }
  });


 ivProgressChild = (ImageView)findViewById(R.id.ivProgressChild);
 ivProgressChild.post(new Runnable() {
      @Override
      public void run() {
          childWidth = ivProgressChild.getMeasuredWidth();
      }
  });

方法:

private void animateViewByPercentageOrProgrss(final View view,  int parentWidth, int childWidth, int percentage){
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        ValueAnimator anim = ValueAnimator.ofInt(view.getMeasuredWidth(), (int) (((float) percentage * parentWidth) / 100)-(childWidth/2));
        anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator valueAnimator) {
                int val = (Integer) valueAnimator.getAnimatedValue();
                ViewGroup.LayoutParams layoutParams = view.getLayoutParams();
                layoutParams.width = val;
                view.setLayoutParams(layoutParams);
            }
        });
        anim.setDuration(2000);
        anim.start();
    }

メソッドの呼び出し方法:

animateViewByPercentageOrProgrss(viewSuppot, parentWidth, childWidth, percentage);

その完了

于 2015-12-11T12:12:33.683 に答える