转盘菜单

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 a 阅读详情

效果图


代理传递消息

//
//  CXYCircleMenuView.h
//  MagicLamp
//
//  Created by  on 2017/10/20.
//  Copyright © 2017年 YF Ding. All rights reserved.
//

#import <UIKit/UIKit.h>
@protocol CXYCircleMenuViewDeleagte<NSObject>
-(void)bleBtnClick;
-(void)phoneMusicBtnClick;
-(void)deviceMusicBtnClick;
-(void)lightBtnClick;
-(void)fmBtnClick;
-(void)outVoiceBtnClick;
-(void)voiceKardBtnClick;

@end
@interface CXYCircleMenuView : UIView
@property (nonatomic,assign)id<CXYCircleMenuViewDeleagte>delegate;
@end

实现

//
//  CXYCircleMenuView.m
//  MagicLamp
//
//  Created by  on 2017/10/20.
//  Copyright © 2017年 YF Ding. All rights reserved.
//

#import "CXYCircleMenuView.h"
#define DIST(pointA,pointB) sqrtf((pointA.x-pointB.x)*(pointA.x-pointB.x)+(pointA.y-pointB.y)*(pointA.y-pointB.y))
@interface CXYCircleMenuView()
@property (nonatomic, strong) UIView *content;
@property (nonatomic, assign) CGPoint startPoint;
@property (nonatomic, strong) NSMutableArray <UIView *>*views;
@end
@implementation CXYCircleMenuView
-(NSMutableArray *)views{
    if (!_views) {
        _views = [[NSMutableArray alloc] initWithCapacity:0];
    }
    return _views;
}
- (instancetype)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        [self setUpView];
    }
    return self;
}
-(void)setUpView{
    
    NSArray <NSString *> *imageNameArray = @[
                                             @"music",@"itunes-blue",@"light_bulb",@"radio",
                                              @"volume",@"memorycard",];
    NSArray <NSString *> *titleArraay = @[@"手机音乐",@"设备音乐",@"灯光模式",@"收音模式",@"外部声源",@"声卡模式"];
    UIView *contentView = [[UIView alloc] initWithFrame:CGRectMake(0, self.height/2-self.width/2, self.width, self.width)];
    self.content = contentView;
    [self addSubview:contentView];
    UIButton *centerImageView =[UIButton buttonWithType:UIButtonTypeCustom];
    centerImageView.frame = CGRectMake(self.centerX- KSCREEN_WIDTH/6, self.centerY-KSCREEN_WIDTH/6, KSCREEN_WIDTH/3, KSCREEN_WIDTH/3);
    
    centerImageView.backgroundColor = [UIColor clearColor];
    [centerImageView setImage:[UIImage imageNamed:@"bluetooth"] forState:UIControlStateNormal];
    [centerImageView addTarget:self action:@selector(tabberBtnClick:) forControlEvents:UIControlEventTouchUpInside];
    centerImageView.tag = 7;
    [self addSubview:centerImageView];
    [self setCircleMenuViewWithIconArray:imageNameArray WithTitle:titleArraay];
    
    
}
-(void)setCircleMenuViewWithIconArray:(NSArray *)icons WithTitle:(NSArray *)titles{
    for (int i = 0; i<icons.count; i++) {
        CGFloat x = KSCREEN_WIDTH/2*sin(2*M_PI/icons.count*i);
        CGFloat y = KSCREEN_WIDTH/2*cos(2*M_PI/icons.count*i);
        UIView *menuView = [[UIView alloc] initWithFrame:CGRectMake(KSCREEN_WIDTH/2 + 3*x/4 - KSCREEN_WIDTH/8, KSCREEN_WIDTH/2 + 3*y/4 - KSCREEN_WIDTH/8, KSCREEN_WIDTH/4, KSCREEN_WIDTH/4)];
        menuView.backgroundColor = [UIColor clearColor];
        [self.views addObject:menuView];
        UIButton *tabbarBtn = [UIButton buttonWithType:UIButtonTypeCustom];
        [tabbarBtn setImage:[UIImage imageNamed:icons[i]] forState:UIControlStateNormal];
        tabbarBtn.frame = CGRectMake(menuView.width/8, 0, 3*menuView.width/4, 3*menuView.width/4);
        tabbarBtn.tag = i+1;
        [tabbarBtn addTarget:self action:@selector(tabberBtnClick:) forControlEvents:UIControlEventTouchUpInside];
        [menuView addSubview:tabbarBtn];
        UILabel *labe= [[UILabel alloc] initWithFrame:CGRectMake(0, CGRectGetMaxY(tabbarBtn.frame), menuView.width, menuView.width/4)];
        labe.textAlignment = NSTextAlignmentCenter;
        labe.text = titles[i];
        [menuView addSubview:labe];
        [self.content addSubview:menuView];
    }
}
- (BOOL)touchPointInsideCircle:(CGPoint)center radius:(CGFloat)radius targetPoint:(CGPoint)point {
    CGFloat dist = DIST(point, center);
    NSLog(@"dist == %f, radius == %f",dist,radius);
    return (dist <= radius);
}
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    self.startPoint = [[touches anyObject] locationInView:self];
}
-(void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    CGPoint orige = CGPointMake(KSCREEN_WIDTH/2, KSCREEN_HEIGHT/2);
    CGPoint currentPoint = [[touches anyObject] locationInView:self];
    if ([self touchPointInsideCircle:orige radius:KSCREEN_WIDTH/2 targetPoint:currentPoint]) {
        CGFloat startAngle = atan2(self.startPoint.y - orige.y,self.startPoint.x-orige.x);
        CGFloat currentAngle = atan2(currentPoint.y - orige.y,currentPoint.x-orige.x);
        CGFloat circleAngle = currentAngle-startAngle;
        self.content.transform = CGAffineTransformRotate(self.content.transform,circleAngle);
        
        for (int i = 0; i<self.views.count; i++) {
            self.views[i].transform = CGAffineTransformRotate(self.views[i].transform,-circleAngle);
        }
        self.startPoint = currentPoint;
    }
}
-(void)tabberBtnClick:(UIButton *)btn{
    NSLog(@"%ld",btn.tag);
    switch (btn.tag) {
        case 1:
            if ([self.delegate respondsToSelector:@selector(phoneMusicBtnClick) ]) {
                [self.delegate phoneMusicBtnClick];
            }
            break;
        case 2:
            
            if ([self.delegate respondsToSelector:@selector(deviceMusicBtnClick) ]) {
                [self.delegate deviceMusicBtnClick];
            }
            break;
        case 3:
            
            if ([self.delegate respondsToSelector:@selector(lightBtnClick) ]) {
                [self.delegate lightBtnClick];
            }
            break;
        case 4:
            
            if ([self.delegate respondsToSelector:@selector(fmBtnClick) ]) {
                [self.delegate fmBtnClick];
            }
            break;
        case 5:
            
            if ([self.delegate respondsToSelector:@selector(outVoiceBtnClick) ]) {
                [self.delegate outVoiceBtnClick];
            }
            break;
        case 6:
            
            if ([self.delegate respondsToSelector:@selector(voiceKardBtnClick) ]) {
                [self.delegate voiceKardBtnClick];
            }
            break;
        case 7:
            
            if ([self.delegate respondsToSelector:@selector(bleBtnClick) ]) {
                [self.delegate bleBtnClick];
            }
            break;
            
        default:
            break;
    }
    
}
@end


