网络上关于GridView可拖动的例子已经不少了,包括带动画不带动画的都有一堆,但几乎都是通过继承Android原生控件GridView来扩展的,当然这种实现方式是很容易联想到的,也是最容易实现的。我随便百度了一下,就有一个:http://zhangcb666.blog.163.com/blog/static/4696352920124221043837/,大家可以参考一下,我这里就不赘述了。
今天跟大家分享另外一种方式,通过继承ViewGroup来实现,我们都知道,ViewGroup可以填充很多个View,因此,我觉得可以类似把GridView的每一个Item填充到我们自定义的ViewGroup中,然后监听长按时间,实现拖动的效果,同时加上动画效果,个人感觉比网上其他实现方式更加简洁和美观,唯一的缺点就是:没有setAdapter的函数,添加的item,需要我们手动add到ViewGroup中,如果item不是特别复杂和繁多,个人觉得也不算什么问题。好了,废话不多说,我们先来看看效果图,第一张是静态效果,第二张是拖动时的效果图。
其实代码也是很简单的,总共就两个类:一个自定义控件DragGridView,还有一个使用的例子MainActivity。
我们先来看看DragGridView的代码部分:
- /**
- * 另外一种方式实现动画可拖动item的GridView
- *
- * @author way
- *
- */
- public class DragGridView extends ViewGroup implements View.OnTouchListener,
- View.OnClickListener, View.OnLongClickListener {
- // layout vars
- public static float childRatio = .9f;
- protected int colCount, childSize, padding, dpi, scroll = 0;
- protected float lastDelta = 0;
- protected Handler handler = new Handler();
- // dragging vars
- protected int dragged = -1, lastX = -1, lastY = -1, lastTarget = -1;
- protected boolean enabled = true, touching = false;
- // anim vars
- public static int animT = 150;
- protected ArrayList newPositions = new ArrayList();
- // listeners
- protected OnRearrangeListener onRearrangeListener;
- protected OnClickListener secondaryOnClickListener;
- private OnItemClickListener onItemClickListener;
- /**
- * 拖动item的接口
- */
- public interface OnRearrangeListener {
- public abstract void onRearrange(int oldIndex, int newIndex);
- }
- // CONSTRUCTOR AND HELPERS
- public DragGridView(Context context, AttributeSet attrs) {
- super(context, attrs);
- setListeners();
- handler.removeCallbacks(updateTask);
- handler.postAtTime(updateTask, SystemClock.uptimeMillis() + 500);
- setChildrenDrawingOrderEnabled(true);
- DisplayMetrics metrics = new DisplayMetrics();
- ((Activity) context).getWindowManager().getDefaultDisplay()
- .getMetrics(metrics);
- dpi = metrics.densityDpi;
- }
- protected void setListeners() {
- setOnTouchListener(this);
- super.setOnClickListener(this);
- setOnLongClickListener(this);
- }
- @Override
- public void setOnClickListener(OnClickListener l) {
- secondaryOnClickListener = l;
- }
- protected Runnable updateTask = new Runnable() {
- public void run() {
- if (dragged != -1) {
- if (lastY 0)
- scroll -= 20;
- else if (lastY > getBottom() - getTop() - (padding * 3)
- && scroll = getChildCount())
- return -1;
- return index;
- }
- protected int getColOrRowFromCoor(int coor) {
- coor -= padding;
- for (int i = 0; coor > 0; i++) {
- if (coor -1)
- target = rightPos;
- else if (leftPos > -1)
- target = leftPos + 1;
- if (dragged
- /**
- * MainActivity
- *
- * @author way
- *
- */
- public class MainActivity extends Activity {
- static Random random = new Random();
- static String[] words = "我 是 一 只 大 笨 猪".split(" ");
- DragGridView mDragGridView;
- Button mAddBtn, mViewBtn;
- ArrayList poem = new ArrayList();
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- mDragGridView = ((DragGridView) findViewById(R.id.vgv));
- mAddBtn = ((Button) findViewById(R.id.add_item_btn));
- mViewBtn = ((Button) findViewById(R.id.view_poem_item));
- setListeners();
- }
- private void setListeners() {
- mDragGridView.setOnRearrangeListener(new OnRearrangeListener() {
- public void onRearrange(int oldIndex, int newIndex) {
- String word = poem.remove(oldIndex);
- if (oldIndex
关注打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?
立即登录/注册


微信扫码登录