国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Android > 正文

Android ScrollView實(shí)現(xiàn)反彈效果的實(shí)例

2019-10-22 18:31:47
字體:
供稿:網(wǎng)友

 Android ScrollView實(shí)現(xiàn)反彈效果

自定義ScrollView控件:

/**  * ScrollView反彈效果的實(shí)現(xiàn)  */ public class BounceScrollView extends ScrollView {   private View inner;// 孩子View    private float y;// 點(diǎn)擊時(shí)y坐標(biāo)    private Rect normal = new Rect();// 矩形(這里只是個(gè)形式,只是用于判斷是否需要動畫.)    private boolean isCount = false;// 是否開始計(jì)算    public BounceScrollView(Context context, AttributeSet attrs) {     super(context, attrs);   }    /***    * 根據(jù) XML 生成視圖工作完成.該函數(shù)在生成視圖的最后調(diào)用,在所有子視圖添加完之后. 即使子類覆蓋了 onFinishInflate    * 方法,也應(yīng)該調(diào)用父類的方法,使該方法得以執(zhí)行.    */   @Override   protected void onFinishInflate() {     if (getChildCount() > 0) {       inner = getChildAt(0);     }   }    /***    * 監(jiān)聽touch    */   @Override   public boolean onTouchEvent(MotionEvent ev) {     if (inner != null) {       commOnTouchEvent(ev);     }      return super.onTouchEvent(ev);   }    /***    * 觸摸事件    *    * @param ev    */   public void commOnTouchEvent(MotionEvent ev) {     int action = ev.getAction();     switch (action) {     case MotionEvent.ACTION_DOWN:       break;     case MotionEvent.ACTION_UP:       // 手指松開.       if (isNeedAnimation()) {         animation();         isCount = false;       }       break;     /***      * 排除出第一次移動計(jì)算,因?yàn)榈谝淮螣o法得知y坐標(biāo), 在MotionEvent.ACTION_DOWN中獲取不到,      * 因?yàn)榇藭r(shí)是MyScrollView的touch事件傳遞到到了LIstView的孩子item上面.所以從第二次計(jì)算開始.      * 然而我們也要進(jìn)行初始化,就是第一次移動的時(shí)候讓滑動距離歸0. 之后記錄準(zhǔn)確了就正常執(zhí)行.      */     case MotionEvent.ACTION_MOVE:       final float preY = y;// 按下時(shí)的y坐標(biāo)       float nowY = ev.getY();// 時(shí)時(shí)y坐標(biāo)       int deltaY = (int) (preY - nowY);// 滑動距離       if (!isCount) {         deltaY = 0; // 在這里要?dú)w0.       }        y = nowY;       // 當(dāng)滾動到最上或者最下時(shí)就不會再滾動,這時(shí)移動布局       if (isNeedMove()) {         // 初始化頭部矩形         if (normal.isEmpty()) {           // 保存正常的布局位置           normal.set(inner.getLeft(), inner.getTop(),               inner.getRight(), inner.getBottom());         }         Log.e("jj", "矩形:" + inner.getLeft() + "," + inner.getTop()             + "," + inner.getRight() + "," + inner.getBottom());         // 移動布局         inner.layout(inner.getLeft(), inner.getTop() - deltaY / 2,             inner.getRight(), inner.getBottom() - deltaY / 2);       }       isCount = true;       break;      default:       break;     }   }    /***    * 回縮動畫    */   public void animation() {     // 開啟移動動畫     TranslateAnimation ta = new TranslateAnimation(0, 0, inner.getTop(),         normal.top);     ta.setDuration(200);     inner.startAnimation(ta);     // 設(shè)置回到正常的布局位置     inner.layout(normal.left, normal.top, normal.right, normal.bottom);      Log.e("jj", "回歸:" + normal.left + "," + normal.top + "," + normal.right         + "," + normal.bottom);      normal.setEmpty();    }    // 是否需要開啟動畫   public boolean isNeedAnimation() {     return !normal.isEmpty();   }    /***    * 是否需要移動布局 inner.getMeasuredHeight():獲取的是控件的總高度    *    * getHeight():獲取的是屏幕的高度    *    * @return    */   public boolean isNeedMove() {     int offset = inner.getMeasuredHeight() - getHeight();     int scrollY = getScrollY();     Log.e("jj", "scrolly=" + scrollY);     // 0是頂部,后面那個(gè)是底部     if (scrollY == 0 || scrollY == offset) {       return true;     }     return false;   }  } 

實(shí)現(xiàn)反彈效果:

<com.techrare.view.BounceScrollView     android:layout_width="fill_parent"     android:layout_height="fill_parent"     android:background="@color/tab_chart_bg"     android:scrollbars="none" >      <LinearLayout       android:layout_width="fill_parent"       android:layout_height="match_parent"       android:gravity="center_horizontal"       android:orientation="vertical"       android:paddingLeft="20dp"       android:paddingRight="20dp" > <span style="white-space:pre">   </span><!-- 這里可以盡情的布局 -->     </LinearLayout> </com.techrare.view.BounceScrollView> 

以上就是 Android ScrollView實(shí)現(xiàn)反彈效果的實(shí)例的講解,本站關(guān)于Android開發(fā)的文章還有很多,歡迎大家搜索查閱,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!


注:相關(guān)教程知識閱讀請移步到Android開發(fā)頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 吐鲁番市| 中山市| 广汉市| 长汀县| 乌什县| 云霄县| 新巴尔虎右旗| 教育| 忻州市| 宝坻区| 肃宁县| 屏东市| 神池县| 青海省| 台前县| 乐亭县| 中超| 越西县| 义马市| 东阳市| 海南省| 天峻县| 梁山县| 纳雍县| 江阴市| 姜堰市| 平舆县| 宜州市| 新化县| 休宁县| 古丈县| 石景山区| 青浦区| 汉中市| 普陀区| 卢氏县| 扶余县| 西林县| 天祝| 云阳县| 古蔺县|