Android实现网易Tab分类排序控件实现

先看看效果图:

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

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

时间: 2024-09-20 22:30:50

Android实现网易Tab分类排序控件实现的相关文章

Android绑定添加了注解的控件,及其事件方法

  Android绑定添加了注解的控件,及其事件方法.根据成员方法的注解进行绑定,根据成员变量的注解进行绑定,设置事件的监听器,对控件赋值,注意:它必须在activity调用了setContentView之后调用.

界面-android多个activity使用同一个控件

问题描述 android多个activity使用同一个控件 最近在做一个跟播放有关的项目 里面有一个需求是在每个界面(activity)都有一个播放窗口,在播放同一个视频 我想请教一下,有什么方法可以实现让一个播放窗口一直存在,不管切换到哪个acitivty都会存在 或者有没有其他什么折中的方法? 望请教. 解决方案 我有点不明白你的需求,我的理解是,你希望有一个窗口不管用户在操作什么都在播放某个用户指定的视频,是这个意思的话.activity时没有办法实现的. 因为activity的栈模式.你

Android 实现图片切换给个控件名字就行 过期的就不要说了

问题描述 Android 实现图片切换给个控件名字就行 过期的就不要说了 Android 实现图片切换 是要跳到另外一个页面吗? 还是就在本页面 只是把原来页面替换了 解决方案 是像图片浏览器那样滑动切换图片吗? 那样的话并不需要跳转到另外的界面,需要一个ViewPager控件. 解决方案二: 除了viewPage你是可以自定义的!!!! 解决方案三: Android控件 >Gallery 切换图片

Android中日期与时间设置控件用法实例_Android

本文实例讲述了Android中日期与时间设置控件用法.分享给大家供大家参考.具体如下: 1.日期设置控件:DatePickerDialog 2.时间设置控件:TimePickerDialog 实例代码: 页面添加两个Button,单击分别显示日期设置控件和时间设置控件,还是有TextView控件,用于显示设置后的系统时间 main.xml: <?xml version="1.0" encoding="utf-8"?> <LinearLayout x

Android中Spinner(下拉框)控件的使用详解_Android

android给我们提供了一个spinner控件,这个控件主要就是一个列表,那么我们就来说说这个控件吧,这个控件在以前的也看见过,但今天还是从新介绍一遍吧. Spinner位于 android.widget包下,每次只显示用户选中的元素,当用户再次点击时,会弹出选择列表供用户选择,而选择列表中的元素同样来自适配器.Spinner是View类得一个子类. 1.效果图 2.创建页面文件(main.xml) <Spinner android:id="@+id/spinner1" and

android实现自动滚动的Gallary控件效果_Android

本文实例讲述了android实现自动滚动的Gallary控件.分享给大家供大家参考.具体如下: import java.util.Timer; import java.util.TimerTask; import android.content.Context; import android.os.Handler; import android.util.AttributeSet; import android.util.Log; import android.view.KeyEvent; im

Android ScrollView只能添加一个子控件问题解决方法_Android

本文实例讲述了Android ScrollView只能添加一个子控件问题解决方法.分享给大家供大家参考,具体如下: 有下面一段代码 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent

Android动态添加设置布局与控件的方法_Android

本文实例讲述了Android动态添加设置布局与控件的方法.分享给大家供大家参考,具体如下: 有时候我们会在代码端,动态的设置,添加布局和控件.下面我们就看来看一下如何处理,直接上代码,代码里面的注解很清楚了. 布局文件:fragment_hot.xml 说明:这个部局,我用的是scrollView做为基础布局,主要是为了实现一个滚动.这里不多说,这个你可以使用任何布局都可以,这里的id我是提前定义的. 这里面的现在有的布局是我为了看到我在代码端,动态添加的代码,是否可以追加到现有布局的后面而加上

Android使用RecyclerView实现水平滚动控件_Android

前言 相信大家都知道Android滚动控件的实现方式有很多, 使用RecyclerView也比较简单. 做了一个简单的年龄滚动控件, 让我们来看看RecyclerView的使用方式, 主要有以下几点:      (1) 对齐控件中心位置.      (2) 计算滚动距离.      (3) 高亮中心视图.      (4) 实时显示中心数据.      (5) 停止时自动对齐.      (6) 滚动时, 设置按钮状态开关. 效果 1. 框架 主要关注RecyclerView部分逻辑. /**