Androidのカスタムviewpager


×現在のコードを実装のみカスタム表示viewpager指定されたサイズ、スリップイベント、クリックイベント
×/

パッケージ
com.example.myviewpager.views; インポートandroid.content.Context; インポートandroid.graphics.Color; インポートandroid.os .SystemClock; インポートandroid.util.AttributeSet; インポートandroid.view.MotionEvent; インポートandroid.view.View; インポートandroid.view.ViewGroup; インポートandroid.widget.Scroller、 パブリック クラス MyViewPager 延びのViewGroup { プライベート 静的 最終列タグ= 「タグ」; プライベート int型mWidth; // 幅の合計 プライベート int型 ; mHeight // の高さの合計 プライベート フロート STARTX; // 記録クリック位置 プライベート int型の pagerWidth; // 幅各子 プライベート int型のCurrentItem; // 現在の子のインデックス表示 プライベートスクローラスクローラを、 プライベート ロングダウンタイム、 プライベートonViewPagerItemClickListener onViewPagerItemClickListener、 プライベートOnScrollListener onScrollListener; 公共OnScrollListener getOnScrollListener(){ リターン onScrollListener。 } 公共 ボイドsetOnScrollListener(OnScrollListener onScrollListener){ この .onScrollListener = onScrollListener。 } 公共MyViewPager.OnViewPagerItemClickListener getOnViewPagerClickListener(){ 戻りonViewPagerItemClickListener。 } 公共 ボイドsetOnViewPagerClickListener(MyViewPager.OnViewPagerItemClickListener onViewPagerItemClickListener){ この .onViewPagerItemClickListener = onViewPagerItemClickListener。 } 公共MyViewPager(コンテキスト・コンテキスト){ スーパー(コンテキスト)。 } 公共 MyViewPager(最終コンテキスト・コンテキスト、属性セットATTRS){ スーパー(文脈、ATTRS)。 スクローラ = 新しいスクローラ(コンテキスト)。 ViewGroup.LayoutParams LP = 新しいLayoutParams(LayoutParams.MATCH_PARENT、LayoutParams.MATCH_PARENT)。 以下のためにINT iが= 0; I <3; I ++ ){ ビュービュー = 新しいビュー(コンテキスト) もし(I == 0 view.setBackgroundColor(Color.RED)。 もし(I == 1 view.setBackgroundColor(Color.YELLOW)。 もし(I == 2 view.setBackgroundColor(Color.BLUE)。 view.setLayoutParams(LP); view.setTag(I); addView(図)。 } } パブリック MyViewPager(コンテキスト・コンテキスト、属性セットattrsに、INT defStyleAttr){ スーパー(文脈、attrsに、defStyleAttr)。 } @Overrideが 保護 ボイド onLayout(ブール変更、INT L、INT T、INT R、int型の{B)の 場合(変更){ int型childCount = のgetChildCount()。 以下のためにint型私は= 0; I <childCount; I ++){ // 布局每个孩子 ビューの子= getChildAt(I); child.layout(I * pagerWidth、0、(I + 1)* pagerWidth、mHeight)。 } } } @Overrideは、 保護された ボイド onMeasure(INT widthMeasureSpec、INT heightMeasureSpec){ スーパー.onMeasure(widthMeasureSpec、heightMeasureSpec)を、 INT childCount = のgetChildCount()。 もし(childCount> 0 ){ ビューchildAt = getChildAt(0 ); childAt.measure(widthMeasureSpec、heightMeasureSpec); int型 measuredHeightの= childAt.getMeasuredHeight(); INTはmeasuredWidth = childAt.getMeasuredWidth(); mWidth =はmeasuredWidth * childCount; mHeight = measuredHeightの; pagerWidth = はmeasuredWidth; setMeasuredDimension(pagerWidth、mHeight); // ページャサイズを設定し、子の幅の幅、 // 子供およびすべての子の幅の全てが表示される場合(ページャがスクリーンで覆われていない場合) } } @Override postInvalidate()。パブリック ブールonInterceptTouchEvent(MotionEvent EV){ 戻り } ブール isclick = @Override 公共 ボイドcomputeScroll(){ スーパー.computeScroll()。 もし(scroller.computeScrollOffset()){ scrollTo(scroller.getCurrX()、 0 ); もし(!onScrollListener = NULL ){ onScrollListener.onScroll(のCurrentItem、getScrollX())。 } } } ブール=一度falseに; @Override 公共 ブールonTouchEvent(MotionEventイベント){ スーパー.onTouchEvent(イベント); スイッチ(event.getAction()){ ケースMotionEvent.ACTION_DOWN: ダウンタイム = SystemClock.currentThreadTimeMillis(); STARTX = event.getX() ; BREAK ; ケースMotionEvent.ACTION_MOVE: IF(!1回){ // ロングスライド距離が所定距離が考えられるスライド状態、その後の無制限の距離をスライドより大きい フロート距離= event.getX() - STARTX。 もし(Math.abs(距離)> 8 ){ 一度 = isclick = ; // 不是单击、而是滑动 } isclick = ; } { フロート距離= event.getX() - STARTX。 scrollBy( - (INT)距離、0 ); もし(getScrollX()<= 0){ //右のスライドが禁止されたときに最初のページ scrollTo(0、0 ); のCurrentItem = 1 ; } IF(getScrollX() - pagerWidth *(のgetChildCount() - 1)> 0){ // 最後のページが左のスライダ禁止さ scrollTo(pagerWidth *(のgetChildCount() - 。1)、0 ); のCurrentItem = のgetChildCount(); } IF(onScrollListener!= NULL){ // 呼び出しリスニング摺動 onScrollListener.onScroll(のCurrentItem、getScrollXを()); } STARTX =event.getX(); isclick = falseに; } BREAK ; ケースMotionEvent.ACTION_UP: ロング稼働時間= SystemClock.currentThreadTimeMillis(); ロング UseTime =稼働時間- ダウンタイム、 IF(&&一度!{isclick) STARTX = 0 ; int型 scrolleX = getScrollX (); int型指数=(scrolleX pagerWidth + / 2)/ pagerWidth; // 次の半分以上のスライド、または還元 scroller.startScroll(scrolleX、0、*インデックスpagerWidth - scrolleX、0 ); のCurrentItem = インデックス; postInvalidate(); 一度 = falseに; } IF(!一度&& && UseTime isclick <50){ // コールクリックリスナー、50未満クリックでMS、大型プレスを達成していないを押し IF(onViewPagerItemClickListener =!ヌル onViewPagerItemClickListener.onClick(のCurrentItem); isclick = trueに; } BREAK ; } リターン ; } パブリック インターフェイスOnViewPagerItemClickListener { ボイドのonClick(int型位置) } パブリック インターフェイスOnScrollListener { ボイド onScroll(INT PAGENUM、INT scrolx)。 } }

 

おすすめ

転載: www.cnblogs.com/libing029/p/12375428.html