Android 转盘式自定义菜单 本文将介绍如何在Android应用中实现一个自定义的转盘菜单,并提供相应的源代码。接下来,在Activity或Fragment中获取这个菜单容器,并创建一个自定义的ViewGroup来实现转盘菜单的绘制和交互逻辑。通过本文的介绍,你可以学习到如何在Android应用中实现转盘式自定义菜单,并了解到了相关的源代码。至此,我们已经完成了转盘菜单的基本实现,接下来可以根据具体需求对菜单项进行自定义,例如设置菜单项的图标、点击事件等。方法来实现菜单项的布局,使用极坐标计算每个菜单项在转盘上的位置。 阅读详情

相关推荐

创意转盘菜单设计与实现

简介:转盘菜单是一种创新的交互式设计,以旋转选择的方式为用户提供直观的菜单选项。本项目通过编程技术实现了转盘菜单,旨在通过动画效果提升用户体验。涉及中心点、选项布局、动画效果、交互反馈和响应式设计等关键组成部分,技术栈可能包括HTML、CSS、JavaScript和可能的框架或库。开发者可以通过学习实现原理并定制扩展,同时注意优化性能和用户体验。

weixin_42600407的博客 1072

CircleMenu Android圆形菜单类似抽奖转盘的实现

如题,一个圆形菜单 / 抽奖转盘的改版

