亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

android開發教程之使用線程實現視圖平滑滾動示例

2020-04-11 11:52:30
字體:
來源:轉載
供稿:網友

最近一直想做下拉刷新的效果,琢磨了好久,才走到通過onTouch方法把整個視圖往下拉的步驟,接下來就是能拉下來,松開手要能滑回去啊。網上看了好久,沒有找到詳細的下拉刷新的例子,只有自己慢慢琢磨了。昨天和今天,研究了兩天,下拉之后回滾回去的效果終于今天做出來了!開心。現在來分享下我的實現方法和一些心得體會吧。
我看了網上一個大神的例子,發現是在onTouch里面使用View的scrollTo(int, int)方法,來使整個視圖往下滾動的,我嘗試了使用setTranslationY()來對視圖進行回滾,第一次是沒問題的,但多滾動幾次之后,整個視圖實際上已經到了非?!案摺钡牡胤搅?,要拉很長的距離才能看到內容。所以回滾也必須使用scrollTo(int, int)方法來操作。
但scrollTo(int, int)執行是瞬間的,方法名講是滾動到,實際上就是“瞬移到”某個位置,因此需要一步一步的去瞬移它,讓它看上去是滾過去的……

因為等下要去跑步了,還有就是也沒有什么很多的要點需要講解,我就直接上代碼給大家看,注釋都寫好了,要點會單獨提一下,更詳細的講解與心得就等著我哪天把下拉刷新實現了吧。

復制代碼 代碼如下:

/**
     * @desc    平滑滾動
     * @param    v        需要操控的視圖
     * @param    fromY    起始Y坐標
     * @param    toY        終止Y坐標
     * @param    fps        幀率
     * @param    durtion    動畫完成時間(毫秒)   
     * */
    private void smoothScroll(View v, int fromY, int toY, int fps, long durtion) { 
        smoothScrollThread = new SmoothScrollThread(v, fromY, toY, durtion, fps);
        smoothScrollThread.run();
    }

    /**
     * @desc    平滑滾動線程,用于遞歸調用自己來實現某個視圖的平滑滾動
     * */
    class SmoothScrollThread implements Runnable {   
        //需要操控的視圖
        private View v = null;     
        //原Y坐標
        private int fromY = 0; 
        //目標Y坐標
        private int toY = 0;     
        //動畫執行時間(毫秒)
        private long durtion = 0;     
        //幀率
        private int fps = 60;      
        //間隔時間(毫秒),間隔時間 = 1000 / 幀率
        private int interval = 0;  
        //啟動時間,-1 表示尚未啟動
        private long startTime = -1;
        /減速插值器
        private DecelerateInterpolator decelerateInterpolator = null;

        /**
         * @desc    構造方法,做好第一次配置
         * */
        public SmoothScrollThread(View v, int fromY, int toY, long durtion, int fps) {
            this.v = v;
            this.fromY = fromY;
            this.toY = toY;
            this.durtion = durtion;
            this.fps = fps;
            this.interval = 1000 / this.fps;      
            decelerateInterpolator = new DecelerateInterpolator();
        }
        @Override
        public void run() {
            //先判斷是否是第一次啟動,是第一次啟動就記錄下啟動的時間戳,該值僅此一次賦值
            if (startTime == -1) {
                startTime = System.currentTimeMillis();
            }         
            //得到當前這個瞬間的時間戳
            long currentTime = System.currentTimeMillis();     
            //放大倍數,為了擴大除法計算的浮點精度
            int enlargement = 1000;         
            //算出當前這個瞬間運行到整個動畫時間的百分之多少
            float rate = (currentTime - startTime) * enlargement / durtion;          
            //這個比率不可能在 0 - 1 之間,放大了之后即是 0 - 1000 之間
            rate = Math.min(rate, 1000);          
            //將動畫的進度通過插值器得出響應的比率,乘以起始與目標坐標得出當前這個瞬間,視圖應該滾動的距離。
            int changeDistance = (int) ((fromY - toY) * decelerateInterpolator.getInterpolation(rate / enlargement));           
            int currentY = fromY - changeDistance;          
            v.scrollTo(0, currentY);           
            if (currentY != toY) {
                postDelayed(this, this.interval);
            } else {
                return;
            }
        }  
        public void stop() {
            removeCallbacks(this);
        }
    }

一些要點:

1.使用線程的目的是可以遞歸的調用自己,在每個run()方法里只滾動一點點,這個一點點根據幀率和插值器來決定。

2.插值器實際上就是一個函數(數學里的函數),輸入0-1之間的浮點數,輸出0-1之間的浮點數,輸出的曲線是什么樣的,就看是什么插值器了,decelerate就是減速插值器了,在平面直角坐標系里面,x值均勻變化,y軸的變化越來越慢。

3.放大倍數(就是那里乘以1000)是為了提高精度,因為通過實踐發現用已經過的毫秒數除以整個動畫周期得出的結果是0.0 -> 0.0 -> 0.0 -> 0.0 -> 1.0 -> 1.0 -> 1.0 -> 1.0 -> 1.0 -> 2.0 -> 2.0 -> 2.0,雖然是浮點數,但精度卻莫名的保持在個位數上,乘以1000后,便會出現0-1000的均勻變化,這個時候去除以1000,便可得到0.000 - 1.000之間的均勻變化的數。

