Androidイベントシステム(1)


Androidイベントシステム(1)
タッチスクリーンはアプリケーションの応答を得ることができることを知っています.例えば、画面のボタンをクリックしてダイアログボックスやトーストをポップアップすることができます.では、このタッチスクリーンイベントは、Androidシステムでどのように応答して伝達されるのでしょうか.次に、Androidシステムのイベント配信処理の流れをしばらく説明します.
MotionEvent
次のようなニーズがあるとします.
  • リスニング戻りキー
  • あるボタンのタッチイベント
  • を傍受する
  • 指の移動に伴うTextView
  • を実現
    次に、以上のニーズを一つ一つ実現し、Androidイベントの配布の核心を見つけます.
    リスニング戻りキー
    この要件については、onKeyDownメソッドを書き換えることを自然に考えています.では、要件を完了するコードを見てみましょう.
     @Override
        public boolean onKeyDown(int keyCode, KeyEvent event) {
            return super.onKeyDown(keyCode, event);
        }

    ボタンのタッチイベントを監視
            mCustomButton.setOnTouchListener(new View.OnTouchListener() {
                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    return false;
                }
            });

    指で動くTextViewを実現
    実装されたカスタムTextViewのコードは次のとおりです.
    import android.content.Context;
    import android.util.AttributeSet;
    import android.view.MotionEvent;
    import android.widget.TextView;
    
    /** * Created by TuoZhaoBing on 2016/4/6 0006. */
    public class CustomTouchTextView extends TextView{
        public static final String TAG = "CustomTouchTextView";
        private int mStartX,mStartY;
        private Context mContext;
    
        public CustomTouchTextView(Context context) {
            super(context);
            this.mContext =context;
        }
    
        public CustomTouchTextView(Context context, AttributeSet attrs) {
            super(context, attrs);
            this.mContext =context;
        }
    
        public CustomTouchTextView(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
            this.mContext =context;
        }
    
        @Override
        public boolean onTouchEvent(MotionEvent event) {
            switch (event.getAction()){
                case MotionEvent.ACTION_DOWN:{
                    mStartX = (int)event.getRawX();
                    mStartY = (int)event.getRawY();
                    break;
                }
                case MotionEvent.ACTION_MOVE:{
                        int dx = (int) event.getRawX()-mStartX;
                        int dy = (int) event.getRawY()-mStartY;
    
                        int l = getLeft()+dx;
                        int b = getBottom()+dy;
                        int r = getRight()+dx;
                        int t = getTop()+dy;
                        if(l<0){
                            l = 0;
                            r = l+getWidth();
                        }
    
                        if(t<0){
                            t = 0;
                            b = t+getHeight();
    
                        }
    
                        if(r> MeasureUtils.getScreenWidth(mContext)){
                            r = MeasureUtils.getScreenWidth(mContext);
                            l = r - getWidth();
                        }
    
                        if(b>MeasureUtils.getScreenHeight(mContext)){
                            b = MeasureUtils.getScreenHeight(mContext);
                            l = b-getHeight();
                        }
                        layout(l, t, r, b);
                        mStartX = (int) event.getRawX();
                        mStartY = (int) event.getRawY();
                        postInvalidate();
                    }
                    break;
                case MotionEvent.ACTION_UP:{
                    break;
                }
            }
            return true;
        }
    }

    以上の3つの例から,Androidシステムでは異なるイベントに対して異なるEventが対応しており,ここでKeyEventはキーボードタッチイベントに対応し,MotionEventは一般的なTouchイベントに対応していることが観察された.この種のイベントの重要な情報は異なるイベントに含まれており,MotionEventを例にとると,1つのMotionEventにはタッチポイント座標,イベントタイプ,タッチポイント数などの基本情報が含まれており,これらの情報を用いてイベント処理を行っている.公式サイトのMotionEventについての説明は、**Object used to report movement(mouse,pen,finger,trackball)events.Motion events may hold either absolute or relative movements and other data, depending on the type of device. Motion events describe movements in terms of an action code and a set of axis values. The action code specifies the state change that occurred such as a pointer going down or up. The axis values describe the position and other movement properties**という言葉は、デバイスタイプに依存する瞬時イベントのデータを保持するためにこのオブジェクトが使用されることを意味し、イベントのActionと座標がMotionEventに記述され、MotionEventオブジェクトは通常、一定量としてViewに伝達される.次に、私たちのチームMotionEventが持っているデータについて説明します.イベント情報に触れる
        event.getAction() //        ACTION_DOWN
        event.getPointerCount(); //        ,  2              
        event.getPointerId(nID); //           ,            getPointerId      
        event.getX(nID); //   nID     x  
        event.getY(nID); //   nID     y  
        event.getPressure(nID); //LCD            ,                  
        event.getDownTime() //      
        event.getEventTime() //       
        event.getEventTime()-event.getDownTime()); //         

    2.イベントタイプ主なイベントタイプは:ACTION_DOWN:ユーザがタッチを開始することを示す.ACTION_MOVE:ユーザが移動していることを示すACTION_UP:ユーザが指を上げたことを示すACTION_CANCEL:ジェスチャーがキャンセルされたことを示します.このイベントのタイプについての議論は、stackoverflow ACTION_を参照してください.OUTSide:ユーザのタッチが通常のUI境界を超えることを示す.しかし、マルチタッチのサポートには、Androidには以下のイベントタイプが加わっている.別の指が押すと、ある指が持ち上がる.等:ACTION_POINTER_DOWN:主要でない指が押されました.ACTION_POINTER_UP:主要でない指が上がった.イベント発生位置(座標)getX()は、イベント発生時にタッチする中間領域が画面のX軸であることを取得する.getY()取得イベントが発生すると、タッチの中間領域が画面のX軸になる.getX(int pointerIndex)は、マルチタッチで対応する指イベントの発生位置を得る.Y軸取得用getY(int pointerIndex)