亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android仿qq回彈阻尼ScrollView

發布時間:2020-03-24 11:31:32 來源:網絡 閱讀:2450 作者:liuyvhao 欄目:移動開發

仿qq寫一個可以來回彈的ScrollView.

只需要重寫ScrollView:

public class MyScrollView extends ScrollView {
    // y方向上當前觸摸點的前一次記錄位置
    private int previousY = 0;
    // y方向上的觸摸點的起始記錄位置
    private int startY = 0;
    // y方向上的觸摸點當前記錄位置
    private int currentY = 0;
    // y方向上兩次移動間移動的相對距離
    private int deltaY = 0;
    // 第一個子視圖
    private View childView;
    // 用于記錄childView的初始位置
    private Rect topRect = new Rect();
    public MyScrollView(Context context) {
        super(context);
    }

    public MyScrollView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public MyScrollView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @SuppressLint("MissingSuperCall")
    @Override
    protected void onFinishInflate() {
        if (getChildCount() > 0) {
            childView = getChildAt(0);
        }
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent event) {
        if (null == childView) {
            return super.dispatchTouchEvent(event);
        }
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                startY = (int) event.getY();
                previousY = startY;
                break;
            case MotionEvent.ACTION_MOVE:
                currentY = (int) event.getY();
                deltaY = previousY - currentY;
                previousY = currentY;
                if (0 == getScrollY()
                        || childView.getMeasuredHeight() - getHeight() <= getScrollY()) {
                    // 記錄childView的初始位置
                    if (topRect.isEmpty()) {
                        topRect.set(childView.getLeft(), childView.getTop(),
                                childView.getRight(), childView.getBottom());
                    }
                    // 更新childView的位置
                    childView.layout(childView.getLeft(), childView.getTop()
                                    - deltaY / 3, childView.getRight(),
                            childView.getBottom() - deltaY / 3);
                }
                break;
            case MotionEvent.ACTION_UP:
                if (!topRect.isEmpty()) {
                    upDownMoveAnimation();
                    // 子控件回到初始位置
                    childView.layout(topRect.left, topRect.top, topRect.right,
                            topRect.bottom);
                }
                startY = 0;
                currentY = 0;
                topRect.setEmpty();
                break;
            default:
                break;
        }
        return super.dispatchTouchEvent(event);
    }

    // 初始化上下回彈的動畫效果
    private void upDownMoveAnimation() {
        TranslateAnimation animation = new TranslateAnimation(0.0f, 0.0f,
                childView.getTop(), topRect.top);
        animation.setDuration(100);
        animation.setInterpolator(new AccelerateInterpolator());
        childView.setAnimation(animation);
    }
}

然后想在哪用直接布局就行了。這種重寫方法是不會和子控件的點擊事件起沖突的。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

岳池县| 徐州市| 罗源县| 西平县| 都匀市| 龙州县| 句容市| 古交市| 舟曲县| 凤山县| 嫩江县| 蒲城县| 大新县| 天津市| 永定县| 镇远县| 林西县| 泉州市| 南澳县| 晋城| 平邑县| 张掖市| 乡宁县| 宜州市| 西吉县| 温宿县| 塔城市| 旬邑县| 丹巴县| 东方市| 禄丰县| 南澳县| 襄樊市| 芦溪县| 靖州| 鄯善县| 美姑县| 庆云县| 虎林市| 河东区| 教育|