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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

QQ 5.0侧滑HorizontalScrollView以及自定义ViewGroup

發布時間:2025/3/20 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 QQ 5.0侧滑HorizontalScrollView以及自定义ViewGroup 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
? 一般側滑的實現: 自定義的ViewGroup(menu+content) ouTouchEvent事件改變ViewGroup的LeftMargin。 大于菜單的一半顯示,小于則隱藏(使用Scroller或者LeftMargin加Thread)。 新的方法: 繼承HorizontalScrollView,由于menu+content一定是大于屏幕的寬度,那么水平滾動條會自動進行拖動, 我們只要做偏移的距離還顯示或隱藏menu或content。 1.最簡單的側滑
自定義ViewGroup即HorizontalScrollView。并復寫其中的三個主要方法: 1.onMeasure:即決定內部的View的寬和高,以及自己的寬和高; 2.onLayout:決定子View的放置位置; 3.onTouchEvent:判斷用戶的狀態,控制內部View效果。
  • scrollTo和scrollBy方法:是scrollView的方法,因為view和Canvas是沒有邊界的。

    public void?scrollTo(int x, int y)

    ????????????? 說明:在當前視圖內容偏移至(x , y)坐標處,即顯示(可視)區域位于(x , y)坐標處。

    ?

    public void?scrollBy(int x, int y)? ??

    ? ? ? ? ? ? ? 說明:在當前視圖內容繼續偏移(x , y)個單位,顯示(可視)區域也跟著偏移(x,y)個單位。顯示部分在大的view中也偏移了位置。

    onTouchEvent事件類型:

    ? ? ACTION_DOWN: 表示用戶開始觸摸.

    ? ? ACTION_MOVE: 表示用戶在移動(手指或者其他)

    ? ? ACTION_UP:表示用戶抬起了手指

    ? ? ACTION_CANCEL:表示手勢被取消了

    publicclassSlidingMenuextendsHorizontalScrollView{privateLinearLayout mWapper;privateViewGroup mMenu;privateViewGroup mContent;privateint mScreenWidth;privateint mMenuWidth;privateint mMenuRightPadding =50;//menu與屏幕右側的間距 、privateboolean once =false;publicSlidingMenu(Context context,AttributeSet attrs){super(context, attrs);WindowManager wm = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE);DisplayMetrics outMetrics =newDisplayMetrics();wm.getDefaultDisplay().getMetrics(outMetrics);mScreenWidth = outMetrics.widthPixels;//把dp轉換為pxmMenuRightPadding =(int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,50,context.getResources().getDisplayMetrics()); } /* *設置子view的寬和高,和自己的寬和高(子view確定好之后就確定自己的了) */ @Override protectedvoid onMeasure(int widthMeasureSpec,int heightMeasureSpec){super.onMeasure(widthMeasureSpec, heightMeasureSpec);if(!once){mWapper =(LinearLayout)getChildAt(0);mMenu =(ViewGroup)mWapper.getChildAt(0);mContent =(ViewGroup)mWapper.getChildAt(1);mMenuWidth = mMenu.getLayoutParams().width = mScreenWidth - mMenuRightPadding;mContent.getLayoutParams().width = mScreenWidth;//子view寬度決定之后,本身也就決定了once =true;} } /* *通過設置偏移量,將menu隱藏 */ @Override protectedvoid onLayout(boolean changed,int l,int t,int r,int b){ super.onLayout(changed, l, t, r, b);if(changed){this.scrollTo(mMenuWidth,0);} } @Override publicboolean onTouchEvent(MotionEvent ev){int action = ev.getAction();switch(action){caseMotionEvent.ACTION_UP:int scrollX = getScrollX();//scrollX是隱藏是在左邊的寬度if(scrollX >= mMenuWidth/2){this.smoothScrollTo(mMenuWidth,0);}else{this.smoothScrollTo(0,0);}returntrue;}returnsuper.onTouchEvent(ev);} } 接著在XML中使用,要使用完整包名,只能放一個子控件,因為是FrameLayout。
  • <com.example.kevin.myapplication.SlidingMenu android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayoutandroid:layout_width="wrap_content"android:layout_height="match_parent"android:orientation="horizontal"><include layout="@layout/left_menu"/><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:background="@drawable/qq"></LinearLayout> </LinearLayout> </com.example.kevin.myapplication.SlidingMenu>
  • ? 1.1自定義屬性 自定義屬性:允許用戶設置菜單離屏幕右側屬性,常用在view和viewGroup。資源所定義的屬性發揮作用取決于自定義組件的代碼實現。 ? ? ? ?1.書寫XML文件value/attr.xml; 放在values目錄下,屬性資源文件的根元素是<resources../>,包含兩個元素。 attr子元素:定義一個屬性值。 declare-styleable:定義一個styleable對象,每個styleable對象就是一組attr屬性的集合。
  • <?xml version="1.0" encoding="utf-8"?> <resources> <attr name="rightPadding" format="dimension"/> <declare-styleable name="SlidingMenu"> <attr name="rightPadding"/> </declare-styleable> </resources>
  • ? ?2.在布局文件進行使用,xmlns定義命名空間
  • <com.example.kevin.myapplication.SlidingMenu android:id="@+id/id_menu" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/img_frame_background" my:rightPadding="100dp"> <LinearLayout android:layout_width="wrap_content" android:layout_height="match_parent" android:orientation="horizontal"> <include layout="@layout/left_menu"/> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/qq"> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="toggleMenu" android:text="切換菜單"/> </LinearLayout> </LinearLayout> </com.example.kevin.myapplication.SlidingMenu>
  • ? ? ? ? ?更改menu距離右邊距離100dp。 ? ? ? 3.在構造方法中(3個參數的構造方法)中獲得我們設置的值 接著使用TypeArray。它是一個存放恢復obtainStyledAttributes(AttributeSet, int[], int, int)或 obtainAttributes(AttributeSet, int[]) ?值的一個 數組容器 。當操作完成以后,一定要調用recycle()方法。
  • //獲取定義的屬性 TypedArray a = context.obtainStyledAttributes(attrs,R.styleable.SlidingMenu); int n = a.getIndexCount();//拿到自定義屬性個數 for(int i=0;i<n;i++){ int attr = a.getIndex(i); switch(attr){ case R.styleable.SlidingMenu_rightPadding:mMenuRightPadding = a.getDimensionPixelSize(attr,(int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,50,context.getResources().getDisplayMetrics())); break;} }
  • 2.抽屜式側滑 菜單仿佛在內容區域以下:當左邊content拉出多少,左邊menu就設置menuWidth-拉出距離的偏移量。 這里需要設置屬性動畫(3.0引入的):TranslationX。為了往下兼容必須引入com.nineoldandroids:library:2.4.0這個jar。 選擇調用動畫的時機可用?onScrollChanged。
  • /* *滾動發生時 */ @Override protectedvoid onScrollChanged(int l,int t,int oldl,int oldt){super.onScrollChanged(l, t, oldl, oldt);float scale = l*1.0f/mMenuWidth;//1~0//調用屬性動畫設置anslationX。ViewHelper.setTranslationX(mMenu, mMenuWidth * scale); }
  • l相當于就是getScrillX()。 3.QQ式側滑
    區別在于:scale:1~0 1.內容區域縮放1~0.7縮放效果, 0.7+0.3*scale; 2.菜單的偏移量需要修改; 3.菜單的顯示有縮放以及透明度0.7~1,1.0?- 0.3*scale ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?0.6~1,0.6 + 0.4*(1-scale)。
  • protectedvoid onScrollChanged(int l,int t,int oldl,int oldt){super.onScrollChanged(l, t, oldl, oldt); float scale = l*1.0f/mMenuWidth;//1~0 //調用屬性動畫設置anslationX。ViewHelper.setTranslationX(mMenu, mMenuWidth * scale); float rightScale =0.7f+0.3f* scale; float leftScale =1.0f- scale *0.3f; float leftAlpha =0.6f+0.4f*(1- scale);ViewHelper.setScaleX(mMenu, leftScale);ViewHelper.setScaleY(mMenu, leftScale);ViewHelper.setAlpha(mMenu, leftAlpha); // 設置content的縮放的中心點ViewHelper.setPivotX(mContent,0);ViewHelper.setPivotY(mContent, mContent.getHeight()/2);ViewHelper.setScaleX(mContent, rightScale);ViewHelper.setScaleY(mContent, rightScale); }
  • 慕課網學習筆記:http://www.imooc.com/learn/211 參考: http://blog.csdn.net/qinjuning/article/details/7247126? ?scrollTo 以及 scrollBy方法使用說明 http://blog.csdn.net/qinjuning/article/details/7419207? ? 側滑實現 http://my.oschina.net/banxi/blog/56421? ? ? ? ? ? ? ? ? ? ? ??motionevent

    ?

    轉載于:https://www.cnblogs.com/fruitbolgs/p/4232002.html

    總結

    以上是生活随笔為你收集整理的QQ 5.0侧滑HorizontalScrollView以及自定义ViewGroup的全部內容,希望文章能夠幫你解決所遇到的問題。

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

    主站蜘蛛池模板: 欧美一线天 | 亚洲欧美一区二区三区情侣bbw | 久久桃花网 | 免费中文字幕av | 国内精品在线播放 | 91污网站 | av色在线| 亚洲国产精品毛片av不卡在线 | 日本不卡高清视频 | 国产又粗又猛又爽又黄的网站 | 亚洲色图久久 | 青青色在线 | 美女露出让男生揉的视频 | 大地资源影视在线播放观看高清视频 | 91成年版| 欧美成人国产精品一区二区 | 久久福利电影 | 免费不卡的av | 免费黄色在线播放 | 精品无码久久久久 | 亚洲一区二区三区四区五区xx | 亚洲a图 | 成人啪啪 | 男人日女人逼 | 久久久99精品免费观看 | 91久色视频 | 美女黄色一级片 | 国产精品人人爽人人爽 | 特级西西444www大精品视频 | 国产片淫乱18一级毛片动态图 | 五月婷婷综 | 人妻丰满熟妇av无码区不卡 | 丰满人妻一区二区三区免费视频棣 | 九九影院最新理论片 | 亚洲日本一区二区 | 国产精品伦一区二区三区免费看 | 日韩电影一区二区三区四区 | 日韩欧美精品在线视频 | 黄色在线观看免费视频 | 黄色亚洲精品 | 在线成人免费视频 | 欧美男同又粗又长又大 | 99精品久久精品一区二区 | 97国产视频 | 已满18岁免费观看电视连续剧 | 亚洲精品成人无码毛片 | 久久免费精品 | 国产一区二区免费 | 亚洲裸体网站 | 天堂在线一区 | 成 年 人 黄 色 大 片大 全 | 国产视频观看 | 久久久久久久国产 | 在线视频免费观看你懂的 | 中文字幕色哟哟 | 久草资源在线视频 | 狂野欧美性猛交blacked | 亚洲男女视频 | 欧美3p在线观看 | 三上悠亚ed2k| 日本人妻丰满熟妇久久久久久 | 久久免费在线观看视频 | 亚洲欧美一区二区三区久久 | 黄色在线观看视频网站 | 毛片网站在线观看 | 国产午夜精品一区 | 亚洲av永久无码精品放毛片 | 日本人妻伦在线中文字幕 | 国产精品九九九九 | 日韩国产欧美在线观看 | 国产做受高潮漫动 | 亚洲无码精品一区二区三区 | 天天综合av | 老熟妇一区二区三区 | 国产一卡二 | 欧美日韩看片 | 久久国产精品久久久 | 97影视 | 国产一区二区三区三州 | 国产精品无遮挡 | 久久精品人妻av一区二区三区 | 国产精品福利视频 | xxx久久| 久久久精品国产免费爽爽爽 | avtt国产| 久久一区二区视频 | 一区二区 亚洲 | 干日本少妇 | 国产黄色免费在线观看 | 欧美成人h版在线观看 | 九九热在线播放 | 免费观看nba乐趣影院 | 国产精品久久久久毛片软件 | 精品国产露脸精彩对白 | 欧美精品一二三 | 欧美一级在线看 | 午夜免费激情视频 | 97在线观看免费高清 | 五月天伊人网 |