(:3|❀)我要睡觉了,请帮我关一下灯,谢谢 1619

三种炫酷转盘菜单实现方案详解与实战

创建自定义控件的第一步是定义一个新的UIControl子类,例如命名为。此类不仅负责绘制界面元素,还需承担事件监听、角度计算和状态通知等职责。相较于直接使用手势识别器(如),继承UIControl的优势在于能够无缝集成 Target-Action 模式,并支持方法绑定回调,极大提升了组件的复用性和扩展性。上述代码展示了基本的初始化结构。其中方法用于设置触摸行为参数。表示仅处理单一触点,避免多指干扰;确保当前控件在接收触摸时阻止其他视图同时响应,防止事件冲突。

weixin_33068055的博客 887

多功能转盘菜单:ETurntableMenuView

写个博客也不知道怎么开头,写了四五篇了感觉写了好多,看了下字数统计我去,才1000多字我怎么感觉写了上万字呢,好吧,还有几千在脑子里没写出来。开始下文。 1. 需求 之前公司有个需求需要实现一个椭圆形大布局,实现旋转和停止时固定角度,布局的每个Item需要有个大小差,带点点视觉效果,如图。这个比较适用于车间,TV,横屏布局的机器上,其他布局的调下参数也是一样的。 img1.png 2.怎么...

weixin_34240520的博客 254

iOS转盘菜单设计与仿建行客户端实践

实现转盘菜单大致可以分为以下步骤:1.界面设计:根据需求设计转盘菜单的UI界面,包括确定转盘的大小、颜色、文字和图标等。2.数据模型:定义一个数据模型来存储转盘的各个选项以及它们的位置。3.交互逻辑:实现触摸事件的监听和处理,根据用户的操作计算动画参数。4.动画实现:编写代码来模拟转盘旋转和停止时的动画效果。5.选中反馈:当用户松开手指时,转盘停止并显示选中的项,提供用户反馈。通过这些步骤,可以创建一个在iOS应用中流畅运行的转盘菜单。

weixin_32661831的博客 507

双层转盘旋转选择菜单设计与实现

双层转盘菜单是一种结合传统菜单结构与旋转交互方式的创新UI设计模式。它通过内外两层菜单结构实现快速层级切换与选项选择,尤其适用于屏幕空间有限或操作需快速响应的设备,如智能手表、移动游戏、交互大屏等。该设计的核心在于提升操作效率与交互体验,通过旋转操作替代传统的点击层级展开,减少用户操作路径,同时增强界面的沉浸感与趣味性。随着触控、手势识别等技术的发展,双层转盘菜单在现代UI中逐渐成为一种高效且富有表现力的交互形式。本章将为后续技术实现与优化打下理论基础。

weixin_33363025的博客 526

WPF自定义控件(教程含源码)-圆盘菜单

圆盘按钮

lhyriver的博客 2257

可旋转的轮盘菜单选择器

允许可被放置在一个可旋转的轮。它的行为像一个圆形的ListView项目旋转而不是垂直滚动。它不受轮子上的物品数量的限制,因为它在轮子转动时会经过每个适配器位置。它可以在任何角度和任何位置旋转。

html轮盘菜单栏

本菜单栏是一个动画的打开效果

dearlwy521的博客 802

三种不同效果的转盘菜单

三种不同效果的转盘菜单

抽空做的转盘菜单

简单的做了一个转动的动画,把原先单调的选择方式

iOS开发之转盘菜单—Swift

