中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

android怎么自定義滾動上下回彈scollView

發布時間:2022-04-19 14:02:35 來源:億速云 閱讀:148 作者:iii 欄目:開發技術

這篇文章主要介紹“android怎么自定義滾動上下回彈scollView”,在日常操作中,相信很多人在android怎么自定義滾動上下回彈scollView問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”android怎么自定義滾動上下回彈scollView”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

這是一個自定義view,在xml布局中用這個view嵌套要使之可以上下回彈的view

就能實現布局可以滾動上下回彈了,自定義view代碼如下:

package com.loopfire.meitaotao.view.scrollView;
 
import android.content.Context;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.Animation.AnimationListener;
import android.view.animation.TranslateAnimation;
import android.widget.ScrollView;
 
/**
 * 上下回彈 scollView
 * 
 * @author Administrator
 * 
 */
public class MyScrollView extends ScrollView {
    private View inner;
    private float y;
    private Rect normal = new Rect();
    private boolean animationFinish = true;
 
    public MyScrollView(Context context) {
        super(context);
    }
 
    public MyScrollView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
 
    @Override
    protected void onFinishInflate() {
        if (getChildCount() > 0) {
            inner = getChildAt(0);
        }
    }
 
    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        return super.onInterceptTouchEvent(ev);
    }
 
    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        if (inner == null) {
            return super.onTouchEvent(ev);
        } else {
            commOnTouchEvent(ev);
        }
        return super.onTouchEvent(ev);
    }
 
    private void commOnTouchEvent(MotionEvent ev) {
        if (animationFinish) {
            int action = ev.getAction();
            switch (action) {
            case MotionEvent.ACTION_DOWN:
                // System.out.println("ACTION_DOWN");
                y = ev.getY();
                super.onTouchEvent(ev);
                break;
            case MotionEvent.ACTION_UP:
                // System.out.println("ACTION_UP");
                y = 0;
                if (isNeedAnimation()) {
                    animation();
                }
                super.onTouchEvent(ev);
                break;
            case MotionEvent.ACTION_MOVE:
                // System.out.println("ACTION_MOVE");
                final float preY = y == 0 ? ev.getY() : y;
                float nowY = ev.getY();
                int deltaY = (int) (preY - nowY);
                // 滾動
                // scrollBy(0, deltaY);
 
                y = nowY;
                // 當滾動到最上或者最下時就不會再滾動,這時移動布局
                if (isNeedMove()) {
                    if (normal.isEmpty()) {
                        // 保存正常的布局位置
                        normal.set(inner.getLeft(), inner.getTop(), inner.getRight(), inner.getBottom());
                    }
                    // 移動布局
                    inner.layout(inner.getLeft(), inner.getTop() - deltaY / 2, inner.getRight(), inner.getBottom() - deltaY / 2);
                } else {
                    super.onTouchEvent(ev);
                }
                break;
            default:
                break;
            }
        }
    }
 
    // 開啟動畫移動
 
    private void animation() {
        // 開啟移動動畫
        TranslateAnimation ta = new TranslateAnimation(0, 0, 0, normal.top - inner.getTop());
        ta.setDuration(200);
        ta.setAnimationListener(new AnimationListener() {
            @Override
            public void onAnimationStart(Animation animation) {
                animationFinish = false;
 
            }
 
            @Override
            public void onAnimationRepeat(Animation animation) {
 
            }
 
            @Override
            public void onAnimationEnd(Animation animation) {
                inner.clearAnimation();
                // 設置回到正常的布局位置
                inner.layout(normal.left, normal.top, normal.right, normal.bottom);
                normal.setEmpty();
                animationFinish = true;
            }
        });
        inner.startAnimation(ta);
    }
 
    // 是否需要開啟動畫
    private boolean isNeedAnimation() {
        return !normal.isEmpty();
    }
 
    // 是否需要移動布局
    private boolean isNeedMove() {
        int offset = inner.getMeasuredHeight() - getHeight();
        int scrollY = getScrollY();
        if (scrollY == 0 || scrollY == offset) {
            return true;
        }
        return false;
    }
 
}

在xml中使用如下:

<com.loopfire.meitaotao.view.scrollView.MyScrollView>
           <TextView
              
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:layout_marginLeft="@dimen/text_margin_left2"
              android:text="@string/about" />
</com.loopfire.meitaotao.view.scrollView.MyScrollView>

那么包含的這個textview可以上下滾動并且回彈了

到此,關于“android怎么自定義滾動上下回彈scollView”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

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

AI

榆中县| 巩义市| 武邑县| 旺苍县| 二连浩特市| 台南市| 乌拉特中旗| 永新县| 精河县| 呼图壁县| 金山区| 大城县| 东乌| 新巴尔虎左旗| 林西县| 贵定县| 泊头市| 金堂县| 高雄市| 海林市| 兴业县| 石嘴山市| 安丘市| 香港| 凌海市| 江安县| 迁西县| 浙江省| 赤峰市| 治多县| 城市| 阿图什市| 噶尔县| 云浮市| 昌邑市| 浑源县| 大姚县| 星子县| 湘西| 石台县| 平谷区|