前言
本自定义控件参考自鸿洋大神的自定义控件(原文地址),基于原来的控件效果进行修改,着重实现了以下效果:位置自动修正以及滑动结束的回调。我们先来看看效果图:
上面的图片是一个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);
}