2016-08-03 9 views
1

setTranslationXを使用して、画面全体をスワイプしてビューをアニメーション化しようとしています。次に、しきい値-Xを渡した後、ビューに新しいRelativeLayout.RIGHT_OFを割り当てます。Android:setTranslationXビューのアンカーが変更された後にグリッチが発生する

私はその時点でアニメーションを止める(私がスワイプを続けているかどうかにかかわらず)、基本的にその新しいアンカーにロックします。

これは、問題は次のとおりです。突然、ビューがX位置を新しいアンカーの右に移動します。

私はsetTranslationX(0)を設定し、それは> =しきい値だとき、試してみたが、その後、私は、新しい0

に、いったん元の0に、ビューは二回/フラッシュをけいれん見ますそのダブルツイッチ/フラッシュを取り除くのが大好きですが、この時点ではどうなっているのでしょうか。

@Override 
public void onChildDraw(Canvas c ... float dX) { 
    threshold = anchorView.getRight(); 

    if (animate) { 
     if (dX >= 0) { 
      translationX = Math.min(dX, threshold); 

      if (dX >= threshold) { 
       translationX = 0; // (A) if I do this, then mainView flashs twice: original 0, then new 0 
       setToRightOf(mainView, anchorView); 
       mainView.invalidate(); // has no effect 
      } 
     } else { 
      translationX = 0; 
     } 

     // if I don't do (A), then mainView will suddenly jump to 2*threshold 
     mainView.setTranslationX(translationX); 
     return; 
    } 

    super.onChildDraw(c ... dX); 
} 

答えて

1

さて、代わりにしきい値境界を設定するためにonDraw中にRelativeLayout.RIGHT_OFを割り当てるので、私はそれを取り、私のタッチスクリーンを去ったときに、それを割り当てられました。

しかし、スワイプしている間にスレッショルドの後ろをスワイプしないようにするには、以前にRelativeLayoutアンカーに頼っていたのではなく、translationXをチェックする別のケースを追加する必要がありました。

は今、私はスワイプ時のしきい値を確認助けるためにsetTag()getTag()を使用しています:

if (dX >= 0) { 
    if ((Object) past != tag) 
     translationX = Math.min(dX, threshold); 
    else 
     translationX = threshold; 

    if (dX >= threshold) { 
     if ((Object) past != tag) { 
      anchorView.setTag(past); 
     } 
    } 
} else { 
    ... 
} 

プラス必要なときに、私はanchorViewのタグとtranslationXをリセットしてくださいするカップル他の場所、それがすべてです良い。

これは今のところ機能します!

(直接問題をけいれん/ダブルフラッシュを解決しますが、同じ目標に異なるアプローチしません)

setTag()を使用してほかに、他の勧告?)

P.S.以前の試みでは、invalidate()の代わりにmainView.requestLayout()を試してみましたが、requestLayout()の位置も考えました。

関連する問題