日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Android自定義轉盤菜單效果

瀏覽:44日期:2022-09-23 09:22:42

最近由于公司項目需要,需要開發一款轉盤菜單,費了好大功夫搞出來了,下面分享下

樣圖

Android自定義轉盤菜單效果

具體功能如下:

import android.graphics.Color;import android.os.Bundle;import android.support.v4.app.Fragment;import android.support.v4.app.FragmentPagerAdapter;import android.support.v7.app.AppCompatActivity;import android.widget.Toast;import com.hitomi.smlibrary.OnSpinMenuStateChangeListener;import com.hitomi.smlibrary.TurnTableMenu;import java.util.ArrayList;import java.util.List;public class MainActivity extends AppCompatActivity { private TurnTableMenu turnTableMenu; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); turnTableMenu = (TurnTableMenu) findViewById(R.id.spin_menu); // 設置頁面標題 List<String> hintStrList = new ArrayList<>(); hintStrList.add('熱門信息'); hintStrList.add('實時新聞'); hintStrList.add('我的論壇'); hintStrList.add('我的信息'); hintStrList.add('環游世界'); hintStrList.add('閱讀空間'); hintStrList.add('歡樂空間'); hintStrList.add('系統設置'); turnTableMenu.setHintTextStrList(hintStrList); turnTableMenu.setHintTextColor(Color.parseColor('#FFFFFF')); turnTableMenu.setHintTextSize(14); // 設置頁面適配器 final List<Fragment> fragmentList = new ArrayList<>(); fragmentList.add(Fragment1.newInstance()); fragmentList.add(Fragment2.newInstance()); fragmentList.add(Fragment3.newInstance()); fragmentList.add(Fragment4.newInstance()); fragmentList.add(Fragment5.newInstance()); fragmentList.add(Fragment6.newInstance()); fragmentList.add(Fragment7.newInstance()); fragmentList.add(Fragment8.newInstance()); FragmentPagerAdapter fragmentPagerAdapter = new FragmentPagerAdapter(getSupportFragmentManager()) { @Override public Fragment getItem(int position) {return fragmentList.get(position); } @Override public int getCount() {return fragmentList.size(); } }; turnTableMenu.setFragmentAdapter(fragmentPagerAdapter); // 設置菜單狀態改變時的監聽器 turnTableMenu.setOnSpinMenuStateChangeListener(new OnSpinMenuStateChangeListener() { @Override public void onMenuOpened() {Toast.makeText(MainActivity.this, 'SpinMenu opened', Toast.LENGTH_SHORT).show(); } @Override public void onMenuClosed() {Toast.makeText(MainActivity.this, 'SpinMenu closed', Toast.LENGTH_SHORT).show(); } }); }}

activity_main.xml

<?xml version='1.0' encoding='utf-8'?><com.hitomi.smlibrary.TurnTableMenu xmlns:android='http://schemas.android.com/apk/res/android' xmlns:app='http://schemas.android.com/apk/res-auto' xmlns:tools='http://schemas.android.com/tools' android: android:layout_width='match_parent' android:layout_height='match_parent' app:hint_text_color='#FFFFFF' app:hint_text_size='14sp' app:scale_ratio='0.36' tools:context='com.hitomi.spinmenu.MainActivity'> <FrameLayout android:layout_width='match_parent' android:layout_height='match_parent' android:background='#333a4a'></FrameLayout></com.hitomi.smlibrary.TurnTableMenu>

3.自定義View TurnTableMenu

