iis服务器助手广告广告
返回顶部
首页 > 资讯 > 移动开发 >Android实现GridView中的item自由拖动效果
  • 316
分享到

Android实现GridView中的item自由拖动效果

动效gridviewAndroid 2022-06-06 06:06:44 316人浏览 薄情痞子
摘要

之前的工作中,需要实现一个功能就是GridView中的item可以自由拖动, 思考了一下,其实实现起来不是很困难,主要工作就是交换节点,以及拖动时的移动效果,下面讲讲具体的实现

之前的工作中,需要实现一个功能就是GridView中的item可以自由拖动, 思考了一下,其实实现起来不是很困难,主要工作就是交换节点,以及拖动时的移动效果,下面讲讲具体的实现:

首先声明一个BaseAdapter:


package com.dafasoft.dragablegridview;
import Android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import java.util.ArrayList;
import java.util.List;

public abstract class BaseDragableAdapter<T> extends BaseAdapter {
protected List<T> mList;
protected Context mContext;
protected LayoutInflater mInflater;
//初始化需隐藏的位置信息
protected int mHidePosition = AdapterView.INVALID_POSITION;
public BaseDragableAdapter(Context context) {
this.mContext = context;
this.mInflater = LayoutInflater.from(context);
mList = new ArrayList<T>();
}
@Override
public int getCount() {
return mList == null ? 0 : mList.size();
}
@Override
public Object getItem(int i) {
return mList == null ? 0 : mList.get(i);
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public abstract View getView(int i, View view, ViewGroup viewGroup);
public void setList(List<T> list) {
if (this.mList != null) this.mList.clear(); // 避免脏数据
if (list == null) {
return;
}
this.mList = list;
}
public void setList(T[] list){
ArrayList<T> arrayList = new ArrayList<T>(list.length);
for (T t : list) {
arrayList.add(t);
}
setList(arrayList);
}
public List<T> getList() {
return this.mList;
}
public void addAll(List<T> list) {
if (list == null || list.size() == 0) return;
this.mList.addAll(list);
}
public void addAll(int location, List<T> list) {
if (list == null || list.size() == 0) return;
this.mList.addAll(location, list);
}
public void clean() {
if (getCount() == 0) return;
mList.clear();
}
public void hideView(int position){
mHidePosition = position;
notifyDataSetChanged();
}
public void showHideView(){
//重置hideposition
mHidePosition = AdapterView.INVALID_POSITION;
notifyDataSetChanged();
}

public void swapView(int draggedPos , int currentPos) {
//从前往后拖
if(draggedPos < currentPos){
//将被拖拽的节点移动至当前节点
mList.add(currentPos + 1 , mList.get(draggedPos));
//删除拖拽前的节点
mList.remove(draggedPos);
}
//从后往前拖
else if (draggedPos > currentPos) {
//将被拖拽的节点移动至当前节点
mList.add(currentPos , mList.get(draggedPos));
//删除拖拽前的节点
mList.remove(draggedPos + 1);
}
mHidePosition = currentPos;
notifyDataSetChanged();
}
}

其次实现DragableGridView:


package com.dafasoft.dragablegridview;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.PixelFORMat;
import android.util.AttributeSet;
import android.util.Log;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.GridView;
import android.widget.ImageView;

public class DragableGridView extends GridView {
private static final int DRAG_IMG_SHOW = 1;
private static final int DRAG_IMG_NOT_SHOW = 0;
private static final String LOG_TAG = "DragGridView";
private static final float AMP_FACTOR = 1.2f;
private ImageView dragImageView;
private WindowManager.LayoutParams dragImageViewParams;
private WindowManager windowManager;
private boolean isViewOnDrag = false;

private int preDraggedOverPositon = AdapterView.INVALID_POSITION;
private int downRawX;
private int downRawY;
public DragableGridView(Context context) {
super(context);
initView();
}
public DragableGridView(Context context, AttributeSet attrs) {
super(context, attrs);
initView();
}
public DragableGridView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initView();
}
public void initView() {
setOnItemLonGClickListener(mOnItemLongClickListener);
//setOnItemClickListener(onItemClickListener);
//setOnItemSelectedListener(onItemSelectedListener);
//初始化显示被拖动item的image view
dragImageView = new ImageView(getContext());
dragImageView.setTag(DRAG_IMG_NOT_SHOW);
//初始化用于设置dragImageView的参数对象
dragImageViewParams = new WindowManager.LayoutParams();
//获取窗口管理对象,用于后面向窗口中添加dragImageView
windowManager = (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE);
}
private OnItemLongClickListener mOnItemLongClickListener = new OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
//记录长按item位置
preDraggedOverPositon = position;
//获取被长按item的drawing cache
view.destroyDrawingCache();
view.setDrawingCacheEnabled(true);
//通过被长按item,获取拖动item的bitmap
Bitmap dragBitmap = Bitmap.createBitmap(view.getDrawingCache());
//设置拖动item的参数
dragImageViewParams.gravity = Gravity.TOP | Gravity.LEFT;
//设置拖动item为原item 1.2倍
dragImageViewParams.width = (int)(AMP_FACTOR*dragBitmap.getWidth());
dragImageViewParams.height = (int)(AMP_FACTOR*dragBitmap.getHeight());
//设置触摸点为绘制拖动item的中心
dragImageViewParams.x = (downRawX - dragImageViewParams.width/2);
dragImageViewParams.y = (downRawY - dragImageViewParams.height/2);
dragImageViewParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
| WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
| WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
| WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;
//设置窗口支持透明度
dragImageViewParams.format = PixelFormat.TRANSLUCENT;
dragImageViewParams.windowAnimations = 0;
//dragImageView为被拖动item的容器,清空上一次的显示
if((int)dragImageView.getTag() == DRAG_IMG_SHOW) {
windowManager.removeView(dragImageView);
dragImageView.setTag(DRAG_IMG_NOT_SHOW);
}
//设置本次被长按的item
dragImageView.setImageBitmap(dragBitmap);
//添加拖动item到屏幕
windowManager.addView(dragImageView, dragImageViewParams);
dragImageView.setTag(DRAG_IMG_SHOW);
isViewOnDrag = true;
//设置被长按item不显示
((BaseDragableAdapter)getAdapter()).hideView(position);
return true;
}
};
@Override
public boolean onTouchEvent(MotionEvent ev) {
//被按下时记录按下的坐标
if(ev.getAction() == MotionEvent.ACTION_DOWN) {
//获取触摸点相对于屏幕的坐标
downRawX = (int)ev.getRawX();
downRawY = (int)ev.getRawY();
}
//dragImageView处于被拖动时,更新dragImageView位置
else if((ev.getAction() == MotionEvent.ACTION_MOVE) && (isViewOnDrag == true)) {
Log.i(LOG_TAG, "" + ev.getRawX() + " " + ev.getRawY());
//设置触摸点为dragImageView中心
dragImageViewParams.x = (int)(ev.getRawX() - dragImageView.getWidth()/2);
dragImageViewParams.y = (int)(ev.getRawY() - dragImageView.getHeight()/2);
//更新窗口显示,移动dragImageView的位置
windowManager.updateViewLayout(dragImageView, dragImageViewParams);
//获取当前触摸点的item position
int currDraggedPosition = pointToPosition((int)ev.getX(), (int)ev.getY());
//如果当前停留位置item不等于上次停留位置的item,交换本次和上次停留的item
if((currDraggedPosition != AdapterView.INVALID_POSITION) && (currDraggedPosition != preDraggedOverPositon)) {
((BaseDragableAdapter)getAdapter()).swapView(preDraggedOverPositon, currDraggedPosition);
preDraggedOverPositon = currDraggedPosition;
}
}
//释放dragImageView
else if((ev.getAction() == MotionEvent.ACTION_UP) && (isViewOnDrag == true)) {
((BaseDragableAdapter)getAdapter()).showHideView();
if((int)dragImageView.getTag() == DRAG_IMG_SHOW) {
windowManager.removeView(dragImageView);
dragImageView.setTag(DRAG_IMG_NOT_SHOW);
}
isViewOnDrag = false;
}
return super.onTouchEvent(ev);
}
}