4.還有個很奇葩的是MotionEvent.getY()的值和scrollTo(int,int)的值貌似不是在同一個坐標系里面的。這個還有待進一步的分析和研究啊。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产一区二区视频在线观看| 亚洲国产成人精品久久| 91av在线精品| 欧美激情网友自拍| 久久九九免费视频| 北条麻妃一区二区在线观看| 日韩精品www| 久久精品在线视频| 久久亚洲精品成人| 日韩在线一区二区三区免费视频| 日本亚洲欧美三级| 亚洲国语精品自产拍在线观看| 麻豆国产va免费精品高清在线| 亚洲视频在线观看免费| 热久久视久久精品18亚洲精品| 日韩中文理论片| 欧美精品xxx| 在线色欧美三级视频| 精品在线小视频| 亚洲福利视频专区| 国产精品日韩在线观看| 神马久久桃色视频| 96pao国产成视频永久免费| 欧美最猛性xxxxx亚洲精品| 国产精品亚洲综合天堂夜夜| 欧美乱大交xxxxx另类电影| 欧美成人午夜激情在线| 一区二区三区回区在观看免费视频| 日韩电影免费观看中文字幕| 日韩精品极品视频| 一区二区三欧美| 91免费国产视频| 久久精品这里热有精品| 亚洲精品白浆高清久久久久久| 亚洲男人天堂2023| 欧美激情欧美狂野欧美精品| 亚洲大尺度美女在线| 成人性生交大片免费观看嘿嘿视频| 久久精品福利视频| 欧美日韩爱爱视频| 日韩在线观看你懂的| 亚洲精品综合久久中文字幕| 欧美华人在线视频| 亚洲精品视频二区| 欧美老少配视频| 国产一区香蕉久久| 亚洲第一页中文字幕| 亚洲国产精品久久久久久| 欧美午夜女人视频在线| 国产精品人成电影在线观看| 亚洲在线观看视频| 亚洲精品福利在线观看| 国产精品无av码在线观看| 亚洲国产成人精品一区二区| 欧美自拍大量在线观看| 久久精品国产精品亚洲| 欧美性20hd另类| 欧美精品少妇videofree| 国产日韩欧美一二三区| 欧美成人免费在线视频| 久久高清视频免费| 精品亚洲国产成av人片传媒| 97人人做人人爱| 国产精品亚发布| 欧美亚洲国产日韩2020| 国产精品国产三级国产专播精品人| www日韩中文字幕在线看| 亚洲第一区中文99精品| 91高潮在线观看| 日本在线精品视频| 91成人在线视频| 超碰精品一区二区三区乱码| 久久99精品久久久久久琪琪| 欧美在线亚洲一区| 久久伊人精品一区二区三区| 欧美一区第一页| 日本高清视频一区| 亚洲国产成人精品久久久国产成人一区| 国产在线精品一区免费香蕉| 美女黄色丝袜一区| 久久亚洲国产精品成人av秋霞| 国产欧美在线观看| 热99久久精品| 国产一区二区三区中文| 91国内产香蕉| 正在播放欧美一区| 波霸ol色综合久久| 欧美激情在线观看| 国产偷国产偷亚洲清高网站| 精品伊人久久97| 久久久之久亚州精品露出| 国产一区二区三区在线免费观看| 激情av一区二区| 精品久久久久久中文字幕| 日韩h在线观看| 在线观看精品国产视频| 日韩国产精品亚洲а∨天堂免| 日韩三级影视基地| 国产精品av免费在线观看| 欧美日韩亚洲国产一区| 高清日韩电视剧大全免费播放在线观看| 国产成人精品电影| 国产成人福利网站| 亚洲开心激情网| 伊人久久久久久久久久| 久久免费精品视频| 91chinesevideo永久地址| 国产视频综合在线| 久久视频这里只有精品| 久久国产精品99国产精| 日本午夜在线亚洲.国产| 亚洲欧美综合区自拍另类| 欧美性猛交视频| 17婷婷久久www| 成人免费大片黄在线播放| 成人精品一区二区三区电影黑人| 久久精品国产一区二区三区| 亚洲一区久久久| 欧美日韩国产一区在线| 亚洲图片欧美日产| 久久久久久久久久国产| 亚洲欧美精品一区二区| 亚洲最大福利视频网| 亚洲色图25p| 国产丝袜精品第一页| 成人精品久久一区二区三区| 欧美中文在线视频| 精品国产1区2区| 日韩中文在线中文网三级| 亚洲欧美www| 亚洲亚裔videos黑人hd| 亚洲欧洲黄色网| 北条麻妃一区二区在线观看| 日韩欧美在线视频免费观看| 久久综合88中文色鬼| 日韩一区二区三区xxxx| 国产一区二区在线免费视频| 国产精品欧美日韩一区二区| 色综合天天综合网国产成人网| 国产精品永久免费观看| 日韩av不卡电影| 最近2019中文字幕一页二页| 亚洲女人天堂色在线7777| 亚洲第一网站男人都懂| 亚洲成人黄色网| 欧美日韩国产中文精品字幕自在自线| 久久久久亚洲精品成人网小说| 国产精品视频区| 精品日韩美女的视频高清| 日韩av中文字幕在线免费观看| 亲子乱一区二区三区电影| 亚洲欧美中文在线视频| 欧美激情欧美狂野欧美精品| www.欧美三级电影.com| 国产丝袜视频一区| 91精品在线观| 国产精品美女久久久免费| 日韩欧美在线免费观看| 久久成人精品一区二区三区| 欧美视频中文字幕在线| 欧美日韩国产一区在线| 欧美在线影院在线视频| 国产精品影院在线观看| 上原亚衣av一区二区三区|