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

首頁 > 系統 > Android > 正文

Android實現弧形菜單效果

2019-10-23 18:32:57
字體:
來源:轉載
供稿:網友

前言:公司需求,自己寫的一個弧形菜單

效果:

android,弧形菜單,圓弧菜單,弧形Menu

開發環境:AndroidStudio2.2.1+gradle-2.14.1

涉及知識:1.自定義控件,2.事件分發等

部分代碼:

public class HomePageMenuLayout extends ViewGroup { private Context context; // 菜單項的文本 private String[] mItemTexts = null; private int StatusHeight;//狀態欄高度 public HomePageMenuLayout(Context context, AttributeSet attrs) { super(context, attrs); this.context = context; StatusHeight = ScreenUtils.getStatusHeight(context); } /** * 設置布局的寬高,并策略menu item寬高 */ int resWidth = 0; int resHeight = 0; int mRadius = 0; @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { //布局寬高尺寸設置為屏幕尺寸 //設置該布局的大小 setMeasuredDimension(widthMeasureSpec, heightMeasureSpec); /** * 根據傳入的參數,分別獲取測量模式和測量值 */ int width = MeasureSpec.getSize(widthMeasureSpec); resHeight = MeasureSpec.getSize(heightMeasureSpec); resWidth = MeasureSpec.getSize(widthMeasureSpec); // 獲得半徑 mRadius = (int) (resHeight / 2 - 2 * StatusHeight); //設置item尺寸 int childSize = (int) (mRadius * 1 / 2); // menu item測量模式--精確模式 int childMode = MeasureSpec.EXACTLY; for (int i = 0; i < getChildCount(); i++) { final View child = getChildAt(i); if (child.getVisibility() == GONE) { continue; } // 計算menu item的尺寸;以及和設置好的模式,去對item進行測量 int makeMeasureSpec = -1; makeMeasureSpec = MeasureSpec.makeMeasureSpec(childSize, childMode); child.measure(makeMeasureSpec, makeMeasureSpec); } } /** * item布局的角度 */ private int[] widthall = null; /** * 設置Item的位置:第一個參數1:該參數指出當前ViewGroup的尺寸或者位置是否發生了改變 * 2.當期繪圖光標橫坐標位置 * 3.當前繪圖光標縱坐標位置 */ @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { int left, top; int cWidth = (int) (mRadius * 1 / 2); final int childCount = getChildCount(); // 計算,中心點到menu item中心的距離 float tmp = mRadius - cWidth / 2; // 遍歷去設置menuitem的位置 for (int i = 0; i < childCount; i++) { final View child = getChildAt(i); if (child.getVisibility() == GONE) { continue; } left = (int) (mRadius * Math.cos(Math.toRadians(widthall[i]))) - 65; top = (int) (mRadius - (resHeight / 2 - 2 * StatusHeight) * Math.sin(Math.toRadians(widthall[i])) - StatusHeight); child.layout(left, top, left + cWidth, top + cWidth); } } public interface OnMenuItemClickListener { void itemClick(View view, int pos); } public void setOnMenuItemClickListener( OnMenuItemClickListener mOnMenuItemClickListener) { this.mOnMenuItemClickListener = mOnMenuItemClickListener; } // 菜單的個數 private int mMenuItemCount; /** * 設置菜單條目的圖標和文本 */ public void setMenuItemIconsAndTexts(String[] mItemTexts) { this.mItemTexts = mItemTexts; this.mMenuItemCount = mItemTexts.length; resultAngle(); addMenuItems(); } private void resultAngle() { switch (this.mMenuItemCount) { case 3: widthall = Constants.ITEM3; break; case 4: widthall = Constants.ITEM4; break; case 5: widthall = Constants.ITEM5; break; case 6: widthall = Constants.ITEM6; break; case 7: widthall = Constants.ITEM7; break; case 8: widthall = Constants.ITEM8; break; case 9: widthall = Constants.ITEM9; break; case 10: widthall = Constants.ITEM10; break; default: break; } } /** * 設置菜單條目的圖標和文本 */ public void setMenuItemIconsAndTexts() { addMenuItems(); } private int mMenuItemLayoutId = R.layout.homepage_item_layout; /** * MenuItem的點擊事件接口 */ private OnMenuItemClickListener mOnMenuItemClickListener; private float yPosition = 0; /** * 添加菜單項 */ private void addMenuItems() { LayoutInflater mInflater = LayoutInflater.from(getContext()); /** * 根據用戶設置的參數,初始化view */ for (int i = 0; i < mMenuItemCount; i++) { final int j = i; View view = mInflater.inflate(mMenuItemLayoutId, this, false); final ImageView iv = (ImageView) view  .findViewById(R.id.homepage_pager1_item_img); final TextView tv = (TextView) view  .findViewById(R.id.homepage_pager1_item_tv); if (iv != null) { iv.setImageResource(R.mipmap.menu_ture); } if (tv != null) { tv.setText(mItemTexts[i]); } view.findViewById(R.id.homepage_item_layout).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) {} }); view.findViewById(R.id.homepage_item_layout).setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) {  if (event.getAction() == MotionEvent.ACTION_DOWN) {  yPosition = event.getY();//獲取按下的位置  iv.setImageResource(R.mipmap.menu);  } else if (event.getAction() == MotionEvent.ACTION_UP) {  iv.setImageResource(R.mipmap.menu_ture);  float displacement = Math.abs(yPosition - event.getY());  //精確按下的位置做出響應  if (mOnMenuItemClickListener != null&&displacement<25) {  mOnMenuItemClickListener.itemClick(v,j);  }  } else if (event.getAction() == MotionEvent.ACTION_CANCEL || event.getAction() == MotionEvent.ACTION_POINTER_UP) {  iv.setImageResource(R.mipmap.menu_ture);  }  return true; } }); addView(view); } }}

源碼下載

以上就是本文的全部內容,希望本文的內容對大家的學習或者工作能帶來一定的幫助,同時也希望多多支持VEVB武林網!


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 虹口区| 长春市| 英德市| 德格县| 万源市| 安宁市| 临洮县| 沅陵县| 海门市| 大同县| 唐河县| 大石桥市| 万源市| 筠连县| 河间市| 沂水县| 淮阳县| 壤塘县| 绵阳市| 余姚市| 西城区| 如皋市| 望奎县| 尚义县| 东辽县| 腾冲县| 维西| 通榆县| 甘孜县| 宜丰县| 玉门市| 景宁| 定兴县| 莱阳市| 高碑店市| 图们市| 建宁县| 拜城县| 富顺县| 宁城县| 高平市|