自定义控件:实现半圆滚动菜单效果

前言

本自定义控件参考自鸿洋大神的自定义控件(原文地址),基于原来的控件效果进行修改,着重实现了以下效果:位置自动修正以及滑动结束的回调。我们先来看看效果图:

控件展示
上面的图片是一个ImageView,与控件无关,是为了验证回调功能。接着是位置自动修正:

位置修正
位置自动修正的意思是说,每个item view经过滑动后,停留的位置不是随意的,而是固定在某个区域之内,就如每个item view装在一个个格子里面。

滑动结束回调
而滑动结束的回调是说,当滑动结束后,滑动到中央的item view会触发一次回调,用户可以利用该回调来进行别的逻辑处理,与别的控件进行交互,比如:某个item view滑动到中央,触发回调,让别的TextView或者ImageView来具体显示该item项的具体信息。

用法

只要在Activity中写上如下几行代码即可:

SemicircleMenu mSemicircleMenu = (SemicircleMenu) findViewById(R.id.circlemenu);
    mSemicircleMenu.setMenuItemIconsAndTexts(mItemImgs, mItemTexts);
    mSemicircleMenu.setOnMenuItemClickListener(new SemicircleMenu.OnMenuItemClickListener() {
        @Override
        public void itemClick(View view, int pos) {
            Toast.makeText(MainActivity.this, mItemTexts[pos], Toast.LENGTH_SHORT).show();

        }
    });

    mSemicircleMenu.setOnCentralItemCallback(new SemicircleMenu.OnCentralItemCallback() {
        @Override
        public void centralItemOperate(int pos) {
            imageView.setImageResource(mItemImgs[pos]);
        }
    });

布局文件:

<com.chenyu.semicirclemenu.SemicircleMenu
        android:id="@+id/circlemenu"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#72d8ff"
        android:clickable="true">
</com.chenyu.semicirclemenu.SemicircleMenu>

(注意:clickable应该为true。)

实现原理

其实关于测量、布局、甚至事件分发的实现原理在原文章都有很详细的说明了,有兴趣的读者可以先阅读原文,这里会作简要的说明,本文重点在于讲述位置修正即滑动结束回调的实现,本文所有代码均作了删减,读者可直接到GitHub处阅读源码。

Part 1 设置itemView的内容及加载itemView

/**
 * 每个Item之间相距的角度
 */
private float mAngleDelay;

/**
 *  设置菜单的文本信息
 */
public void setMenuItemIconsAndTexts(int[] resIds,String[] texts)
{
    mItemIcons = resIds;
    mItemTexts = texts;

    if(resIds == null && texts == null)
    {
        throw new IllegalArgumentException("菜单文本和图片必须设置其一");
    }

    //初始化mMenuItemCount
    mMenuItemCount = resIds == null ? texts.length : resIds.length;

    if(resIds != null && texts != null)
    {
        mMenuItemCount = Math.min(resIds.length,texts.length);
    }
    
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值