实现一个adapter继承自BaseDragableAdapter:


package com.dafasoft.dragablegridview;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

public class MyAdapter extends BaseDragableAdapter<String> {
public MyAdapter(Context context) {
super(context);
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
ViewHolder viewHolder;
if (view == null) {
viewHolder = new ViewHolder();
view = mInflater.inflate(R.layout.adapter_my , null);
viewHolder.mItemTv = (TextView) view.findViewById(R.id.tv_item);
view.setTag(viewHolder);
} else {
viewHolder = (ViewHolder)view.getTag();
}
if (mHidePosition == i) {
view.setVisibility(View.GoNE);
} else {
view.setVisibility(View.VISIBLE);
}
viewHolder.mItemTv.setText(mList.get(i));
return view;
}
class ViewHolder{
TextView mItemTv;
}
}

在activity中使用:


package com.dafasoft.dragablegridview;
import android.app.Activity;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends Activity {
private DragableGridView mDragableGv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mDragableGv = (DragableGridView) findViewById(R.id.drag_grid_view);
MyAdapter adapter = new MyAdapter(this);
List<String> list = new ArrayList<String>();
for (int i = 0 ; i < 30 ; i ++) {
list.add("position" + i);
}
adapter.setList(list);
mDragableGv.setAdapter(adapter);
}
}

