先看看效果图:
1、XML布局引入
<com.net168.lib.SortTabLayout android:id="@+id/layout" android:layout_width="match_parent" android:layout_height="wrap_content" />
2、设置数据源数据,也就是每个item的对应文本数据
//构造数据源,暂时仅支持String
List<String> data = new ArrayList<String>();
for (int i = 0; i < 20; i ++) {
data.add("item" + i);
}
//设置数据源
vSortLayout.setShowData(data, 1);
3、设置,用于交互点击和长按的事件
vSortLayout.setOnSelectListener(new onSelectListener() {
//点击事件,点击Tab布局里面的item触发
@Override
public void onSelect(View v, int index) {
Toast.makeText(MainActivity.this, "你点击了item ,内容为:" + ((TextView)v).getText(), Toast.LENGTH_SHORT).show();
}
//长按事件,长按Tab布局里面的item触发
@Override
public void onLongSelect(View v) {
Toast.makeText(MainActivity.this, "长按Tab,开始排列", Toast.LENGTH_SHORT).show();
}
});
4、开始排序和结束排序的接口
//如果参数是true的话,开始排序,也就是可以拖动 vSortLayout.setIsMoveList(true); //结束排序,并且会返回选择tab的当前新位置 vSortLayout.getAndFinishSortData();
未完善的自定义功能
1、现在仅仅是支持String,并且布局也无法自定义,后续可能会完善Tab的item的View的自定义输入
2、现在布局的行数和间距由硬代码控制,并没有形成简便易懂的接口
PS:调试间距的方法,主要调试下列几个参数
/** * 配置参数区域 * mMaxRow : 每行的个数 * Magin Width Tab的间隔和本身的宽度的占比 * 例如mMaxRow = 4,则宽度会由此策略分配 * |Magin|View|Magin|View|Magin|View|Magin|View|Magin| * 记控件宽度为这么分配 : 总宽度 = 5 * Magin + 4 * View, 而 Magin : View = mRowMagin : mRowWidth * 可以推导出各个控件的宽度,高度也如此计算 */ private final int mMaxRow = 4; private final int mRowMagin = 5; private final int mRowWidth = 26; private final int mColumnMagin = 4; private final int mColumnHeight = 10;
3、回滚不流畅,后期可以引入Scroller来控制缓慢回滚
实现原理
1、布局item排序采用基于ViewGroup的自定义布局,在onLayout的方法逻辑根据配置参数区域的参数进行计算配置
@Override
protected void onLayout(boolean arg0, int arg1, int arg2, int arg3, int arg4) {
final int childCount = getChildCount();
int row = 0;
int column = 0;
int startWidth = 0;
int startHeight = 0;
for (int i = 0; i < childCount; i++) {
View childeView = childList.get(i);
row = i / 4;
column = i % 4;
startWidth = (int) ((column * (mRowWidth + 2 * mRowMagin) + mRowMagin) * mChildeItemSize);
startHeight = (int) ((row * (mColumnHeight + 2 * mColumnMagin) + mColumnMagin) * mChildeItemSize);
childeView.layout(startWidth ,startHeight ,(int)(startWidth + mRowWidth * mChildeItemSize),
(int)(startHeight + mColumnHeight * mChildeItemSize));
}
}
2、滑动模块部分,在onTouchEvent里面根据坐标的捕获,有坐标分析出对应的子Item,利用View.layout()方法让拖动的View跟随手指移动,参加代码
private void moveChildView(float x, float y) {
if (mMoveChildView != null) {
int left = (int) (((mChildIndex % 4) * (mRowWidth + 2 * mRowMagin) + mRowMagin) * mChildeItemSize);
int top = (int) (((mChildIndex / 4) * (mColumnHeight + 2 * mColumnMagin) + mColumnMagin) * mChildeItemSize);
int width = (int) (left + mRowWidth * mChildeItemSize);
int heigth = (int) (top + mColumnHeight * mChildeItemSize);
int moveX = (int) (x - beginX);
int moveY = (int) (y - beginY);
mMoveChildView.layout(left + moveX, top + moveY, width + moveX, heigth + moveY);
mMoveChildView.invalidate();
}
}
3、动画模块,由于考虑低版本和不想引入过多的开源库,故采用普通的动画实现
具体参见beginAnimation(final int start,final int end, boolean forward)方法。
4、整体流程
a、Touch的down事件,捕捉当前的x、y数据,计算出被移动的View的所对应index,并且其余view开始抖动动画
b、move事件,将被选中的view根据x、y利用layout方法进行跟随手指移动
c、up事件,执行位置调整动画,并且在调整完毕后,进行新位置的设置
完整代码:https://github.com/ganchuanpu/SortTabLayout.git
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# Android
# Tab
# 分类排序控件
# 自定义
# 拖动
# 几个
# 将被
# 仅仅是
# 开源
# 大家多多
# 计算出
# 后期
# 行数
# 所对应
# 完毕后
# Toast
# index
# View
# TextView
# MainActivity
# makeText
# onSelect
相关文章:
网站制作网站,深圳做网站哪家比较好?
如何快速搭建安全的FTP站点?
建站之星伪静态规则如何正确配置?
网站制作公司,橙子建站是合法的吗?
常州自助建站:操作简便模板丰富,企业个人快速搭建网站
企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?
如何快速生成ASP一键建站模板并优化安全性?
宝塔建站无法访问?如何排查配置与端口问题?
建站主机是否等同于虚拟主机?
如何制作网站标识牌,动态网站如何制作(教程)?
网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?
建站主机服务器选型指南与性能优化方案解析
重庆市网站制作公司,重庆招聘网站哪个好?
XML的“混合内容”是什么 怎么用DTD或XSD定义
,巨量百应是干嘛的?
如何彻底删除建站之星生成的Banner?
如何在阿里云部署织梦网站?
深入理解Android中的xmlns:tools属性
如何用IIS7快速搭建并优化网站站点?
建站主机核心功能解析:服务器选择与网站搭建流程指南
定制建站策划方案_专业建站与网站建设方案一站式指南
如何通过网站建站时间优化SEO与用户体验?
哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?
深圳企业网站制作设计,在深圳如何网上全流程注册公司?
已有域名能否直接搭建网站?
如何自定义建站之星模板颜色并下载新样式?
制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?
已有域名如何免费搭建网站?
网站制作价目表怎么做,珍爱网婚介费用多少?
如何快速搭建支持数据库操作的智能建站平台?
TestNG的testng.xml配置文件怎么写
如何通过免费商城建站系统源码自定义网站主题与功能?
如何在腾讯云服务器快速搭建个人网站?
高防服务器租用指南:配置选择与快速部署攻略
台州网站建设制作公司,浙江手机无犯罪记录证明怎么开?
建站VPS配置与SEO优化指南:关键词排名提升策略
C++ static_cast和dynamic_cast区别_C++静态转换与动态类型安全转换
如何选择高效稳定的ISP建站解决方案?
如何用wdcp快速搭建高效网站?
建站168自助建站系统:快速模板定制与SEO优化指南
建站之星24小时客服电话如何获取?
香港网站服务器数量如何影响SEO优化效果?
如何在自有机房高效搭建专业网站?
小说建站VPS选用指南:性能对比、配置优化与建站方案解析
官网建站费用明细查询_企业建站套餐价格及收费标准指南
建站之星收费标准详解:套餐费用及年费价格表一览
Thinkphp 中 distinct 的用法解析
建站之星如何快速解决建站难题?
建站主机如何选?高性价比方案全解析
开心动漫网站制作软件下载,十分开心动画为何停播?
*请认真填写需求信息,我们会在24小时内与您取得联系。