web-dev-qa-db-ja.com

scaleプロパティを持つObjectAnimatorはbgを黒にしますか?

ObjectAnimatorを使用してRelativeLayoutを縮小します。

            ObjectAnimator scaleDownX = ObjectAnimator.ofFloat(view, "scaleX", 0.5f);
            ObjectAnimator scaleDownY = ObjectAnimator.ofFloat(view, "scaleY", 0.5f);
            scaleDownY.setDuration(1000);
            AnimatorSet scaleDown = new AnimatorSet();
            scaleDown.play(scaleDownX).with(scaleDownY);
            scaleDown.start();

予想どおりにかなり縮小されますが、問題は、別のユーザーアクションが発生するまで、現在は小さいビューの周囲の領域が黒くなることです。これは望ましくありません。拡大縮小されたビューの親の背景と一致させたい。赤の広場の周りの領域をすぐに正しい色にする方法はありますか?

enter image description here

私のxml:

   <RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:gui="http://schemas.Android.com/apk/res-auto"
    xmlns:tools="http://schemas.Android.com/tools"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:id="@+id/bg"
    Android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity$DummySectionFragment">
      <RelativeLayout
        Android:id="@+id/res1"
        Android:layout_width="50dp"
        Android:layout_height="50dp"
        Android:tag="res1"
        Android:background="@Android:color/holo_red_dark"
        Android:layout_alignTop="@+id/res2"
        Android:layout_alignRight="@+id/include3"
        Android:layout_marginRight="11dp">
            <TextView
                Android:layout_marginLeft="15dp"
                Android:layout_width="wrap_content"
                Android:layout_height="wrap_content"
                Android:text="res1"
                Android:id="@+id/res1T"
                Android:layout_centerVertical="true"
                Android:layout_centerHorizontal="true"/>
        </RelativeLayout>
    </RelativeLayout>
10
slezadav

これは最もクリーンなソリューションではないかもしれませんが、アニメーション更新リスナーを追加して親を無効にすることでうまくいく可能性があります。

ObjectAnimator scaleDownX = ObjectAnimator.ofFloat(view, "scaleX", 0.5f);
ObjectAnimator scaleDownY = ObjectAnimator.ofFloat(view, "scaleY", 0.5f);
scaleDownX.setDuration(1000);
scaleDownY.setDuration(1000);

AnimatorSet scaleDown = new AnimatorSet();
scaleDown.play(scaleDownX).with(scaleDownY);

scaleDownX.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
     @Override
     public void onAnimationUpdate(ValueAnimator valueAnimator) {
         View p= (View) v.getParent();
         p.invalidate();
     });
scaleDown.start();
27
Michal

前の回答で親を無効にする必要がある理由は、AnimatorSetscaleDownにターゲットがないためです。 ObjectAnimatorのターゲットをnullに設定し、AnimatorSetでターゲットを設定する必要があります。または、以下のコードを使用するのがより良い方法です。

ObjectAnimator scaleDown = ObjectAnimator.ofPropertyValuesHolder(view, 
    PropertyValuesHolder.ofFloat("scaleX", 0.5f),
    PropertyValuesHolder.ofFloat("scaleY", 0.5f));
scaleDown.setDuration(1000);
scaleDown.start();
36
Simon

コメントで述べられているように、 ObjectAnimator を作成するためのアプローチは、文字列を渡す代わりに、ビューの静的 Property オブジェクトを使用することです。これは、文字列値の使用にはセッターとオプションで、属性の開始値を導出するためのゲッター用。これは API 14 から入手できます。

ObjectAnimator scaleDownX = ObjectAnimator.ofFloat(view, View.SCALE_X, 0.5f);
ObjectAnimator scaleDownY = ObjectAnimator.ofFloat(view, View.SCALE_Y, 0.5f);

完全な説明は DevBytes:Property Animations GoogleのエンジニアChetHaaseによるビデオにあります。

0
Klodian Kambo