最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android實(shí)現(xiàn)弧形菜單效果

 更新時(shí)間:2017年03月30日 14:49:54   作者:曦笑大海  
本文主要介紹了Android實(shí)現(xiàn)弧形菜單效果的示例代碼。具有很好的參考價(jià)值,下面跟著小編一起來看下吧

前言:公司需求,自己寫的一個(gè)弧形菜單!

效果:

開發(fā)環(huán)境:AndroidStudio2.2.1+gradle-2.14.1

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

部分代碼:

public class HomePageMenuLayout extends ViewGroup {
 private Context context;
 // 菜單項(xiàng)的文本
 private String[] mItemTexts = null;
 private int StatusHeight;//狀態(tài)欄高度
 public HomePageMenuLayout(Context context, AttributeSet attrs) {
 super(context, attrs);
 this.context = context;
 StatusHeight = ScreenUtils.getStatusHeight(context);
 }
 /**
 * 設(shè)置布局的寬高,并策略menu item寬高
 */
 int resWidth = 0;
 int resHeight = 0;
 int mRadius = 0;
 @Override
 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
 //布局寬高尺寸設(shè)置為屏幕尺寸
 //設(shè)置該布局的大小
 setMeasuredDimension(widthMeasureSpec, heightMeasureSpec);
 /**
 * 根據(jù)傳入的參數(shù),分別獲取測量模式和測量值
 */
 int width = MeasureSpec.getSize(widthMeasureSpec);
 resHeight = MeasureSpec.getSize(heightMeasureSpec);
 resWidth = MeasureSpec.getSize(widthMeasureSpec);
 // 獲得半徑
 mRadius = (int) (resHeight / 2 - 2 * StatusHeight);
 //設(shè)置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;
 }
 // 計(jì)算menu item的尺寸;以及和設(shè)置好的模式,去對item進(jìn)行測量
 int makeMeasureSpec = -1;
 makeMeasureSpec = MeasureSpec.makeMeasureSpec(childSize, childMode);
 child.measure(makeMeasureSpec, makeMeasureSpec);
 }
 }
 /**
 * item布局的角度
 */
 private int[] widthall = null;
 /**
 * 設(shè)置Item的位置:第一個(gè)參數(shù)1:該參數(shù)指出當(dāng)前ViewGroup的尺寸或者位置是否發(fā)生了改變
 * 2.當(dāng)期繪圖光標(biāo)橫坐標(biāo)位置
 * 3.當(dāng)前繪圖光標(biāo)縱坐標(biāo)位置
 */
 @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();
 // 計(jì)算,中心點(diǎn)到menu item中心的距離
 float tmp = mRadius - cWidth / 2;
 // 遍歷去設(shè)置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;
 }
 // 菜單的個(gè)數(shù)
 private int mMenuItemCount;
 /**
 * 設(shè)置菜單條目的圖標(biāo)和文本
 */
 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;
 }
 }
 /**
 * 設(shè)置菜單條目的圖標(biāo)和文本
 */
 public void setMenuItemIconsAndTexts() {
 addMenuItems();
 }
 private int mMenuItemLayoutId = R.layout.homepage_item_layout;
 /**
 * MenuItem的點(diǎn)擊事件接口
 */
 private OnMenuItemClickListener mOnMenuItemClickListener;
 private float yPosition = 0;
 /**
 * 添加菜單項(xiàng)
 */
 private void addMenuItems() {
 LayoutInflater mInflater = LayoutInflater.from(getContext());
 /**
 * 根據(jù)用戶設(shè)置的參數(shù),初始化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());
  //精確按下的位置做出響應(yīng)
  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);
 }
 }
}

源碼下載

以上就是本文的全部內(nèi)容,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,同時(shí)也希望多多支持腳本之家!

相關(guān)文章

  • Android應(yīng)用退出登錄的實(shí)現(xiàn)方法

    Android應(yīng)用退出登錄的實(shí)現(xiàn)方法

    每一個(gè)app都會有一個(gè)”退出登陸”的功能,當(dāng)點(diǎn)擊退出之后需要將所有的Activity都finish掉,開始是想將棧中的所有Activity清除掉,但是沒有找到方法,后來用廣播實(shí)現(xiàn)了。下面小編給大家分享android應(yīng)用退出登錄的實(shí)現(xiàn)方法,需要的朋友參考下
    2017-04-04
  • Android加載Gif動畫實(shí)現(xiàn)代碼

    Android加載Gif動畫實(shí)現(xiàn)代碼

    這篇文章主要為大家詳細(xì)介紹了Android加載Gif動畫實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • Android中Bitmap用法實(shí)例分析

    Android中Bitmap用法實(shí)例分析

    這篇文章主要介紹了Android中Bitmap用法,結(jié)合實(shí)例形式分析了Android操作圖片的載入、屬性設(shè)置、旋轉(zhuǎn)等相關(guān)技巧,需要的朋友可以參考下
    2016-02-02
  • android使用多線程更新ui示例分享

    android使用多線程更新ui示例分享

    在Android平臺中多線程應(yīng)用很廣泛,在UI更新、游戲開發(fā)和耗時(shí)處理(網(wǎng)絡(luò)通信等)等方面都需要多線程,下面是一個(gè)在線程中更新UI的代碼
    2014-01-01
  • Android將String保存為SD卡中TXT文件的方法

    Android將String保存為SD卡中TXT文件的方法

    今天小編就為大家分享一篇Android將String保存為SD卡中TXT文件的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • android獲得當(dāng)前view在屏幕中坐標(biāo)的方法

    android獲得當(dāng)前view在屏幕中坐標(biāo)的方法

    這篇文章主要介紹了android獲得當(dāng)前view在屏幕中坐標(biāo)的方法,涉及Android針對view坐標(biāo)相關(guān)屬性的使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-10-10
  • Android 取消藍(lán)牙配對框?qū)崿F(xiàn)自動配對功能

    Android 取消藍(lán)牙配對框?qū)崿F(xiàn)自動配對功能

    這篇文章主要介紹了Android 取消藍(lán)牙配對框?qū)崿F(xiàn)自動配對功能,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2017-02-02
  • Android實(shí)現(xiàn)左側(cè)滑動菜單

    Android實(shí)現(xiàn)左側(cè)滑動菜單

    這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)左側(cè)滑動菜單,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • Kotlin入門學(xué)習(xí)教程之可見性修飾符

    Kotlin入門學(xué)習(xí)教程之可見性修飾符

    在Kotlin中,不管是類、接口、構(gòu)造函數(shù)、函數(shù)、屬性及其設(shè)置器都具有可見性修飾符,下面這篇文章主要給大家介紹了關(guān)于Kotlin入門學(xué)習(xí)教程之可見性修飾符的相關(guān)資料,需要的朋友可以參考下
    2021-11-11
  • VS Code開發(fā)React-Native及Flutter 開啟無線局域網(wǎng)安卓真機(jī)調(diào)試問題

    VS Code開發(fā)React-Native及Flutter 開啟無線局域網(wǎng)安卓真機(jī)調(diào)試問題

    這篇文章主要介紹了VS Code開發(fā)React-Native,F(xiàn)lutter 開啟無線局域網(wǎng)安卓真機(jī)調(diào)試,需要的朋友可以參考下
    2020-04-04

最新評論

太谷县| 伊金霍洛旗| 马龙县| 武宁县| 揭东县| 抚远县| 洛浦县| 鸡泽县| 澎湖县| 白水县| 黄石市| 乐安县| 娄底市| 筠连县| 合江县| 钦州市| 乡城县| 安阳县| 将乐县| 大渡口区| 边坝县| 平阴县| 明水县| 那曲县| 固阳县| 靖远县| 海兴县| 山东| 平果县| 阿鲁科尔沁旗| 滁州市| 尉犁县| 鸡西市| 连州市| 平凉市| 上蔡县| 吴堡县| 门头沟区| 马公市| 乌鲁木齐市| 东乌|