1

いくつかのビューのアルファチャンネルにプロパティアニメーションを設定しましたが、思ったとおりに機能していません。基本的に、3つTextViewの派生物があります。最初は非表示にしたいaTextViewと2つで、データが入ったときにデータを設定してからアニメーション化します。レイアウト内の他のいくつかのビューでこれを行いますが、同じ問題が発生することがあります。Views非常にまれです。Logcatの出力によると、のデータが有効であっても、ほとんどの場合、TextViewと単純の1つはViews表示されません。TextViewそれは常に同じ2つのビューであり、それらが表示されることはめったにありませんが、私が見つけた予測可能な方法ではありません。レイアウトファイルのセクションとすべてのアニメーションコードが続きます。この質問に従って注意してください、レイアウトで可視性を非表示に設定し、アニメーションを開始する直前に表示に設定しました。

編集

問題が発生しているビューで`View.bringToFront()を呼び出しても、目に見える効果はありません。また、アニメーションを実行せずに、ビューの表示を非表示から表示に変更しただけでは表示されません。可視性変更コードとandroid:visibility = "invisible"タグをレイアウトから削除しても、ビューは表示されません。

レイアウト

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:qwerjk="http://schemas.android.com/apk/res/tenkiv.app"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:paddingBottom="8dp"
    android:paddingLeft="8dp"
    android:paddingRight="8dp" >

    <tenkiv.view.widget.MagicTextView
        android:id="@+id/hourMinuteValueTv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_toLeftOf="@+id/secondValueTv"
        android:lines="1"
        android:textSize="77sp"
        android:visibility="invisible"
        qwerjk:strokeColor="@color/light_text_outline"
        qwerjk:strokeJoinStyle="miter"
        qwerjk:strokeWidth="1.8" />

    <tenkiv.view.widget.MagicTextView
        android:id="@+id/secondValueTv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/hourMinuteValueTv"
        android:layout_toLeftOf="@+id/amPmValueTv"
        android:textSize="39sp"
        android:visibility="invisible"
        qwerjk:strokeColor="@color/light_text_outline"
        qwerjk:strokeJoinStyle="round"
        qwerjk:strokeWidth="1.3" />

    <tenkiv.view.widget.MagicTextView
        android:id="@+id/amPmValueTv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/hourMinuteValueTv"
        android:layout_alignParentRight="true"
        android:textSize="31sp"
        android:visibility="invisible"
        qwerjk:strokeColor="@color/light_text_outline"
        qwerjk:strokeJoinStyle="round"
        qwerjk:strokeWidth="1.3" />

    <tenkiv.view.widget.MagicTextView
        android:id="@+id/dateValueTv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_below="@+id/hourMinuteValueTv"
        android:textSize="19sp"
        android:visibility="invisible"
        qwerjk:strokeColor="@color/light_text_outline"
        qwerjk:strokeJoinStyle="round"
        qwerjk:strokeWidth="0.9" />

    <View
        android:id="@+id/lineTimeConditionSepView"
        android:layout_width="290dp"
        android:layout_height="3dp"
        android:layout_alignParentRight="true"
        android:layout_below="@id/dateValueTv"
        android:layout_marginTop="4dp"
        android:background="@color/holo_text"
        android:visibility="invisible" />

    <View
        android:id="@+id/lineTimeConditionSepViewOutline2"
        android:layout_width="290dp"
        android:layout_height="1dp"
        android:layout_alignBottom="@id/lineTimeConditionSepView"
        android:layout_alignLeft="@id/lineTimeConditionSepView"
        android:layout_marginTop="0.5dp"
        android:background="@color/location_area_dark_green"
        android:visibility="invisible" />

---THE REST OF THE LAYOUT---

それをアニメーション化するための私のフラグメントの方法

public void onUpdateClock(final String time, final String seconds, final String ampm, final String date) {
    Activity activity = getActivity(); //Used to make sure we dont update the clock with the activity dead
    if (activity != null) {
        if (mHourMinuteValue == null) { //These are all used together so this should be safe
            mHourMinuteValue = (MagicTextView) activity.findViewById(R.id.hourMinuteValueTv);
            mSecondValue = (MagicTextView) activity.findViewById(R.id.secondValueTv);
            mAmPmValue = (MagicTextView) activity.findViewById(R.id.amPmValueTv);
            mDateValue = (TextView) activity.findViewById(R.id.dateValueTv);
            mTimeConditionsLine = activity.findViewById(R.id.lineTimeConditionSepView);
            mTimeConditionsOutline2 = activity.findViewById(R.id.lineTimeConditionSepViewOutline2);
            mTimeInAnim = createAnimation(CLOCK_IN);
        }
    }
    if (mHourMinuteValue == null) {
        Log.e(TAG, "Clock text views were null!");
        return;
    }
    uiHandler.post(new Runnable() {
        public void run() {
            mHourMinuteValue.setText(time);
            mSecondValue.setText(seconds);
            if (ampm != null) {
                mAmPmValue.setText(ampm);
            } else {
                mAmPmValue.setText(ClockUICallbacks.EMPTY_AMPM);
            }
            mDateValue.setText(date);
            mDateValue.bringToFront();
            if (mFadeInClock) {
                setClockVisibility(true);
                mTimeInAnim.start();
                mFadeInClock = false;
            }
        }
    });

private void setClockVisibility(boolean visible) {
        int flag;
        if (visible) {
            flag = View.VISIBLE;
        } else {
            flag = View.INVISIBLE;
        }
        mHourMinuteValue.setVisibility(flag);
        mSecondValue.setVisibility(flag);
        mAmPmValue.setVisibility(flag);
        mDateValue.setVisibility(flag);
        mTimeConditionsLine.setVisibility(flag);
        mTimeConditionsOutline2.setVisibility(flag);
    }

private AnimatorSet createAnimation(int type) {
        AnimatorSet set = new AnimatorSet();
        switch (type) {
        case CLOCK_IN:
            ValueAnimator hourMinInAnim = ObjectAnimator.ofFloat(mHourMinuteValue, "alpha", INVISIBLE, OPAQUE);
            hourMinInAnim.setDuration(FADE_IN_DURATION);
            ValueAnimator secondInAnim = ObjectAnimator.ofFloat(mSecondValue, "alpha", INVISIBLE, OPAQUE);
            secondInAnim.setDuration(FADE_IN_DURATION);
            ValueAnimator amPmInAnim = ObjectAnimator.ofFloat(mAmPmValue, "alpha", INVISIBLE, OPAQUE);
            amPmInAnim.setDuration(FADE_IN_DURATION);
            ValueAnimator dateInAnim = ObjectAnimator.ofFloat(mDateValue, "alpha", INVISIBLE, OPAQUE);
            dateInAnim.setDuration(FADE_IN_DURATION);
            ValueAnimator timeLine1InAnim = ObjectAnimator.ofFloat(mTimeConditionsLine, "alpha", INVISIBLE, OPAQUE);
            timeLine1InAnim.setDuration(FADE_IN_DURATION);
            ValueAnimator timeLine2InAnim = ObjectAnimator.ofFloat(mTimeConditionsOutline2, "alpha", INVISIBLE, OPAQUE);
            timeLine2InAnim.setDuration(FADE_IN_DURATION);
            set.playTogether(hourMinInAnim, secondInAnim, amPmInAnim, dateInAnim, timeLine1InAnim, timeLine2InAnim);
            return set;
        /*SOME OTHER ANIMATIONS*/
        }
        return null;
    }

必要になるかもしれない他の情報があれば私に知らせてください。

ありがとう、ジャレド

4

1 に答える 1

0

これは、アクティビティ内の2つの異なるフラグメントのレイアウトを作成する際のミスが原因であることが判明しました。レイアウトを見ると、MagicTextViewIDがdateValueTvのがあります。この同じIDは、アクティビティ内の別のレイアウトに存在し、両方がアクティビティfindViewById()メソッドを使用して参照を取得していたため、正しいビューが見つかる場合と見つからない場合がありました。他のフラグメントのテキストビューに、この問題のあるテキストビューに必要なデータが含まれていたため、これを発見しました。私がしなければならなかったのは彼らのIDを変更することだけでした。私はに基づいてそれを行うことができることを知っていgetView().findViewById()ます。これがベストプラクティスである場合、私はそれについてのコメントを聞きたいですが、アクティビティがnullであるかどうかを確認することによってgetActivity()そこからビューを取得することで、アクティビティが存在しない場合(ローテーション中など)にバックグラウンドスレッドがUIハンドラーにメッセージを投稿しないようにする便利な方法があります。

于 2012-12-03T22:26:18.300 に答える