最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android View滑動的實現(xiàn)分析示例

 更新時間:2022年08月02日 15:10:24   作者:m0_63970488  
View滑動是Android實現(xiàn)自定義控件的基礎(chǔ),同時在開發(fā)中難免會遇到View的滑動處理,其實不管是那種滑動方法,基本思路是類似的;當(dāng)點擊事件傳到View時,系統(tǒng)記下觸摸點的坐標(biāo),手指移動時系統(tǒng)記下移動后的左邊并算出偏移量,通過偏移量來修改View的坐標(biāo)

實現(xiàn)View滑動有很多種方法,這篇帖子介紹6中滑動的方法,分別是:

layout()、offsetLeftAndRight()、offsetTopAndBottom()、LayoutParams、scrollTo、scrollBy、Scroller。

1.layout方法

繪制View的時候會調(diào)用onLayout方法來設(shè)置顯示的位置,因此我們同樣也可以通過修改View的left、top、right、bottom、這四個屬性來控制View的坐標(biāo)。首先我們要自定義一個View在onTouchEvent方法中獲取觸摸點的坐標(biāo):

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        //獲取手指觸摸點的橫坐標(biāo)和縱坐標(biāo)
        int x = (int) event.getX();
        int y = (int) event.getY();
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                lastX = x;
                lastY = y;
                break;
        }
....
    }

接下來我們在ACTION_MOVE事件中計算偏移量,再調(diào)用layout方法重新放置這個自定義View的位置。

            case MotionEvent.ACTION_MOVE:
                //計算移動的距離
                int offsetX = x - lastX;
                int offsetY = y - lastY;
                //調(diào)用layout方法來重新放置它
                layout(getLeft() - offsetX, getTop() + offsetY, getRight() - offsetX, getBottom() - offsetY);
                break;

在每次移動時都會調(diào)用layout方法對屏幕重新布局,從而達(dá)到移動View的效果。

2.offsetLeftAndRight()與offsetTopAndBottom()

其這兩種方法和layout方法效果差不多,其使用方法也差不多。我們將ACTION_MOVE中的代碼替代如下:

            case MotionEvent.ACTION_MOVE:
                //計算移動的距離
                int offsetX = x - lastX;
                int offsetY = y - lastY;
                //對left和right進(jìn)行偏移
                offsetLeftAndRight(offsetX);
                //對top和bottom進(jìn)行偏移
                offsetTopAndBottom(offsetY);
                break;

3.LayoutParams(改變布局參數(shù))

LayoutParms 主要保存了一個View的布局參數(shù) , 因此我們可以通過LayoutParams來改變View的采納數(shù);從而達(dá)到改變View位置的效果。同樣,我們將ACTION_MOVE中的代碼替換如下:

                LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) getLayoutParams();
                layoutParams.leftMargin = getLeft() + offsetX;
                layoutParams.topMargin = getLeft() + offsetY;
                setLayoutParams(layoutParams);

4.scrollTo與scrollBy

scrollTo(x,y) 表示移動到一個具體的坐標(biāo)點,而scrollBy(dx.dy)則表示移動的增量為dx,dy。

其中,scrollBy最終也是要調(diào)用scrollTo的。View.java文件中的scrollBy和scrollTo代碼如下:

scrollTo、scrollBy 移動的是View的內(nèi)容,如果在ViewGroup中使用,則是移動其所有的子View,我們將ACTION_MOVE中的代碼替換如下:

                ((View) getParent()).scrollBy(-offsetX, -offsetY);

這里若要實現(xiàn)View隨手指移動的效果,則需要將偏移量設(shè)置為負(fù)值,為什么要設(shè)置負(fù)值呢?

假設(shè)我們正在用放大鏡來看報紙,放大鏡用來顯示子的內(nèi)容,同樣我們可以吧放大鏡看作我們的手機(jī)屏幕,它們都是負(fù)責(zé)顯示內(nèi)容,也就是報紙的內(nèi)容不會隨著放大鏡的移動而消失,它一直存在,同樣,我們的手機(jī)屏幕看不到的視圖并不代表其不存在,上圖畫布中有3個控件,及Button、EditText和SwitchButton。只有Button在屏幕中顯示,它的Android坐標(biāo)為(60,60)。現(xiàn)在我們調(diào)用scrollBy(50,50),按照字面的意思,這個Button應(yīng)該會在屏幕右下側(cè),可事實并非如此。如果我們調(diào)用scrollBy(50,50)里面的參數(shù)都會正值,則我們的手機(jī)屏幕想X軸正方向,也就是右邊平移50然后屏幕向Y正方向,也就是下方平移50,雖然我們設(shè)置的數(shù)值是正數(shù)并且在X軸和Y軸的正方向移動,但Button卻向反方向移動了,這就是參考對象不同導(dǎo)致的差異。

所以,當(dāng)我們使用scrollBy方法的時候,要是設(shè)置負(fù)數(shù)才會達(dá)到自己想要的效果。

5.Scroller

我們在用scrollTo/scrollBy方法進(jìn)行滑動時,這個過程是瞬間完成的,所以用戶體驗并不好,這里我們可以使用Scroller來實現(xiàn)有過度效果的滑動,這個過程不是瞬間完成的,而是在一定的時間間隔內(nèi)完成的。Scroller本身不能實現(xiàn)View的滑動,它需要與View的computeScroll方法配合才能實現(xiàn)彈性滑動效果

    public MyView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        mScroller = new Scroller(context);
    }