以上所述是小编给大家介绍的Android实现GridView中的item自由拖动效果,实现一个模拟后台数据登入的效果,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对编程网网站的支持!

您可能感兴趣的文章:Android实现单页面浮层可拖动view的一种方法Android实现单页面浮层可拖动view的示例代码Android自定义View圆形和拖动圆、跟随手指拖动效果Android ViewDragHelper仿淘宝拖动加载效果Android实现跟随手指拖动并自动贴边的View样式(实例demo)Android实现ImageView图片缩放和拖动Android通过自定义ImageView控件实现图片的缩放和拖动的实现代码Android RecyclerView滑动删除和拖动排序Android自定义View实现拖动选择按钮Android自定义View圆形和拖动圆跟随手指拖动


--结束END--

本文标题: Android实现GridView中的item自由拖动效果

本文链接: https://www.lsjlt.com/news/23366.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Android RecycleView如何实现Item拖拽效果
    这篇文章将为大家详细讲解有关Android RecycleView如何实现Item拖拽效果,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。基于公司产品的优化需求,其中一个需求涉及到R...
    99+
    2023-06-26
  • AndroidRecycleView实现Item拖拽效果
    基于公司产品的优化需求,其中一个需求涉及到RecycleView的拖拽,以及拖拽后item位置的持久化,目的是可以用户自定义界面偏好,并在用户下次进入本界面后,之前设置的偏好仍然有效...
    99+
    2024-04-02
  • Android自定义View实现拖动自动吸边效果
    本文实例为大家分享了Android自定义View实现拖动自动吸边的具体代码,供大家参考,具体内容如下 自定义View,一是为了满足设计需求,二是开发者进阶的标志之一。随心所欲就是我等...
    99+
    2024-04-02
  • Android实现控件拖动效果
    本文实例为大家分享了Android实现控件拖动效果的具体代码,供大家参考,具体内容如下 1.今天突然想到做个实现个控件拖动效果,就来试试,一查原来还是很简单的 2.原理就是实现OnT...
    99+
    2024-04-02
  • Android怎么实现控件拖动效果
    这篇文章主要介绍“Android怎么实现控件拖动效果”,在日常操作中,相信很多人在Android怎么实现控件拖动效果问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Android怎么实现控件拖动效果”的疑惑有所...
    99+
    2023-06-20
  • Android Flutter实现自由落体弹跳动画效果
    目录粒子运动概念如何保持持续运动 创建粒子对象创建粒子控制器初始化粒子创建画板多粒子实现八大行星加速度自由落体弹跳总结粒子运动概念 粒子运动是将对象按照一定物理公式进行的自...
    99+
    2022-11-13
    Android Flutter自由落体弹跳动画 Flutte 弹跳动画 Flutter 动画
  • Android利用GridView实现单选效果
    1.实现如图所示的单选效果由于Android提供的单选按钮radiobutton只能单行或单列显示,且样式并不美观,故可用GridView进行改造,实现单选效果,而要实现这样的效果重点就在GridView的适配器这块了。首先是GridVie...
    99+
    2023-05-31
    gridview 单选 idv
  • Android如何实现自定义View圆形和拖动圆、跟随手指拖动效果
    小编给大家分享一下Android如何实现自定义View圆形和拖动圆、跟随手指拖动效果,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!单纯的自定义一个圆非常简单 只需要几步就完成 拖动圆添加实现触摸事件即可我在第一次自定义Vi...
    99+
    2023-05-30
    android view
  • QListWidget怎么实现自定义Item效果
    本文小编为大家详细介绍“QListWidget怎么实现自定义Item效果”,内容详细,步骤清晰,细节处理妥当,希望这篇“QListWidget怎么实现自定义Item效果”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧...
    99+
    2023-06-30
  • jQuery中如何实现拖动效果
    这篇文章主要介绍了jQuery中如何实现拖动效果,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。jQuery实现拖动效果的实例代码,具体代码如...
    99+
    2024-04-02
  • jquery如何实现拖动效果
    这篇文章主要介绍jquery如何实现拖动效果,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!代码如下:<!DOCTYPE html> <html ...
    99+
    2024-04-02
  • js实现拖动滑块效果
    本文实例为大家分享了js如何拖动滑块的具体代码,供大家参考,具体内容如下 实现拖动滑块,先分析,滑块可以拖动应该改变滑块在页面中的坐标,那就采用定位拿到元素的 top 和 left ...
    99+
    2024-04-02
  • winform如何实现控件自由拖动
    在WinForm中,可以通过以下步骤实现控件自由拖动:1. 在控件上按下鼠标左键时,记录鼠标相对于控件左上角的位置。```cshar...
    99+
    2023-09-13
    winform
  • vue实现移动端div拖动效果
    本文实例为大家分享了vue实现移动端div拖动的具体代码,供大家参考,具体内容如下 手机上会偶尔用到拖动div的效果,虽然我自己还没遇到,先写一个以防万一,需要注明的是,具体实现代码...
    99+
    2024-04-02
  • 详解QListWidget如何实现自定义Item效果
    首先,我们来看以下实现的最终效果吧! 我觉得这并不是一个很难得问题,最近新招了一个应届生,发现在实现上述效果时,被困扰住了,是不是刚刚接触Qt的这种稍微有难度的界面时,都会有些无头...
    99+
    2024-04-02
  • js实现拖动模态框效果
    本文实例为大家分享了js实现拖动模态框效果的具体代码,供大家参考,具体内容如下 1.实现效果: 点击链接,弹出模态框。点击关闭,关闭模态框。 点击标题部分,可以随意移动模态框的位置...
    99+
    2024-04-02
  • 如何在android中利用RecyclerView实现Item的拖拽排序与滑动删除
    如何在android中利用RecyclerView实现Item的拖拽排序与滑动删除?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。需求和技术分析RecyclerV...
    99+
    2023-05-31
    recyclerview android recycle
  • jQuery实现移动端悬浮拖动效果
    模拟手机端悬浮按钮功能,自动吸附两边,并且不能超过活动区域,上下超过自动吸附上或下 因为是移动端端事件,需要调试到移动端才可以看效果 以下是代码 <!DOCTYPE ht...
    99+
    2024-04-02
  • Dreamweaver中怎么实现可拖动表格效果
    Dreamweaver中怎么实现可拖动表格效果,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。  1.在文档中插入一个表格。插入一个表格  2.选中表格,在属性面...
    99+
    2023-06-08
  • Android中怎么利用ViewDragHelper实现一个淘宝拖动加载效果
    本篇文章为大家展示了Android中怎么利用ViewDragHelper实现一个淘宝拖动加载效果,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。创建自定义ViewGroup:package ...
    99+
    2023-05-30
    android viewdraghelper
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作