80,362
社区成员
发帖
与我相关
我的任务
分享
package com.example.choutituodong;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.PixelFormat;
import android.graphics.Rect;
import android.os.Handler;
import android.os.Vibrator;
import android.util.AttributeSet;
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 mydragview extends GridView{
private long dragResponseMS = 500;
private boolean isDrag = false;
private int mDownX;
private int mDownY;
private int moveX;
private int moveY;
public int mDragPosition;
private View mStartDragItemView = null;
private ImageView mDragImageView;
private Vibrator mVibrator;
private WindowManager mWindowManager;
private WindowManager.LayoutParams mWindowLayoutParams;
private Bitmap mDragBitmap;
private int mPoint2ItemTop ;
private int mPoint2ItemLeft;
private int mOffset2Top;
private int mOffset2Left;
private int mStatusHeight;
private OnChanageListener onChanageListener;
public mydragview(Context context) {
this(context, null);
}
public mydragview(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public mydragview(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
mVibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);
mWindowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
mStatusHeight = getStatusHeight(context); //
}
private Handler mHandler = new Handler();
//判断是否为长按某键,产生震动效果,隐藏当前item,调用生成imageview函数×
private Runnable mLongClickRunnable = new Runnable() {
@Override
public void run() {
isDrag = true; //���ÿ����ק
// mVibrator.vibrate(50);
mStartDragItemView.setVisibility(View.INVISIBLE);//���ظ�item
createDragImage(mDragBitmap, mDownX, mDownY);
}
};
public void setOnChangeListener(OnChanageListener onChanageListener){
this.onChanageListener = onChanageListener;
}
//按的时间超过1000毫秒则产生回应
public void setDragResponseMS(long dragResponseMS) {
this.dragResponseMS = dragResponseMS;
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
switch(ev.getAction()){
case MotionEvent.ACTION_DOWN:
//判断是否为长嗯,即是否满足回应时间
mHandler.postDelayed(mLongClickRunnable, dragResponseMS);
mDownX = (int) ev.getX();
mDownY = (int) ev.getY();
//获取当前按住的item位置
mDragPosition = pointToPosition(mDownX, mDownY);
if(mDragPosition == AdapterView.INVALID_POSITION){
return super.dispatchTouchEvent(ev);
}
mStartDragItemView = getChildAt(mDragPosition - getFirstVisiblePosition());
//获取手指距离item边缘的位置
mPoint2ItemTop = mDownY - mStartDragItemView.getTop();
mPoint2ItemLeft = mDownX - mStartDragItemView.getLeft();
//获取gridview距离屏幕边缘的位置
mOffset2Top = (int) (ev.getRawY() - mDownY);
mOffset2Left = (int) (ev.getRawX() - mDownX);
//开启绘图缓存
mStartDragItemView.setDrawingCacheEnabled(true);
mDragBitmap = Bitmap.createBitmap(mStartDragItemView.getDrawingCache());
mStartDragItemView.destroyDrawingCache();
break;
case MotionEvent.ACTION_MOVE:
//获取移动位置
int moveX = (int)ev.getX();
int moveY = (int) ev.getY();
//如果手指位置一直没有移出item边界则视为一直按住该图标
if(!isTouchInItem(mStartDragItemView, moveX, moveY)){
mHandler.removeCallbacks(mLongClickRunnable);
}
break;
case MotionEvent.ACTION_UP:
//手指离开屏幕,长按事件结束
mHandler.removeCallbacks(mLongClickRunnable);
break;
}
return super.dispatchTouchEvent(ev);
}
//判断手指位置是否在该item内
private boolean isTouchInItem(View dragView, int x, int y){
//获取item距离gridview边缘距离
int leftOffset = dragView.getLeft();
int topOffset = dragView.getTop();
if(x < leftOffset || x > leftOffset + dragView.getWidth()){
return false;
}
if(y < topOffset || y > topOffset + dragView.getHeight()){
return false;
}
//如果现在手指位置在item内则返回true
return true;
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
//判断是否满足拖拽的条件
if(isDrag && mDragImageView != null){
switch(ev.getAction()){
case MotionEvent.ACTION_MOVE:
moveX = (int) ev.getX();
moveY = (int) ev.getY();
//获取现在手指位置调用ondragitem函数,即移动函数
onDragItem(moveX, moveY);
break;
case MotionEvent.ACTION_UP:
//手指离开屏幕,调用函数删除生成镜像,并将拖拽条件置为否
onStopDrag();
isDrag = false;
break;
}
return true;
}
return super.onTouchEvent(ev);
}
//生成该item的可以拖动的image镜像,downX,downy为相对于父控件的位置
private void createDragImage(Bitmap bitmap, int downX , int downY){
mWindowLayoutParams = new WindowManager.LayoutParams();
mWindowLayoutParams.format = PixelFormat.TRANSLUCENT;
mWindowLayoutParams.gravity = Gravity.TOP | Gravity.LEFT;
mWindowLayoutParams.x = downX - mPoint2ItemLeft + mOffset2Left;
mWindowLayoutParams.y = downY - mPoint2ItemTop + mOffset2Top - mStatusHeight;
mWindowLayoutParams.alpha = 0.55f;
mWindowLayoutParams.width = WindowManager.LayoutParams.WRAP_CONTENT;
mWindowLayoutParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
mWindowLayoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE ;
mDragImageView = new ImageView(getContext());
mDragImageView.setImageBitmap(bitmap);
mWindowManager.addView(mDragImageView, mWindowLayoutParams);
}
//如果该imageview还存在则将该image移除,并将其标志位置为空
private void removeDragImage(){
if(mDragImageView != null){
mWindowManager.removeView(mDragImageView);
mDragImageView = null;
}
}
private void onDragItem(int moveX, int moveY){
//计算手指位置相对于屏幕的距离,更新imageview的位置
mWindowLayoutParams.x = moveX - mPoint2ItemLeft + mOffset2Left;
mWindowLayoutParams.y = moveY - mPoint2ItemTop + mOffset2Top - mStatusHeight;
if(mWindowLayoutParams.y<400){
onChanageListener.addview(mDragPosition);
mWindowManager.updateViewLayout(mDragImageView, mWindowLayoutParams);
}
else{
//调用itemswap函数
mWindowManager.updateViewLayout(mDragImageView, mWindowLayoutParams);
onSwapItem(moveX, moveY);
}
}
private void onSwapItem(int moveX, int moveY){
int tempPosition = pointToPosition(moveX, moveY);
//如果手指移动超过item范围(即不是初始item)则将当前位置item隐藏,并显示初始item在当前位置
if(tempPosition != mDragPosition && tempPosition != AdapterView.INVALID_POSITION){
getChildAt(tempPosition - getFirstVisiblePosition()).setVisibility(View.INVISIBLE);//将image拖动到当前位置的item隐藏
getChildAt(mDragPosition - getFirstVisiblePosition()).setVisibility(View.VISIBLE);//将初始item在当前位置显示
if(onChanageListener != null){
onChanageListener.onChange(mDragPosition, tempPosition);
}
mDragPosition = tempPosition;
}
}
//将所有开始隐藏的其他item显示出来,并移除生成的镜像
private void onStopDrag(){
getChildAt(mDragPosition - getFirstVisiblePosition()).setVisibility(View.VISIBLE);
removeDragImage();
}
//获取状态栏高度
private static int getStatusHeight(Context context){
int statusHeight = 0;
Rect localRect = new Rect();
((Activity) context).getWindow().getDecorView().getWindowVisibleDisplayFrame(localRect);
statusHeight = localRect.top;
if (0 == statusHeight){
Class<?> localClass;
try {
localClass = Class.forName("com.android.internal.R$dimen");
Object localObject = localClass.newInstance();
int i5 = Integer.parseInt(localClass.getField("status_bar_height").get(localObject).toString());
statusHeight = context.getResources().getDimensionPixelSize(i5);
} catch (Exception e) {
e.printStackTrace();
}
}
System.out.println(statusHeight);
return statusHeight;
}
//设置数据交换的方法from为move开始位置,to为目标位置,交换算法在主类中实现
public interface OnChanageListener{
public void onChange(int form, int to);
public void addview(int from);
}
}
package com.example.choutituodong;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import com.example.choutituodong.mydragview.OnChanageListener;
//import com.example.choutituodong.mydragview1.OnChanageListener1;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.app.Activity;
//import android.content.ComponentName;
import android.content.Intent;
import android.content.pm.ResolveInfo;
//import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.SimpleAdapter;
import android.widget.SlidingDrawer;
import android.util.Log;
//import android.widget.AdapterView.OnItemClickListener;
public class MainActivity extends Activity {
private SlidingDrawer sd;
private ImageView iv;
private List<ResolveInfo> apps;
private List<HashMap<String, Object>> dataSourceList = new ArrayList<HashMap<String, Object>>();
private List<HashMap<String, Object>> dataSourceList1 = new ArrayList<HashMap<String, Object>>();
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.slidingdrawer);
final SimpleAdapter mSimpleAdapter = new SimpleAdapter(this, dataSourceList,
R.layout.grid_item, new String[] { "item_image", "item_text" },
new int[] { R.id.item_image, R.id.item_text });
final SimpleAdapter mSimpleAdapter1 = new SimpleAdapter(this, dataSourceList1,
R.layout.grid_item, new String[] { "item_image", "item_text" },
new int[] { R.id.item_image, R.id.item_text });
sd = (SlidingDrawer) findViewById(R.id.sliding);
iv = (ImageView) findViewById(R.id.imageViewIcon);
mydragview mDragGridView = (mydragview) findViewById(R.id.dragGridView1);
for (int i = 0; i < 12; i++) {
HashMap<String, Object> itemHashMap = new HashMap<String, Object>();
itemHashMap.put("item_image",R.drawable.ic_launcher);
itemHashMap.put("item_text", "boy" + Integer.toString(i));
dataSourceList.add(itemHashMap);
}
mDragGridView.setAdapter(mSimpleAdapter);
mDragGridView.setOnChangeListener(new OnChanageListener() {
@Override
//数据交换的具体实现与冒泡类似,让from位置的item依次与其后边的item交换直至到to位置
public void onChange(int from, int to) {
HashMap<String, Object> temp = dataSourceList.get(from);
if(from < to){
for(int i=from; i<to; i++){
Collections.swap(dataSourceList, i, i+1);
}
}else if(from > to){
for(int i=from; i>to; i--){
Collections.swap(dataSourceList, i, i-1);
}
}
dataSourceList.set(to, temp);
mSimpleAdapter.notifyDataSetChanged();
}
public void addview(int from){
// HashMap<String, Object> temp = dataSourceList1.get(from);
// dataSourceList.add(temp);
// dataSourceList1.remove(dataSourceList1.get(from));
int a;
a= dataSourceList.size();
System.out.print(a);
}
});
// loadApps();
mydragview gv = (mydragview) findViewById(R.id.dragGridView);
for (int i = 0; i < 15; i++) {
HashMap<String, Object> itemHashMap = new HashMap<String, Object>();
itemHashMap.put("item_image",R.drawable.com_tencent_open_notice_msg_icon_big);
itemHashMap.put("item_text", "girl" + Integer.toString(i));
dataSourceList1.add(itemHashMap);
}
// gv.setAdapter(new GridAdapter());
gv.setAdapter(mSimpleAdapter1);
gv.setOnChangeListener(new OnChanageListener() {
@Override
//数据交换的具体实现与冒泡类似,让from位置的item依次与其后边的item交换直至到to位置
public void onChange(int from, int to) {
HashMap<String, Object> temp = dataSourceList1.get(from);
if(from < to){
for(int i=from; i<to; i++){
Collections.swap(dataSourceList1, i, i+1);
}
}else if(from > to){
for(int i=from; i>to; i--){
Collections.swap(dataSourceList1, i, i-1);
}
}
dataSourceList1.set(to, temp);
mSimpleAdapter1.notifyDataSetChanged();
}
public void addview(int from){
HashMap<String, Object> temp = new HashMap<String, Object>();
temp = dataSourceList1.get(from);
dataSourceList.add(temp);
// dataSourceList1.remove(dataSourceList1.get(from));
return;
}
});
sd.setOnDrawerOpenListener(new SlidingDrawer.OnDrawerOpenListener()// 开抽屉
{
@Override
public void onDrawerOpened() {
iv.setImageResource(R.drawable.c);// 响应开抽屉事件
}
});
sd.setOnDrawerCloseListener(new SlidingDrawer.OnDrawerCloseListener() {
@Override
public void onDrawerClosed() {
iv.setImageResource(R.drawable.c);// 响应关抽屉事件
}
});
}
/*
private void loadApps() {
Intent intent = new Intent(Intent.ACTION_MAIN, null);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
apps = getPackageManager().queryIntentActivities(intent, 0);
}
public class GridAdapter extends BaseAdapter {
public GridAdapter() {
}
public int getCount() {
// TODO Auto-generated method stub
return apps.size();
}
public Object getItem(int position) {
// TODO Auto-generated method stub
return apps.get(position);
}
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
ImageView imageView = null;
if (convertView == null) {
imageView = new ImageView(MainActivity.this);
imageView.setScaleType(ImageView.ScaleType.FIT_CENTER);
imageView.setLayoutParams(new GridView.LayoutParams(50, 50));
} else {
imageView = (ImageView) convertView;
}
ResolveInfo ri = apps.get(position);
imageView.setImageDrawable(ri.activityInfo
.loadIcon(getPackageManager()));
return imageView;
}
}*/
}