日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

自定义控件:Viewpager

發布時間:2025/4/16 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 自定义控件:Viewpager 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

自定義控件:Viewpager

package com.itheima.myviewpager66;import android.content.Context; import android.util.AttributeSet; import android.view.GestureDetector; import android.view.MotionEvent; import android.view.ViewGroup; import android.widget.Scroller;/*** 自定義ViewPager* * 1. 寫一個類繼承ViewGroup* 2. 重寫onLayout方法, 保證孩子正常顯示(一字排開)* 3. 重寫onTouchEvent, 手勢識別器(onScroll),scrollby* 4. 監聽手指抬起事件,根據當前滑動后位置,確定下一個頁面, scrollTo* 5. 防止pos過大* 6. 平滑移動, Scroller, startScroll->computeScroll* 7. 增加RadioButton, 監聽自定義viewpager頁面切換(回調接口),更改raidoButton選中位置* 8. 監聽RadioButton切換事件, 更改頁面* 9. 增加測試頁面(ScrollView)* 11. 重寫onMeasure,測量每個孩子* 12. 重寫onInterceptTouchEvent, 在適當時機(水平滑動),中斷事件傳遞* @author Kevin* @date 2015-8-8*/ public class MyViewPager extends ViewGroup {// 手勢識別器private GestureDetector mDetector;private Scroller mScroller;public MyViewPager(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);initView();}public MyViewPager(Context context, AttributeSet attrs) {super(context, attrs);initView();}public MyViewPager(Context context) {super(context);initView();}private void initView() {mDetector = new GestureDetector(getContext(),new GestureDetector.SimpleOnGestureListener() {// 手勢滑動@Overridepublic boolean onScroll(MotionEvent e1, MotionEvent e2,float distanceX, float distanceY) {scrollBy((int) distanceX, 0);// 滑動x,y方向偏移一定距離, 相對位移// scrollTo(x, y);//絕對位移, 移動到確定的x,y坐標位置return super.onScroll(e1, e2, distanceX, distanceY);}});// 初始化滑動器mScroller = new Scroller(getContext());}// 測量布局寬高@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);// 手動測量所有孩子的寬高, 解決測試頁面無法展示的bugint childCount = getChildCount();for (int i = 0; i < childCount; i++) {getChildAt(i).measure(widthMeasureSpec, heightMeasureSpec);}System.out.println("widthMeasureSpec:" + widthMeasureSpec);System.out.println("heightMeasureSpec:" + heightMeasureSpec);int size = MeasureSpec.getSize(widthMeasureSpec);System.out.println("width:" + size);int mode = MeasureSpec.getMode(widthMeasureSpec);//MeasureSpec.AT_MOST; //wrap_content//MeasureSpec.EXACTLY; //確定值 , 寬高寫死, 100dp/ match_parent//MeasureSpec.UNSPECIFIED;//沒有指定寬高System.out.println("mode:" + mode);}// 設置布局位置@Overrideprotected void onLayout(boolean changed, int l, int t, int r, int b) {// 手動設置孩子們的位置, 保證一字排開int childCount = getChildCount();for (int i = 0; i < childCount; i++) {getChildAt(i).layout(0 + i * getWidth(), 0, (i + 1) * getWidth(),getHeight());}}@Overridepublic boolean onTouchEvent(MotionEvent event) {mDetector.onTouchEvent(event);// 委托手勢識別器處理switch (event.getAction()) {case MotionEvent.ACTION_UP:// 1.獲取當前滑動的位置// 2.根據當前位置,確定應該跳到第幾個頁面// 3.跳到確定頁面int scrollX = getScrollX();// System.out.println("scrollX:" + scrollX);// 計算應該跳轉到下一個頁面的哪個位置int pos = (scrollX + getWidth() / 2) / getWidth();// //350 / 320 = 1// int pos = scrollX / getWidth();// // 350% 320 = 30// int offset = scrollX % getWidth();// if (offset > getWidth() / 2) {// pos++;// }// System.out.println("pos:" + pos);// 防止pos過大if (pos > getChildCount() - 1) {pos = getChildCount() - 1;}// 移動到確定頁面// scrollTo(pos * getWidth(), 0);setCurrentItem(pos);break;default:break;}return true;}// 當調用startScroll后,系統會不斷回調此方法@Overridepublic void computeScroll() {if (mScroller.computeScrollOffset()) {// 判斷滑動回調有沒有結束int currX = mScroller.getCurrX();// 獲取當前應該移動到的位置System.out.println("currX:" + currX);scrollTo(currX, 0);// 移動到確定位置invalidate();// 刷新界面}}private OnPageChangeListener mListener;public void setOnPageChangeListener(OnPageChangeListener listener) {mListener = listener;}public interface OnPageChangeListener {public void onPageSelected(int position);}/*** 切換到某個具體的頁面* * @param position*/public void setCurrentItem(int pos) {// 平滑的移動到某個位置int distance = pos * getWidth() - getScrollX();// 目標位置減去當前位置,獲得要滑動的距離// 開始滑動, 滑動時間等于距離絕對值,// 保證距離越長,時間越久(此方法不會產生滑動,而是會導致不斷回調computeScroll,需要在這個方法中處理滑動邏輯)mScroller.startScroll(getScrollX(), 0, distance, 0, Math.abs(distance));// 參1:開始x,// 參2:開始y;參3:x偏移,參4:y偏移;參5:滑動時間invalidate();// 刷新界面,保證滑動器正常運行// 頁面切換的回調if (mListener != null) {mListener.onPageSelected(pos);}}int startX;int startY;// 事件中斷 onInterceptTouchEvent->onTouchEvent@Overridepublic boolean onInterceptTouchEvent(MotionEvent ev) {// 如果左右滑動, 就需要攔截, 上下滑動,不需要攔截switch (ev.getAction()) {case MotionEvent.ACTION_DOWN:mDetector.onTouchEvent(ev);// 將ACTION_DOWN傳遞給手勢識別器, 避免事件丟失startX = (int) ev.getX();startY = (int) ev.getY();break;case MotionEvent.ACTION_MOVE:int endX = (int) ev.getX();int endY = (int) ev.getY();int dx = endX - startX;int dy = endY - startY;if (Math.abs(dx) > Math.abs(dy)) {// 左右滑動return true;// 中斷事件傳遞, 不允許孩子響應事件了, 由父控件處理}break;default:break;}return false;// 不攔截事件,優先傳遞給孩子處理}// 事件分發dispatchTouchEvent->onInterceptTouchEvent->onTouchEvent@Overridepublic boolean dispatchTouchEvent(MotionEvent ev) {return super.dispatchTouchEvent(ev);} }

總結

以上是生活随笔為你收集整理的自定义控件:Viewpager的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产一区二区三区四区视频 | 日本在线观看a | 欧美伦理片 | 亚洲色婷婷一区二区三区 | 日韩天天操 | 瑟瑟在线观看 | 伦理av在线 | 播色网| 狐狸视频污 | 亚洲双插 | 玖草在线 | 三级在线国产 | 99精品视频免费版的特色功能 | 超碰午夜 | 老熟妇高潮一区二区三区 | 亚洲成人91 | 日本少妇毛茸茸高潮 | 偷拍亚洲欧美 | 亚洲第一激情 | 一级黄色短片 | 在线天堂www在线国语对白 | 亚洲不卡视频 | 性xxxxbbbb| 国产毛片精品国产一区二区三区 | 国产真实自拍 | 日本性网站 | av网址观看 | 欧美午夜精品久久久久免费视 | 毛片毛片毛片毛片毛片毛片毛片 | av资源网在线 | 久久久久亚洲av无码a片 | 国产福利视频一区二区三区 | 国内偷拍一区 | 亚洲成人999 | 少妇欧美激情一区二区三区 | 在线观看高清av | 91精品久久久久久综合五月天 | 日本中文字幕免费观看 | 97欧美视频 | 国产一级性生活 | 国产精品无码一本二本三本色 | 亚洲美女福利 | 日日躁夜夜躁狠狠久久av | 亚洲av无码国产综合专区 | 538任你躁在线精品免费 | 午夜草逼 | 色福利hd写真video | 精品国产美女 | 夜夜嗨av禁果av粉嫩av懂色av | 国产一页 | 成人在线观看av | 午夜久久久久久久久久影院 | 给我免费观看片在线电影的 | 黄色一级视频 | 男女黄色网 | 欧美激情一区二区视频 | 国产69精品久久久久久久久久 | 色窝窝综合色窝窝久久 | 成人免费超碰 | 天天插插 | 北条麻妃99精品青青久久 | 久久国产精品网站 | 亚洲91av| 国产精品成人一区二区 | 国产999| 曰批又黄又爽免费视频 | 久久久在线视频 | 国产成人精品久久二区二区91 | 色综合天天色综合 | av2018| 精品国模一区二区三区 | 丰满少妇乱子伦精品看片 | 精品少妇无码av无码专区 | 在线看片日韩 | 欧美精品第1页 | 一本大道东京热无码 | 污网站免费在线 | 免费在线观看网址入口 | 天堂在线视频 | 国产精品99久久久久久久久 | 欧美影视一区二区三区 | 日本理伦片午夜理伦片 | 69视频在线看 | 日韩免费观看视频 | 欧美色精品在线 | 亚洲男人的天堂网站 | 国产精品亚洲无码 | 美女三区 | 麻豆国产网站 | 免费涩涩网站 | 欧洲中文字幕日韩精品成人 | 久草免费福利视频 | 捆绑调教在线观看 | 少妇精品无码一区二区三区 | 无码人妻丰满熟妇区毛片18 | 久久久成人精品一区二区三区 | 久草影视在线 | 午夜免费一区二区 | 大陆av在线 |