热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

Android自定义转盘菜单效果

这篇文章主要为大家详细介绍了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 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 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

<&#63;xml version="1.0" encoding="utf-8"&#63;>


  

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 smItemLayoutList;

  /**
   * 页面标题字符集合
   */
  private List 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) ();
    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  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  hintTextList) {
    hintStrList = hintTextList;
  }

  public void setOnSpinMenuStateChangeListener(OnSpinMenuStateChangeListener listener) {
    OnSpinMenuStateChangeListener= listener;
  }

  public float getScaleRatio() {
    return scaleRatio;
  }
}

Github:SlidMenu

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • 本文介绍了使用kotlin实现动画效果的方法,包括上下移动、放大缩小、旋转等功能。通过代码示例演示了如何使用ObjectAnimator和AnimatorSet来实现动画效果,并提供了实现抖动效果的代码。同时还介绍了如何使用translationY和translationX来实现上下和左右移动的效果。最后还提供了一个anim_small.xml文件的代码示例,可以用来实现放大缩小的效果。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • 安卓select模态框样式改变_微软Office风格的多端(Web、安卓、iOS)组件库——Fabric UI...
    介绍FabricUI是微软开源的一套Office风格的多端组件库,共有三套针对性的组件,分别适用于web、android以及iOS,Fab ... [详细]
  • Google Play推出全新的应用内评价API,帮助开发者获取更多优质用户反馈。用户每天在Google Play上发表数百万条评论,这有助于开发者了解用户喜好和改进需求。开发者可以选择在适当的时间请求用户撰写评论,以获得全面而有用的反馈。全新应用内评价功能让用户无需返回应用详情页面即可发表评论,提升用户体验。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • Android系统移植与调试之如何修改Android设备状态条上音量加减键在横竖屏切换的时候的显示于隐藏
    本文介绍了如何修改Android设备状态条上音量加减键在横竖屏切换时的显示与隐藏。通过修改系统文件system_bar.xml实现了该功能,并分享了解决思路和经验。 ... [详细]
  • 标题: ... [详细]
  • Android开发实现的计时器功能示例
    本文分享了Android开发实现的计时器功能示例,包括效果图、布局和按钮的使用。通过使用Chronometer控件,可以实现计时器功能。该示例适用于Android平台,供开发者参考。 ... [详细]
  • 本文是关于自学Android的笔记,包括查看类的源码的方法,活动注册的必要性以及布局练习的重要性。通过学习本文,读者可以了解到在自学Android过程中的一些关键点和注意事项。 ... [详细]
author-avatar
mobiledu2502875803
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有