接下來重寫computeScroll方法,系統(tǒng)會在繪制View的時候在draw方法中調(diào)用該方法,在這個方法中,我們調(diào)用父類的scrollTo方法并通過Scroller來不斷獲取當(dāng)前的滑動值。每滑動一小段距離,我們就會調(diào)用invalidate方法不斷的進(jìn)行重繪。重繪就會調(diào)用computeScroll方法,這樣我們通過不斷地移動一個小的距離并連貫起來就實現(xiàn)了平滑移動的效果。

    @Override
    public void computeScroll() {
        super.computeScroll();
        if (mScroller.computeScrollOffset()) {
            ((View) getParent()).scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
            invalidate();
        }
    }

我們會在View中寫一個smoothScrollTo方法,調(diào)用Scroller的startScroll方法,在200ms內(nèi)沿X軸平移delta像素

    public void smoothScrollTo(int destX, int destY) {
        int scrollX = getScrollX();
        int delta = destX - scrollX;
        mScroller.startScroll(scrollX, 0, delta, 0, 2000);
        invalidate();
    }

最后我們在ViewSlideActivity.Java中調(diào)用View的smoothScrollTo方法。在此我們設(shè)定View沿V軸向右平移400像素

mCustomView.smoothScrollTo(-400,0);

到此這篇關(guān)于Android View滑動的實現(xiàn)分析示例的文章就介紹到這了,更多相關(guān)Android View滑動內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Android 側(cè)邊滑動關(guān)閉Activity的示例代碼

    Android 側(cè)邊滑動關(guān)閉Activity的示例代碼

    這篇文章主要介紹了Android 側(cè)邊滑動關(guān)閉Activity的方法,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-05-05
  • Android帶進(jìn)度的圓形進(jìn)度條

    Android帶進(jìn)度的圓形進(jìn)度條

    這篇文章主要為大家詳細(xì)介紹了Android帶進(jìn)度的圓形進(jìn)度條,實現(xiàn)自定義View,自定義屬性,感興趣的小伙伴們可以參考一下
    2016-02-02
  • Android控件View打造完美的自定義側(cè)滑菜單

    Android控件View打造完美的自定義側(cè)滑菜單

    這篇文章主要介紹了Android控件View打造完美的自定義側(cè)滑菜單的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-02-02
  • Android實現(xiàn)獲取短信驗證碼并自動填寫功能

    Android實現(xiàn)獲取短信驗證碼并自動填寫功能

    這篇文章主要為大家詳細(xì)介紹了Android實現(xiàn)獲取短信驗證碼并自動填寫功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • Android打空包后提示沒有"android:exported"的屬性設(shè)置問題解決

    Android打空包后提示沒有"android:exported"的屬性設(shè)置問題解決

    這篇文章主要介紹了Android打空包后提示沒有"android:exported"的屬性設(shè)置問題的解決方法,文中通過圖文將解決的辦法介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2023-02-02
  • Android自定義對話框Dialog

    Android自定義對話框Dialog

    這篇文章主要為大家詳細(xì)介紹了Android自定義對話框Dialog的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • Android?全局通知彈窗示例分析詳解

    Android?全局通知彈窗示例分析詳解

    這篇文章主要為大家介紹了Android?全局通知彈窗實現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • Android Studio卡很久(loading)的問題解決辦法

    Android Studio卡很久(loading)的問題解決辦法

    這篇文章主要介紹了Android Studio卡很久(loading很久)的問題的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • Listview加載的性能優(yōu)化是如何實現(xiàn)的

    Listview加載的性能優(yōu)化是如何實現(xiàn)的

    在android開發(fā)中Listview是一個很重要的組件,它以列表的形式根據(jù)數(shù)據(jù)的長自適應(yīng)展示具體內(nèi)容,用戶可以自由的定義listview每一列的布局,接下來通過本文給大家介紹Listview加載的性能優(yōu)化是如何實現(xiàn)的,對listview性能優(yōu)化相關(guān)知識感興趣的朋友一起學(xué)習(xí)吧
    2016-01-01
  • Android實現(xiàn)文件或文件夾壓縮成.zip格式壓縮包

    Android實現(xiàn)文件或文件夾壓縮成.zip格式壓縮包

    這篇文章主要為大家詳細(xì)介紹了Android實現(xiàn)文件或文件夾壓縮成.zip格式壓縮包,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-07-07

最新評論

永城市| 周至县| 平武县| 安泽县| 罗定市| 九江市| 兴安县| 东宁县| 阜阳市| 清河县| 若尔盖县| 纳雍县| 连平县| 荔浦县| 芮城县| 广昌县| 始兴县| 右玉县| 平利县| 嵊泗县| 吉木萨尔县| 淄博市| 南皮县| 浮梁县| 三门峡市| 延庆县| 抚远县| 桐城市| 武穴市| 吴堡县| 昭觉县| 曲水县| 巴里| 德保县| 綦江县| 会东县| 丹棱县| 巫山县| 禄劝| 南丰县| 屏东县|