<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                [TOC] # 1. 前言 在學習《Android自定義控件開發入門與實戰》一書的時候,這么一段代碼映入了眼簾: ~~~java public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()){ case MotionEvent.ACTION_DOWN: { mPath.moveTo(event.getX(), event.getY()); return true; } case MotionEvent.ACTION_MOVE: mPath.lineTo(event.getX(), event.getY()); postInvalidate(); break; default: break; } return super.onTouchEvent(event); } ~~~ 雖然之前也一直看到過return super.onTouchEvent(event);的寫法,但自己一直沒有考慮過這個寫法的原因。在這篇文章中,將學習和討論這個問題。 # 2. 分析 自己通常在復寫onTouchEvent方法的時候,都是將其放置在首行,也就是下面的寫法: ~~~kotlin override fun onTouchEvent(event: MotionEvent?): Boolean { super.onTouchEvent(event) // do ... } ~~~ 然后,根據自己的處理邏輯,決定當前的Down事件是否需要消費。只有在返回 true 的時候,表示當前控件已經消費了下按動作,之后的 ACTION\_MOVE、ACTION\_UP 動作也會繼續傳遞到當前控件中。 # 3. 案例 這里簡單來個根據手指畫線繪圖的簡單View。比如下面的代碼: ~~~ class SuperOnTouchEventTestDemo: View { constructor(context: Context?) : super(context) { init() } constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs) { init() } private fun init(){ mPaint.color = Color.RED mPaint.style = Paint.Style.STROKE mPaint.strokeWidth = 5f mPaint.isAntiAlias = true } // 記錄手指在屏幕上的位置 private var mPreX = 0f private var mPreY = 0f private var mPath = Path() private var mPaint = Paint() override fun onTouchEvent(event: MotionEvent?): Boolean { super.onTouchEvent(event) when(event?.action){ MotionEvent.ACTION_DOWN -> { mPreX = event.x mPreY = event.y mPath.moveTo(mPreX, mPreY) return true } MotionEvent.ACTION_MOVE -> { val currentX = event.x val currentY = event.y // 計算(mPreX, mPreY)和(currentX, currentY)的中點坐標 val endX = (mPreX + currentX) / 2 val endY = (mPreY + currentY) / 2 // 將中點坐標作為繪圖的控制點 mPath.quadTo(mPreX, mPreY, endX, endY) mPreX = currentX mPreY = currentY invalidate() } MotionEvent.ACTION_UP -> { mPath.quadTo(mPreX, mPreY, event.x, event.y) } } return true } override fun onDraw(canvas: Canvas?) { super.onDraw(canvas) canvas?.apply { drawPath(mPath, mPaint) } } } ~~~ 在案例中我也嘗試了將super.onTouchEvent(event)放置在最后,也就是: ``` return super.onTouchEvent(event) ``` 結果是一樣的。觀察super.onTouchEvent(event)的源碼比較容易知道其實如果不調用super.onTouchEvent(event)會影響控件的點擊事件效果。所以這里怎么調用無關,只要自己攔截自己需要的Down事件,然后return true,至于和自己無關的,返回false。由于super.onTouchEvent(event)的方法默認也是返回false。如果將其在最后調用,那么這里就和我上面案例中的寫法一致,且省略了一行。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看