前言 使用Swift实现的转盘菜单,主要用到UIBezierPath、CALayer遮罩绘制扇形UIView,CATransform3DMakeRotation实现旋转动画。代码设计使用默认configureCallback回调方便创建和设置基本属性,参考UITableView代理和数据源模式,支持AutoLayout和Frame。 效果图 1.遮罩绘制扇形View func setMaskLayer(_ startAngle: CGFloat, endAngle: CGFloat) { let

iOSxiaodaidai的博客 3263

微信小程序旋转转盘菜单

炫丽个性化旋转菜单,让小程序高端大气上档次,转盘试菜单,亲测无误!欢迎大家相互学习

android椭圆转盘菜单,Android CircleMenu:旋转转盘选择Menu

Android CircleMenu:旋转转盘选择MenuAndroid CircleMenu是一个可以自由旋转类似转盘样式的选择Menu。其运行效果如动态图所示: 这在中国建设银行官方的APP中有用到该技术,下图这是中国建设银行官方APP的首页,其中的转盘明显就是一个Android CircleMenu: Android CircleMenu在github上的项目主页是:https://gi...

weixin_35996612的博客 686

C#中使用OpenCV的常用函数

c# opencv 常见操作

大黄鸭在发光的专栏 1079

10.2 构网型变流器引发的次同步振荡与宽频振荡问题:机理分析与抑制技术

随着构网型变流器在新型电力系统中的规模化部署,其作为电压源主动支撑电网的能力得到验证的同时,也引发了一系列前所未有的稳定性问题。传统的同步发电机主导的电力系统中,振荡模式主要集中于**低频区间**。然而,构网型变流器通过快速数字控制实现的虚拟同步、惯性响应等先进功能,其控制环路动态与电网阻抗、其他电力电子设备之间产生了复杂的交互作用。这种交互不仅可能诱发经典的**次同步振荡**,更可能催生频率范围从数赫兹到数百赫兹甚至上千赫兹的**宽频振荡**。

技术工作者 1304

android 转盘菜单,Android实现可点击的幸运大转盘

之前的项目有一个幸运大转盘的功能,在网上找了很久,都没有合适的方法。这是效果图,实现目标:十二星座的图片可点击切换选中效果,根据选择不同的星座,实现不同的 方法。之前网上的都是带有指针的,或者可点击改变效果,但是并不知道选择的到底是哪个,即虚拟选择。实现该功能的主要代码如下:1、自定义一个布局,存放图片,实现圆形布局。/***** CircleMenuLayout.java** @author w...

weixin_29483277的博客 797

[终于解决]Ubuntu14.04 32位安装移动网卡(0bda:b711)驱动8188gu tplink-WN726n

大致梳理一下问题解决的流程 首先,在台式机做了双系统,台式机只有一个网线接口,由于项目要求,需要占用网口传输数据,所以用之前买的tplink-WN726n免驱版2.0的移动网卡 【note】免驱版只能在Windows下安装使用,在Ubuntu系统中无法使用,所以,需要另辟蹊径。 找了很多资料,尝试很多方法,有的复杂有的简单,终于解决。 【思路】首先在Ubuntu系统中输入lsusb,查看是否检测到USB网卡设备。然后从Github中复制代码,构建,安装,然后modprobe一下,到前面那步还不行,就再来一步

瑞o 1万+

开篇!WPF自定义控件(1)——转盘菜单

注册园子账号有半年了吧,一直想写点什么,但不知道从哪写起。最近一个月在无锡一个公司实习,主要做的就是WPF相关的开发,虽然之前没接触过WPF,但好歹学过C#,上手理解起来还算容易。 最近做了个自定义圆形转盘菜单控件,效果如下: 实现过程: 圆周平分孩子节点(这里孩子节点放的都是图标) 实现点击中间图标,外围图标旋转一周动画 实现鼠标点击拖动跟随旋转动画 关键代码:   1...

weixin_30508309的博客 561

PRIDE PPP-AR软件实战:从ZTD解算到PWV反演的全流程避坑指南

本文详细解析了使用PRIDE PPP-AR软件进行GNSS数据处理的全流程,重点涵盖从ZTD解算到PWV反演的关键步骤与精度评估。文章深入剖析了软件部署、数据准备、参数配置中的常见“坑点”,并提供了与IGS ZTD及ERA5产品进行交叉验证的实用方法,旨在帮助用户高效、准确地获取高精度大气可降水量产品。

p8q9r0的博客 605

BitLocker加密盘解密实战:从隐藏分区到密钥恢复的全过程

本文深入探讨了BitLocker加密盘在密钥丢失或遗忘情况下的解密实战方法。文章系统性地介绍了从理解加密机制、制作取证镜像,到深度扫描隐藏分区、分析内存转储寻找密钥残留,最终利用恢复密钥解锁加密卷的全过程。重点剖析了非标准恢复路径,为数据恢复和数字取证工作提供了专业的技术框架和实战思路。

weixin_29268385的博客 333
上一篇: CGContextSetFillColorWithColor: invalid context 0x0. 类似BUG!
下一篇: 微信小程序的语法学习(一)icon,text,button,input
buildSetting
博客等级 码龄11年 36粉丝 76原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值