GridView拖动效果实现
GridView拖动效果实现
- 1. 重新GridView控件
package com.whbs.drag.widget;
import com.whbs.drag.DragGridActivity.DragGridAdapter;
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.ViewGroup;
import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.GridView;
import android.widget.ImageView;
public class GragGridView extends GridView{
private static final String TAG = "GragGridView";
//定义基本的成员变量
private ImageView dragImageView; //拖动的影像
private int dragSrcPosition;//原始对应位置
private int dragPosition;//拖动到坐标对应的位置
//x,y坐标的计算
private int dragPointX; //按下坐标相对于当前项位置-- 相对
private int dragPointY;
private int dragOffsetX;//当前窗体和屏幕的距离 --绝对
private int dragOffsetY;
private WindowManager windowManager;//窗口控制类
private WindowManager.LayoutParams windowParams; //用于控制拖动项的显示参数
// private int scaledTouchSlop; //判断滑动的距离
private int upScrollBounce; //拖动时候,开始向上滚动的边界
private int downScrollBounce;//拖动时候,开始向下滚动的边界
public GragGridView(Context context) {
super(context);
}
public GragGridView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
// TODO Auto-generated constructor stub
}
public GragGridView(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
}
//触控拦截事件
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
if(ev.getAction() == MotionEvent.ACTION_DOWN){
int x = (int)ev.getX();
int y = (int)ev.getY();
//选中数据项位置 ,
dragSrcPosition = dragPosition = pointToPosition(x, y);
if(dragPosition == AdapterView.INVALID_POSITION){//无效位置(超出边蛸,分割线)
return super.onInterceptTouchEvent(ev);
}
Log.i(TAG, "[onInterceptTouchEvent] dragSrcPosition:"+dragSrcPosition+",getFirstVisiblePosition():"+getFirstVisiblePosition());
//getFirstVisiblePosition()返回第一个dispaly在界面的view在adapter的位置 可能是0,也可能是4
ViewGroup itemView = (ViewGroup)getChildAt(dragPosition - getFirstVisiblePosition());
//计算按下的坐标相对当前项的位置
dragPointX = x - itemView.getLeft();//在当前项的X位置
dragPointY = y - itemView.getTop();
//当前窗体和屏幕的距离
dragOffsetX = (int) (ev.getRawX()-x);
dragOffsetY = (int) (ev.getRawY() -y);
Log.i(TAG, "[onInterceptTouchEvent] [x:"+x+",y:"+y+"],[rawX:"+ev.getRawX()+",rawY:"+ev.getRawY()+"]");
Log.i(TAG, "[onInterceptTouchEvent] [dragPointX:"+dragPointX+",dragPointY:"+dragPointY+"],[dragOffsetX:"+dragOffsetX+",dragOffsetY:"+dragOffsetY+"]");
//
// upScrollBounce = Math.min(y-scaledTouchSlop, getHeight()/4);
// downScrollBounce = Math.max(y+scaledTouchSlop, getHeight()*3/4);
upScrollBounce = Math.min(y, getHeight()/4);//向上可以滚动的距离
downScrollBounce = Math.max(y, getHeight()*3/4);//向下可以滚动的距离
itemView.setDrawingCacheEnabled(true);
Bitmap bm = Bitmap.createBitmap(itemView.getDrawingCache());
startDrag(bm,x,y);
}
return super.onInterceptTouchEvent(ev);
}
//开始拖动
public void startDrag(Bitmap bm,int x,int y){
stopDrag();
windowParams = new WindowManager.LayoutParams();
windowParams.gravity = Gravity.TOP|Gravity.LEFT;
windowParams.x = x - dragPointX + dragOffsetX;//计算当前项Left离窗体的距离
windowParams.y = y - dragPointY + dragOffsetY;//计算当前项Top离窗体的距离
windowParams.width = WindowManager.LayoutParams.WRAP_CONTENT;
windowParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
windowParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
| WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
| WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;
windowParams.format = PixelFormat.TRANSLUCENT;
windowParams.windowAnimations = 0;
ImageView imageView = new ImageView(getContext());
imageView.setImageBitmap(bm);
windowManager = (WindowManager)getContext().getSystemService(getContext().WINDOW_SERVICE);
windowManager.addView(imageView, windowParams);
dragImageView = imageView;
}
//停止拖到
public void stopDrag(){
if(dragImageView != null){
windowManager.removeView(dragImageView);
dragImageView = null;
}
}
//拖动
public void onDrag(int x,int y){
if(dragImageView != null){
windowParams.alpha = 0.9f;
windowParams.x = x - dragPointX + dragOffsetX;
windowParams.y = y - dragPointY + dragOffsetY;
windowManager.updateViewLayout(dragImageView, windowParams);
}
int tempPosition = pointToPosition(x, y);
if(tempPosition != INVALID_POSITION){
dragPosition = tempPosition;
}
if(y < upScrollBounce || y > downScrollBounce){
setSelection(dragPosition);
}
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
if(dragImageView != null && dragPosition != INVALID_POSITION){
int action = ev.getAction();
switch(action){
case MotionEvent.ACTION_UP:
int upx = (int)ev.getX();
int upY = (int)ev.getY();
stopDrag();
onDrop(upx,upY);
break;
case MotionEvent.ACTION_MOVE:
int moveX = (int)ev.getX();
int moveY = (int)ev.getY();
onDrag(moveX, moveY);
break;
}
return true;
}
return super.onTouchEvent(ev);
}
//拖到落下
public void onDrop(int x,int y){
int tempPosition = pointToPosition(x,y);
if(tempPosition != INVALID_POSITION){
dragPosition = tempPosition;
}
//超出边界
if(y < getChildAt(0).getTop()){
dragPosition = 0;
}else if(y > getChildAt(getChildCount()-1).getBottom() ||
(y > getChildAt(getChildCount()-1).getTop() &&
x > getChildAt(getChildCount()-1).getRight())){
//超出下边界
dragPosition = getAdapter().getCount() -1;
}
//数据交换当前拖动的于拖到到位置上的图片交换
if(dragPosition != dragSrcPosition && dragPosition > -1 && dragPosition < getAdapter().getCount()){
DragGridAdapter adapter = (DragGridAdapter)getAdapter();
String dragSrcItem = adapter.getItem(dragSrcPosition);
String dragTargetItem = adapter.getItem(dragPosition);
adapter.remove(dragSrcItem);
adapter.insert(dragSrcItem, dragPosition);
adapter.remove(dragTargetItem);
adapter.insert(dragTargetItem, dragSrcPosition);
System.out.println("srcPosition="+dragSrcPosition+" dragPosition="+dragPosition);
//Toast.makeText(getContext(), adapter.getList().toString(), Toast.LENGTH_SHORT).show();
}
}
}
- 2. Activity调用实现
package com.whbs.drag;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import com.whbs.drag.widget.GragGridView;
public class DragGridActivity extends Activity {
private static List<String> list = null;
// private static List<Integer> res = null;
//自定义适配器
private DragGridAdapter adapter = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.drag_grid_activity);
initData();
//
GragGridView dragView = (GragGridView)findViewById(R.id.drag_grid);
// System.out.println("dragView"+dragView);
adapter = new DragGridAdapter(this, list);
dragView.setAdapter(adapter);
}
public void initData(){
list = new ArrayList<String>();
// res = new ArrayList<Integer>();
for(int i = 0; i < 12; i++){
list.add("grid_"+i%12);
//res.add(0x7f020000+i);
}
}
public class DragGridAdapter extends ArrayAdapter<String>{
public DragGridAdapter(Context context, List<String> objects) {
super(context, 0, objects);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = convertView;
if(view == null){
view = LayoutInflater.from(getContext()).inflate(R.layout.drag_grid_item, null);
}
try {
//跟据文件名获取资源文件中的图片资源
Field f = R.drawable.class.getDeclaredField(getItem(position));
int i = f.getInt(R.drawable.class);
ImageView imageview = (ImageView)view.findViewById(R.id.drag_grid_item_image);
imageview.setImageResource(i);
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
// }
} catch (NoSuchFieldException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return view;
}
}
}
- 3. Xml文件
- 1. drag_grid_activity.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/bg"
android:padding="10dip"
>
<com.whbs.drag.widget.GragGridView
android:id="@+id/drag_grid"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:cacheColorHint="#4682B4"
android:numColumns="4"
android:stretchMode="columnWidth"
android:verticalSpacing="5dip"
android:horizontalSpacing="5dip">
</com.whbs.drag.widget.GragGridView>
</LinearLayout>
- 2. drag_grid_item.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:paddingLeft="5dip"
android:paddingRight="5dip"
>
<ImageView
android:id="@+id/drag_grid_item_image"
android:padding="5dip"
android:background="@drawable/grid_bg"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
/>
</RelativeLayout>
- 4. AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.whbs.drag"
android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name="DragGridActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
GridView拖动效果实现的更多相关文章
- vc++ mfc中拖动效果的实现 借助于CImageList
拖动是界面编程频繁使用的一个效果,在windows系统下可谓大行其道.纵观时下的应用软件几乎各个都支持各种各样拖动的效果,windows7更是把拖动做到了极致.其实说起来拖动的实现也很简单,对于有句柄 ...
- js实现一个可以兼容PC端和移动端的div拖动效果
前段时间写了一个简单的div拖动效果,不料昨天项目上正好需要一个相差不多的需求,就正好用上了,但是在移动端的时候却碰到了问题,拖动时候用到的三个事件:mousedown.mousemove.mouse ...
- 使用jquery实现简单的拖动效果,分享源码
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAkEAAAERCAIAAADzAOSQAAALRklEQVR4nO3dW5LaaAKEUfa/NkfMGu
- jquery div拖动效果示例代码
div拖动效果想必大家都有见到过吧,实现的方法也是有很多的,下面为大家将介绍使用jquery是如何实现的,感兴趣的朋友不要错过 复制代码代码如下: <%@ page language=" ...
- 使用jQuery实现简单的拖动效果
转自:http://www.muzilei.com/archives/136 如何实现拖动效果? 浏览DEMO 首先分析下拖动效果原理: 1.当鼠标在被拖动对象上按下鼠标(触发onmousedown事 ...
- Web的鼠标拖动效果
以前写过一个拖动效果的Demo,拖拽元素新位置的计算是放在拖拽元素的mousemove事件中进行的.计算效率差,而且效果不好.所以一直有想怎样才能做出jquery-ui那种顺滑的拖拽效果. 其实顺滑的 ...
- js 实现win7任务栏拖动效果
前言 在某个时刻, 我认识了一个朋友. 此人在我的教唆下, 踏上了js的不归路. 前天他问我, Win7任务栏拖动效果怎么实现. 我随口就跟他说, 这简单的一逼. 在我一晚上的折腾之后, 一份潦草的代 ...
- Swift - 禁用UIWebView和WKWebView的下拉拖动效果
使用UIWebView或WKWebView加载网页时,如果页面处于最顶端时,用户用手指往下拖动,会露出灰色空背景.同样页面在最底部的时候,继续向上拖动,下方也会露出空背景. 要禁止这个拖动效果,可进行 ...
- Android 仿 窗帘效果 和 登录界面拖动效果 (Scroller类的应用) 附 2个DEMO及源码
在android学习中,动作交互是软件中重要的一部分,其中的Scroller就是提供了拖动效果的类,在网上,比如说一些Launcher实现滑屏都可以通过这个类去实现.下面要说的就是上次Scroller ...
随机推荐
- poj1948
很容易想到dp,f[i,j,k]表示到第i根木棒所组成三条边中两条边长为j,k是否存在 之后找所有满足三角形形成条件的三条边,然后找最大: 但: 如果你朴素的写,很有可能超时,事实上,只要加一些常数优 ...
- ExtJs批量更新
昨天这个批量更新花了我不少时间,特记下来,省得以后忘记. 批量更新的逻辑是这样的. 获取Store中需要更新的行,把行放入数组,然后再将数组转化为Json字符串,Json字符串传后后台后,解析为实体列 ...
- UVa 1210 (高效算法设计) Sum of Consecutive Prime Numbers
题意: 给出n,求把n写成若干个连续素数之和的方案数. 分析: 这道题非常类似大白书P48的例21,上面详细讲了如何从一个O(n3)的算法优化到O(n2)再到O(nlogn),最后到O(n)的神一般的 ...
- [转]ASP.NET MVC Jquery Validate 表单验证的多种方式介绍
在我们日常开发过程中,前端的表单验证很重要,如果这块处理不当,会出现很多bug .但是如果处理的好,不仅bug会很少,用户体验也会得到很大的提升.在开发过程中我们可以不借助 JS 库,自己去手写 JS ...
- u-boot向linux内核传递启动参数(详细)
U-BOOT 在启动内核时,会向内核传递一些参数.BootLoader 可以通过两种方法传递参数给内核,一种是旧的参数结构方式(parameter_struct),主要是 2.6 之前的内核使用的方式 ...
- python 网络编程(三)---TCP 服务器端客户端实现
客户端 客户端主要有4个步骤: 1)创建一个socket以连接服务器. socket = socket.socket(family, type),family参数代表地址家族,可为AF_INET(包括 ...
- Java WebService简单使用
一直在写java但从来没有使用webservice,在网上查了下资料写个简单的使用放这里做备份 具体步骤: 1.新建一个java工程在里面写一个类(服务端)如下: package com.webser ...
- 《GettingThingsDone》--GTD学习笔记(三)-GTD的三个关键原则
原则一:养成收集的习惯 1.收集习惯给个人带来的好处 在收集过程中你会出现焦虑和解脱,难以招架和控制良好的情绪. (1)消极情绪的来源 要做的事情总比你能做的事情多,要做的事情太多并不 ...
- leetcode–Binary Tree Maximum Path Sum
1.题目说明 Given a binary tree, find the maximum path sum. The path may start and end at any node in t ...
- 跨平台的游戏客户端Socket封装,调整
原文链接:http://www.cnblogs.com/lancidie/archive/2013/04/13/3019359.html 头文件: #pragma once #ifdef WIN32 ...