第3章Viewのイベント体系

5797 ワード

3.1 Viewの基礎知識
  • ViewGroupとViewはツリーの構造を構成しています.合成モード
  • Viewの位置パラメータ
  • top
  • left
  • right
  • bottom
  • translationX
  • translationY
  • x = left+ translationX
  • y = top + translationY

  • MotionEvent
  • ACTION_DOWN
  • ACTION_MOVE
  • ACTION_UP
  • クリックイベント送信のx/y座標:getX/getYとgetRawX/getRawY
  • TouchSlop:スライドの最小距離ViewConfiguration.get(getContext()).getScaledTouchSlope().
  • VelocityTracker速度追跡は、指の水平方向および垂直方向のスライド速度を追跡するために使用される.使用方法:
  • 速度計算式:速度=(終点位置-始点位置)/時間帯の速度は負の値になります.たとえば、指が画面の右から左にスライドしたときなどです.
  • 速度は単位時間内に移動する画素数であり、単位時間は必ずしも1秒ではなく、方法computeCurrentVelocity(xxx)を使用して単位時間がどのくらいであるか、単位がmsであるかを指定することができる.例えば、速度はcomputeCurrentVelocity(1000)によって取得され、指が1 sで100画素スライドすると、速度は100(画素/1000 ms)である.速度を取得するためにcomputeCurrentVelocity(100)が使用され、100 msで指が10画素だけスライドした場合、速度は10、すなわち10(画素/100 ms)である.
  • //   
    VelocityTracker mVelocityTracker = VelocityTracker.obtain();
    // onTouchEvent   
    mVelocityTracker.addMovement(event);
    //    
    mVelocityTracker.computeCurrentVelocity(1000);
    float xVelocity = mVelocityTracker.getXVelocity();
    //     
    mVelocityTracker.clear(); //   MotionEvent.ACTION_UP     
    mVelocityTracker.recycle(); //   onDetachedFromWindow   
    
  • GestureDetector:ユーザーのクリック、スライド、長押し、ダブルクリックなどの検出を補助します.使用方法:
  • GestrueDetector mGestrueDetector = new GestrueDetector(this);
    mGestrueDetector.setIsLongpressEnabled(false); //              
    boolean consume = mGestrueDetector.onTouchEvent(event);//    View onTouchEvent  
    return consume
    

    その後、OnGestureListenerとOnDoubleTapListenerの方法を使用することができます.注意:スライド関連のみをリスニングする場合は、onTouchEvent実装を推奨します.この動作をダブルクリックすると、GestureDetectorが使用されます.
  • Scroller:フレックススライドオブジェクト、Viewのフレックススライドを実現します.

  • 3.2 Viewのスライド
  • scrollTo/scrollBy:ビューのコンテンツの位置を変更し、レイアウト内のビューの位置を変更することはできません.
  • scrollByは現在位置に基づく相対スライドであり、scrollToは伝達パラメータに基づく絶対スライドである.スライド距離はViewのgetScrollXとgetScrolY法で得られる.
  • には2つの重要なパラメータがあります.
  • mScrollX
  • mScrollY


  • アニメーションを使用
  • アニメーション操作Vewの移動を使用して、主にViewのtranslationXとtranslationYを操作します.
  • Viewアニメーションは本当にViewの位置を変えることはできません.プロパティアニメーションは
  • です.
  • レイアウトパラメータ、すなわちLayoutParamsを変更します.
  • MarginLayoutParams params = (MarginLayoutParams)mButton1.getLayoutParams();
    params.width += 100;
    params.leftMargin += 100;
    mButton1.requestLayout();//  mButton1.setLayoutParams(params);
    
  • ViewHelperクラスでは、setTranslationXメソッドやsetTranslationYメソッドのような属性アニメーションサービスのためのget/setメソッドが多数用意されています.これらのメソッドにはバージョン要件はありません.

  • 3.3 Viewの弾性スライド
    弾性スライドの共通の考え方:1回の大きなスライドをいくつかの小さなスライドに分けて、1つの期間内に完成させる.
  • Scroller(Viewコンテンツスライド):原理:
  • Scrollerオブジェクトを構築し、startScrollを呼び出し、invalidateします.Scrollの内部にはいくつかのパラメータが保存されているだけです.
  • ビューが再描画されるとdrawでcomputeScrollが呼び出され、computeScrollは現在のscrollXとscrollYをScrollerに取得する.
  • は、次いでscrollToによってスライド
  • を実現する.
  • は次にpostInvalidateを呼び出して2回目の再描画を行い、スライドプロセスが終了するまで2ステップ目を繰り返した.

  • アニメーション
  • は、遅延ポリシーを使用します.handlerとpostDelayedの組み合わせを使用します.

  • 3.4 Viewのイベント配信メカニズム
  • イベント配信プロセスの3つの重要な方法
  • public boolean dispatchTouchEvent(MotionEvent ev)
  • public boolean onInterceptTouchEvent(MotionEvent event)
  • public boolean onTouchEvent(MotionEvent event)の3つの方法の基本論理関係は、次の疑似コード
  • を参照する.
    public boolean dispatchTouchEvent(MotionEvent ev) {
        boolean consume = false;
        if (onInterceptTouchEvent(ev)) { //  view  
            consume = onTouchEvent(ev); //    ,       onTouchEvent
        } else {
            consume = child.dispatchTouchEvent(ev); //     ,     View  Event
        }
        return consume;
    }
    
  • OnTouchListenerの優先度はonTouchEventより高い.
  • onTouchListenerが設定されている場合、onTouchはコールバックされます.
  • onTouchがflaseを返すと、onTouchEventは
  • を呼び出します.
  • onTouchがtrueを返す場合、onTouchEventは
  • を呼び出さない
  • onClickListener優先度はonTouchEventより低い.
  • onTouchEvent()メソッドでは、DOWNイベントがtrueに戻ると、イベントの下伝が切り捨てられ、通俗点以降のACTION_UPおよびOnClick/OpenLongClickは、
  • をトリガしない
  • イベント伝達メカニズムの11の結論
  • 同じイベントシーケンスとはdownから始まり、その間に不定数のmoveが含まれ、最終的にupで
  • を終了することを指す.
  • 通常、イベント・シーケンスは1つのViewによってのみブロックされ、消費されます.
  • あるViewがブロックを決定すると、このイベントシーケンスはすべてそれによって処理され、onInterceptTouchEventは呼び出されません.
  • あるViewがイベントの処理を開始すると、ACTION_を消費しないDOWNイベント(onTouchEventはfalseを返します)では、同じイベントシーケンス内の他のイベントは彼に処理されず、その親要素にイベントを再渡します.
  • ビューがACTIONを消費しない場合DOWN以外の他のイベントでは,このクリックイベントが消失しても親要素のonTouchEventが呼び出されず,最終的にActivity処理に渡される.
  • ViewGroupデフォルトでは、イベント
  • はブロックされません.
  • ViewにはonInterceptTouchEventはありません.イベントが渡されると、そのonTouchEventは
  • を呼び出します.
  • ViewのonTouchEventデフォルト消費イベントはtrueを返します.もちろん特殊なTextViewがあり、クリックできないViewはfalseに戻ります.
  • Viewのenableプロパティは、onTouchEventのデフォルトの戻り値に影響しません.
  • onClickの前提は
  • をクリックできることです.
  • イベント伝達プロセスは、外部から内側へである.


  • 3.5 Viewのスライド衝突
  • 一般的なスライド衝突のシーン:
  • 外部スライド方向と内部スライド方向が一致しない、例えばviewpagerにlistviewが含まれている.
  • 外部スライド方向は内部スライド方向と一致し、SrollViewには同じ方向のSrollViewが含まれている.
  • 上の2つのケースのネスト、例えばviewpagerには複数のページが含まれており、各ページはScrollViewであり、ScrollViewにはScrollViewも含まれている.

  • スライド衝突処理規則
  • は、スライド距離と水平方向とに基づいて形成された挟み角である.
  • 水平方向と垂直方向との摺動距離の差.
  • 両方向の速度差等
  • スライド衝突の解決方法
  • 外部ブロック法:クリックイベントはすべて親コンテナのブロック処理を経て、親コンテナがこのイベントを必要とする場合はブロックし、必要でない場合はブロックしない.このメソッドは親コンテナのonInterceptTouchEventメソッドを書き換える必要があり,内部で対応するブロックをすればよいが,その他は修正する必要はない.
  • 内部ブロック:親コンテナはイベントをブロックせず、すべてのイベントがサブエレメントに渡され、サブエレメントがこのイベントを必要とする場合は直接消費されます.そうしないと、親コンテナに渡されて処理されます.この方法はAndroidのイベント配信メカニズムと一致せず,r e q u s t D e a l l o w InterceptTouchEventメソッドと連携して正常に動作する必要がある.
  • 人は一般に外部遮断法
  • を用いる.