<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>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                #### 3.2.4 各種滑動方式的對比 上面分別介紹了三種不同的滑動方式,它們都能實現View的滑動,那么它們之間的差別是什么呢? 先看scrollTo/scrollBy這種方式,它是View提供的原生方法,其作用是專門用于View的滑動,它可以比較方便地實現滑動效果并且不影響內部元素的單擊事件。但是它的缺點也是很顯然的:它只能滑動View的內容,并不能滑動View本身。 再看動畫,通過動畫來實現View的滑動,這要分情況。如果是Android 3.0以上并采用屬性動畫,那么采用這種方式沒有明顯的缺點;如果是使用View動畫或者在Android 3.0以下使用屬性動畫,均不能改變View本身的屬性。在實際使用中,如果動畫元素不需要響應用戶的交互,那么使用動畫來做滑動是比較合適的,否則就不太適合。但是動畫有一個很明顯的優點,那就是一些復雜的效果必須要通過動畫才能實現。 最后再看一下改變布局這種方式,它除了使用起來麻煩點以外,也沒有明顯的缺點,它的主要適用對象是一些具有交互性的View,因為這些View需要和用戶交互,直接通過動畫去實現會有問題,這在3.2.2節中已經有所介紹,所以這個時候我們可以使用直接改變布局參數的方式去實現。 針對上面的分析做一下總結,如下所示。 * scrollTo/scrollBy:操作簡單,適合對View內容的滑動; * 動畫:操作簡單,主要適用于沒有交互的View和實現復雜的動畫效果; * 改變布局參數:操作稍微復雜,適用于有交互的View。 下面我們實現一個跟手滑動的效果,這是一個自定義View,拖動它可以讓它在整個屏幕上隨意滑動。這個View實現起來很簡單,我們只要重寫它的onTouchEvent方法并處理ACTION_MOVE事件,根據兩次滑動之間的距離就可以實現它的滑動了。為了實現全屏滑動,我們采用動畫的方式來實現。原因很簡單,這個效果無法采用scrollTo來實現。另外,它還可以采用改變布局的方式來實現,這里僅僅是為了演示,所以就選擇了動畫的方式,核心代碼如下所示。 ``` public boolean onTouchEvent(MotionEvent event) { int x = (int) event.getRawX(); int y = (int) event.getRawY(); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: { break; } case MotionEvent.ACTION_MOVE: { int deltaX = x - mLastX; int deltaY = y - mLastY; Log.d(TAG, "move, deltaX:" + deltaX + " deltaY:" + deltaY); int translationX = (int)ViewHelper.getTranslationX(this) + deltaX; int translationY = (int)ViewHelper.getTranslationY(this) + deltaY; ViewHelper.setTranslationX(this, translationX); ViewHelper.setTranslationY(this, translationY); break; } case MotionEvent.ACTION_UP: { break; } default: break; } mLastX = x; mLastY = y; return true; } ``` 通過上述代碼可以看出,這一全屏滑動的效果實現起來相當簡單。首先我們通過getRawX和getRawY方法來獲取手指當前的坐標,注意不能使用getX和getY方法,因為這個是要全屏滑動的,所以需要獲取當前點擊事件在屏幕中的坐標而不是相對于View本身的坐標;其次,我們要得到兩次滑動之間的位移,有了這個位移就可以移動當前的View,移動方法采用的是動畫兼容庫nineoldandroids中的ViewHelper類所提供的setTranslationX和setTranslationY方法。實際上,ViewHelper類提供了一系列get/set方法,因為View的setTranslationX和setTranslationY只能在Android 3.0及其以上版本才能使用,但是ViewHelper所提供的方法是沒有版本要求的,與此類似的還有setX、setScaleX、setAlpha等方法,這一系列方法實際上是為屬性動畫服務的,更詳細的內容會在第5章進行進一步的介紹。這個自定義View可以在2.x及其以上版本工作,但是由于動畫的性質,如果給它加上onClick事件,那么在3.0以下版本它將無法在新位置響應用戶的點擊,這個問題在前面已經提到過。
                  <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>

                              哎呀哎呀视频在线观看