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();
予想どおりにかなり縮小されますが、問題は、別のユーザーアクションが発生するまで、現在は小さいビューの周囲の領域が黒くなることです。これは望ましくありません。拡大縮小されたビューの親の背景と一致させたい。赤の広場の周りの領域をすぐに正しい色にする方法はありますか?
私の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>
これは最もクリーンなソリューションではないかもしれませんが、アニメーション更新リスナーを追加して親を無効にすることでうまくいく可能性があります。
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();
前の回答で親を無効にする必要がある理由は、AnimatorSetscaleDownにターゲットがないためです。 ObjectAnimatorのターゲットをnullに設定し、AnimatorSetでターゲットを設定する必要があります。または、以下のコードを使用するのがより良い方法です。
ObjectAnimator scaleDown = ObjectAnimator.ofPropertyValuesHolder(view,
PropertyValuesHolder.ofFloat("scaleX", 0.5f),
PropertyValuesHolder.ofFloat("scaleY", 0.5f));
scaleDown.setDuration(1000);
scaleDown.start();
コメントで述べられているように、 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によるビデオにあります。