import android.content.Context;import android.content.res.TypedArray;import android.graphics.Color;import android.os.Build;import android.support.annotation.IdRes;import android.support.v4.view.GestureDetectorCompat;import android.support.v4.view.PagerAdapter;import android.util.AttributeSet;import android.util.Log;import android.view.GestureDetector;import android.view.Gravity;import android.view.MotionEvent;import android.view.ViewConfiguration;import android.view.ViewGroup;import android.widget.FrameLayout;import android.widget.LinearLayout;import android.widget.TextView;import java.util.ArrayList;import java.util.List;import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT;public class TurnTableMenu extends FrameLayout { static final String TAG = 'SpinMenu'; static final String TAG_ITEM_CONTAINER = 'tag_item_container'; static final String TAG_ITEM_PAGER = 'tag_item_pager'; static final String TAG_ITEM_HINT = 'tag_item_hint'; static final int MENU_STATE_CLOSE = -2; static final int MENU_STATE_CLOSED = -1; static final int MENU_STATE_OPEN = 1; static final int MENU_STATE_OPENED = 2; /** * 左右菜單 Item 移動動畫的距離 */ static final float TRAN_SKNEW_VALUE = 160; /** * Hint 相對 頁面的上外邊距 */ static final int HINT_TOP_MARGIN = 15; /** * 可旋轉、轉動布局 */ private TurnTableMenuLayout turnTableMenuLayout; /** * 菜單打開關閉動畫幫助類 */ private TurnTableMenuAnimator turnTableMenuAnimator; /** * 頁面適配器 */ private PagerAdapter pagerAdapter; /** * 手勢識別器 */ private GestureDetectorCompat menuDetector; /** * 菜單狀態改變監聽器 */ private OnSpinMenuStateChangeListener onSpinMenuStateChangeListener; /** * 緩存 Fragment 的集合,供 {@link #pagerAdapter} 回收使用 */ private List pagerObjects; /** * 菜單項集合 */ private List<SMItemLayout> smItemLayoutList; /** * 頁面標題字符集合 */ private List<String> hintStrList; /** * 頁面標題字符尺寸 */ private int hintTextSize = 14; /** * 頁面標題字符顏色 */ private int hintTextColor = Color.parseColor('#666666'); /** * 默認打開菜單時頁面縮小的比率 */ private float scaleRatio = .36f; /** * 控件是否初始化的標記變量 */ private boolean init = true; /** * 是否啟用手勢識別 */ private boolean enableGesture; /** * 當前菜單狀態,默認為打開 */ private int menuState = MENU_STATE_CLOSED; /** * 滑動與觸摸之間的閥值 */ private int touchSlop = 8; private OnSpinSelectedListener onSpinSelectedListener = new OnSpinSelectedListener() { @Override public void onSpinSelected(int position) { log('SpinMenu position:' + position); } }; private OnMenuSelectedListener onMenuSelectedListener = new OnMenuSelectedListener() { @Override public void onMenuSelected(SMItemLayout smItemLayout) { closeMenu(smItemLayout); } }; private GestureDetector.SimpleOnGestureListener menuGestureListener = new GestureDetector.SimpleOnGestureListener() { @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { if (Math.abs(distanceX) < touchSlop && distanceY < -touchSlop * 3) {openMenu(); } return true; } }; public TurnTableMenu(Context context) { this(context, null); } public TurnTableMenu(Context context, AttributeSet attrs) { this(context, attrs, 0); } public TurnTableMenu(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.TurnTableMenu); scaleRatio = typedArray.getFloat(R.styleable.TurnTableMenu_scale_ratio, scaleRatio); hintTextSize = typedArray.getDimensionPixelSize(R.styleable.TurnTableMenu_hint_text_size, hintTextSize); hintTextSize = px2Sp(hintTextColor); hintTextColor = typedArray.getColor(R.styleable.TurnTableMenu_hint_text_color, hintTextColor); typedArray.recycle(); pagerObjects = new ArrayList(); smItemLayoutList = new ArrayList<>(); menuDetector = new GestureDetectorCompat(context, menuGestureListener); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.DONUT) { ViewConfiguration conf = ViewConfiguration.get(getContext()); touchSlop = conf.getScaledTouchSlop(); } } @Override protected void onFinishInflate() { super.onFinishInflate(); @IdRes final int smLayoutId = 0x6F060505; ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(MATCH_PARENT, MATCH_PARENT); turnTableMenuLayout = new TurnTableMenuLayout(getContext()); turnTableMenuLayout.setId(smLayoutId); turnTableMenuLayout.setLayoutParams(layoutParams); turnTableMenuLayout.setOnSpinSelectedListener(onSpinSelectedListener); turnTableMenuLayout.setOnMenuSelectedListener(onMenuSelectedListener); addView(turnTableMenuLayout); } @Override protected void onLayout(boolean changed, int left, int top, int right, int bottom) { super.onLayout(changed, left, top, right, bottom); if (init && smItemLayoutList.size() > 0) { // 根據 scaleRatio 去調整菜單中 item 視圖的整體大小 int pagerWidth = (int) (getMeasuredWidth() * scaleRatio); int pagerHeight = (int) (getMeasuredHeight() * scaleRatio); SMItemLayout.LayoutParams containerLayoutParams = new SMItemLayout.LayoutParams(pagerWidth, pagerHeight); SMItemLayout smItemLayout; FrameLayout frameContainer; TextView tvHint; for (int i = 0; i < smItemLayoutList.size(); i++) {smItemLayout = smItemLayoutList.get(i);frameContainer = (FrameLayout) smItemLayout.findViewWithTag(TAG_ITEM_CONTAINER);frameContainer.setLayoutParams(containerLayoutParams);if (i == 0) { // 初始菜單的時候,默認顯示第一個 Fragment FrameLayout pagerLayout = (FrameLayout) smItemLayout.findViewWithTag(TAG_ITEM_PAGER); // 先移除第一個包含 Fragment 的布局 frameContainer.removeView(pagerLayout); // 創建一個用來占位的 FrameLayout FrameLayout holderLayout = new FrameLayout(getContext()); LinearLayout.LayoutParams pagerLinLayParams = new LinearLayout.LayoutParams(MATCH_PARENT, MATCH_PARENT); holderLayout.setLayoutParams(pagerLinLayParams); // 將占位的 FrameLayout 添加到布局中的 frameContainer 中 frameContainer.addView(holderLayout, 0); // 添加 第一個包含 Fragment 的布局添加到 SpinMenu 中 FrameLayout.LayoutParams pagerFrameParams = new FrameLayout.LayoutParams(MATCH_PARENT, MATCH_PARENT); pagerLayout.setLayoutParams(pagerFrameParams); addView(pagerLayout);}// 顯示標題if (hintStrList != null && !hintStrList.isEmpty() && i < hintStrList.size()) { tvHint = (TextView) smItemLayout.findViewWithTag(TAG_ITEM_HINT); tvHint.setText(hintStrList.get(i)); tvHint.setTextSize(hintTextSize); tvHint.setTextColor(hintTextColor);}// 位于菜單中當前顯示 Fragment 兩邊的 SMItemlayout 左右移動 TRAN_SKNEW_VALUE 個距離if (turnTableMenuLayout.getSelectedPosition() + 1 == i || (turnTableMenuLayout.isCyclic() && turnTableMenuLayout.getMenuItemCount() - i == turnTableMenuLayout.getSelectedPosition() + 1)) { // 右側 ItemMenu smItemLayout.setTranslationX(TRAN_SKNEW_VALUE);} else if (turnTableMenuLayout.getSelectedPosition() - 1 == i || (turnTableMenuLayout.isCyclic() && turnTableMenuLayout.getMenuItemCount() - i == 1)) { // 左側 ItemMenu smItemLayout.setTranslationX(-TRAN_SKNEW_VALUE);} else { smItemLayout.setTranslationX(0);} } turnTableMenuAnimator = new TurnTableMenuAnimator(this, turnTableMenuLayout, onSpinMenuStateChangeListener); init = false; openMenu(); } } @Override public boolean dispatchTouchEvent(MotionEvent ev) { if (enableGesture) menuDetector.onTouchEvent(ev); return super.dispatchTouchEvent(ev); } @Override public boolean onTouchEvent(MotionEvent event) { if (enableGesture) { menuDetector.onTouchEvent(event); return true; } else { return super.onTouchEvent(event); } } /** * 根據手機的分辨率從 px(像素) 的單位轉成為 sp * @param pxValue * @return */ private int px2Sp(float pxValue) { final float fontScale = getContext().getResources().getDisplayMetrics().scaledDensity; return (int) (pxValue / fontScale + 0.5f); } private void log(String log) { Log.d(TAG, log); } public void setFragmentAdapter(PagerAdapter adapter) { if (pagerAdapter != null) { pagerAdapter.startUpdate(turnTableMenuLayout); for (int i = 0; i < adapter.getCount(); i++) {ViewGroup pager = (ViewGroup) turnTableMenuLayout.getChildAt(i).findViewWithTag(TAG_ITEM_PAGER);pagerAdapter.destroyItem(pager, i, pagerObjects.get(i)); } pagerAdapter.finishUpdate(turnTableMenuLayout); } int pagerCount = adapter.getCount(); if (pagerCount > turnTableMenuLayout.getMaxMenuItemCount()) throw new RuntimeException(String.format('Fragment number can’t be more than %d', turnTableMenuLayout.getMaxMenuItemCount())); pagerAdapter = adapter; SMItemLayout.LayoutParams itemLinLayParams = new SMItemLayout.LayoutParams(WRAP_CONTENT, WRAP_CONTENT); LinearLayout.LayoutParams containerLinlayParams = new LinearLayout.LayoutParams(MATCH_PARENT, MATCH_PARENT); FrameLayout.LayoutParams pagerFrameParams = new FrameLayout.LayoutParams(MATCH_PARENT, MATCH_PARENT); LinearLayout.LayoutParams hintLinLayParams = new LinearLayout.LayoutParams(WRAP_CONTENT, WRAP_CONTENT); hintLinLayParams.topMargin = HINT_TOP_MARGIN; pagerAdapter.startUpdate(turnTableMenuLayout); for (int i = 0; i < pagerCount; i++) { // 創建菜單父容器布局 SMItemLayout smItemLayout = new SMItemLayout(getContext()); smItemLayout.setId(i + 1); smItemLayout.setGravity(Gravity.CENTER); smItemLayout.setLayoutParams(itemLinLayParams); // 創建包裹FrameLayout FrameLayout frameContainer = new FrameLayout(getContext()); frameContainer.setId(pagerCount + i + 1); frameContainer.setTag(TAG_ITEM_CONTAINER); frameContainer.setLayoutParams(containerLinlayParams); // 創建 Fragment 容器 FrameLayout framePager = new FrameLayout(getContext()); framePager.setId(pagerCount * 2 + i + 1); framePager.setTag(TAG_ITEM_PAGER); framePager.setLayoutParams(pagerFrameParams); Object object = pagerAdapter.instantiateItem(framePager, i); // 創建菜單標題 TextView TextView tvHint = new TextView(getContext()); tvHint.setId(pagerCount * 3 + i + 1); tvHint.setTag(TAG_ITEM_HINT); tvHint.setLayoutParams(hintLinLayParams); frameContainer.addView(framePager); smItemLayout.addView(frameContainer); smItemLayout.addView(tvHint); turnTableMenuLayout.addView(smItemLayout); pagerObjects.add(object); smItemLayoutList.add(smItemLayout); } pagerAdapter.finishUpdate(turnTableMenuLayout); } public void openMenu() { if (menuState == MENU_STATE_CLOSED) { turnTableMenuAnimator.openMenuAnimator(); } } public void closeMenu(SMItemLayout chooseItemLayout) { if (menuState == MENU_STATE_OPENED) { turnTableMenuAnimator.closeMenuAnimator(chooseItemLayout); } } public int getMenuState() { return menuState; } public void updateMenuState(int state) { menuState = state; } public void setEnableGesture(boolean enable) { enableGesture = enable; } public void setMenuItemScaleValue(float scaleValue) { scaleRatio = scaleValue; } public void setHintTextSize(int textSize) { hintTextSize = textSize; } public void setHintTextColor(int textColor) { hintTextColor = textColor; } public void setHintTextStrList(List<String> hintTextList) { hintStrList = hintTextList; } public void setOnSpinMenuStateChangeListener(OnSpinMenuStateChangeListener listener) { onSpinMenuStateChangeListener = listener; } public float getScaleRatio() { return scaleRatio; }}

Github:SlidMenu

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Android
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日韩二区三区在线观看| 日韩av中文字幕一区二区三区| 久久影院一区| 日本一区二区免费高清| 国产日韩欧美中文在线| 亚洲另类av| 久久av在线| 久热精品在线| 亚洲久草在线| 日韩和欧美一区二区| 亚洲精品一级| 中文一区二区| 亚洲一级淫片| 日韩av中文字幕一区| 欧美在线91| 麻豆精品视频在线观看免费| 天堂久久av| 国产欧美日韩一区二区三区四区| 欧美一区免费| 麻豆精品99| 中文在线资源| 欧美成人亚洲| 一区二区精彩视频| 日本成人中文字幕在线视频| 亚洲人成网站在线在线观看| 久久久久国产精品一区二区| 美女在线视频一区| 久久精品一本| 97精品97| 久久福利精品| 欧美韩一区二区| 色在线中文字幕| 久久香蕉网站| 日韩成人在线看| 亚洲综合小说| 国产欧美日韩视频在线| 你懂的国产精品永久在线| 六月婷婷一区| 国产欧美日韩| 久久成人av| 米奇777超碰欧美日韩亚洲| 精品国产亚洲一区二区三区| 成人一二三区| 亚洲人成网站在线在线观看| 国产一区日韩| 中文字幕一区二区三区四区久久| 精品三级在线| 91亚洲精品在看在线观看高清| 美女国产一区二区三区| 一区在线免费观看| 成人在线超碰| 亚洲一区二区成人| 国产精品久久777777毛茸茸| 久久狠狠久久| 人在线成免费视频| 日韩中文首页| 精品久久网站| 日韩和欧美的一区| 久热精品在线| 欧美一级精品| 精品一区二区三区视频在线播放| 少妇高潮一区二区三区99| 91精品电影| 欧美日韩黑人| 久久国产中文字幕| 久久久精品五月天| 蜜桃精品在线| 日韩av在线中文字幕| 日韩国产欧美一区二区三区| 欧美日韩精品免费观看视完整| 久久成人av| 国产情侣一区| 国产三级精品三级在线观看国产| 日韩高清成人在线| 在线日韩成人| 日本精品国产| 国产精品v一区二区三区| 美女国产一区二区三区| 日韩1区2区3区| 欧美亚洲人成在线| 国产精品久久乐| 国产日韩欧美一区| а√天堂8资源在线| 久久久久.com| 一区二区国产精品| 日韩精品视频在线看| 日韩中文字幕麻豆| 亚洲狼人精品一区二区三区| 久久精品三级| 热久久久久久| 日产午夜精品一线二线三线| 亚洲v在线看| 中文在线日韩| 动漫av一区| 欧美日韩一区二区综合| 视频在线观看国产精品| 久久精品97| 日韩和的一区二在线| 老牛影视一区二区三区| 国产精品一区二区三区av麻 | 91在线成人| 日韩国产激情| 亚洲精品黄色| 免费观看亚洲| 91在线成人| 国产午夜久久| 狠狠久久伊人中文字幕| 国产精品女主播一区二区三区| 日韩精品久久久久久久软件91| 在线看片福利| 91成人精品在线| 午夜久久黄色| 欧美成人精品一级| 99久久亚洲精品| 日本亚洲最大的色成网站www | 99成人在线视频| 久久国产精品免费一区二区三区| 日韩天堂在线| 国产精品久久久久久久久久齐齐| 亚洲精品123区| 成人欧美一区二区三区的电影| 激情久久久久久久| 国产精品一国产精品| 国模大尺度视频一区二区| 亚洲深深色噜噜狠狠爱网站| 蜜桃精品在线| 国产一区二区三区黄网站| 亚洲精品一区二区在线播放∴| 久久视频一区| 亚洲一二三区视频| 黑丝美女一区二区| 日韩欧美综合| 国产精品大片| 91av一区| 欧美另类中文字幕 | 精品国产日韩欧美精品国产欧美日韩一区二区三区 | 亚洲天堂日韩在线| 激情婷婷亚洲| 天堂а√在线最新版中文在线| 国产精一区二区| 国产精品资源| 国产精品调教| 国产精久久久| 麻豆国产精品| 精品日产乱码久久久久久仙踪林| 日韩中文字幕视频网| 视频一区在线视频| 免费看精品久久片| 亚洲精选成人| 天堂va在线高清一区| 91精品国产自产在线丝袜啪| 清纯唯美亚洲综合一区| 久久黄色影视| 高清精品久久| 999国产精品永久免费视频app| 九九色在线视频| 亚洲主播在线| 国产欧美亚洲精品a| 精品中国亚洲| 日韩三区免费| 欧美日韩国产高清| 婷婷六月综合| 日韩高清不卡一区二区| 中文字幕在线看片| 五月天激情综合网| 亚洲精品第一| 成人国产精品一区二区网站| 国产在线|日韩| 蜜桃av一区二区三区电影| 国产精品网在线观看| 日韩精品欧美激情一区二区| 一二三区精品| 日韩欧美1区| 日本中文字幕一区二区视频| 精品中文在线| 午夜久久免费观看| 美腿丝袜亚洲一区| 久久高清国产| 色爱综合网欧美| 亚洲91网站| 婷婷色综合网| 粉嫩av一区二区三区四区五区 | 天堂网av成人| 国产欧美高清| 久久亚洲图片| 精品一区毛片| 国产欧美综合一区二区三区| 婷婷六月综合| 中文字幕高清在线播放| 欧美视频久久| 日日夜夜免费精品| 在线成人直播| 亚洲天堂资源| 久久香蕉精品香蕉| 日韩高清不卡一区| 深夜日韩欧美| 亚洲三级毛片| 一区三区视频| 日韩国产在线一| 欧美日韩一二三四|