2

RelativeLayout に含まれるイメージビューがあります。imageview がクリックされると、RelativeLayout 全体を移動アニメーションでアニメーション化して下に移動します。

イメージビューを(新しい場所で)もう一度クリックすると、元に戻るはずですが、そうではありません。ただし、イメージビューが開始された場所をクリックすると、「パネル」全体が元に戻ります。イメージビューが相対的なレイアウトで動かないのはなぜですか...少なくともクリックできる限り。実際の画像は動いていますが、クリックできる場所は動いていません。

レイアウト用の私のxmlは次のとおりです。

<RelativeLayout
    android:layout_alignParentTop="true"
    android:layout_alignParentLeft="true"
    android:layout_width="fill_parent"
    android:layout_height="120px"       
    android:layout_marginTop="-106px"
    android:id="@+id/chatbox"
    android:visibility="invisible">
    <TextView
        android:layout_width="fill_parent"
        android:layout_height="106px"
        android:background="#000000"
        android:id="@+id/chattext" />
    <ImageView
        android:layout_width="20px"
        android:layout_height="14px"
        android:id="@+id/chatbubble"
        android:layout_below="@id/chattext"
        android:src="@drawable/chatbubble" />
</RelativeLayout>

編集: Animation.setFillAfter(true) を使用して、アニメーションの完了後にパネルを所定の位置に保持していることを追加する必要があります。

4

2 に答える 2

2

これは、アニメーションが実際にはビューの位置に影響を与えず、描画するだけだからです。したがって、新しい場所でクリックを処理するには、そこに何かを配置する必要があります (つまり、見えない FrameLayout)。または、アニメーションの完了時にビューのマージンを変更して、ビューが実際にその場所に移動するようにすることもできます。

于 2010-08-31T02:45:11.843 に答える
0

私は同じ問題を抱えていましたが、私が見つけた最良の解決策は、アニメーションに AnimationListener を追加し、Konstantin Burov が言ったように、そのリスナーでビューを自分で移動することです:

animation.setFillAfter(false);

AnimationListener animListener = new AnimationListener() {

    @Override
    public void onAnimationStart(Animation animation) {
    }

    @Override
    public void onAnimationRepeat(Animation animation) {
    }

    @Override
    public void onAnimationEnd(Animation animation) {
        RelativeLayout.LayoutParams relativeLayoutParams = (LayoutParams) yourView.getLayoutParams();

        //To avoid the flicker
        yourView.clearAnimation();

        relativeLayoutParams.setMargins(0, 0, 0, Utils.dpToPx(activity, newPositionDp);
        yourView.setLayoutParams(relativeLayoutParams);
    }
};

animation.setAnimationListener(animListener);

Utils.dpToPx も役立つ場合があります。

public final static int dpToPx(Context context, int dp) {
    return ((int)((dp * context.getResources().getDisplayMetrics().density) + 0.5));
}
于 2013-02-18T16:31:14.887 に答える