长按拖动

来源:互联网 发布:商情数据 编辑:程序博客网 时间:2024/05/01 00:15

添加长按拖动事件

mChannelGrid.setOnItemLongClickListener(new OnItemLongClickListener()
        {
            @Override
            public boolean onItemLongClick(AdapterView<?> arg0, View arg1, int arg2, long arg3)
            {
                ClipData.Item item = new ClipData.Item(String.valueOf(arg2));
                ClipData dragData = new ClipData(String.valueOf(arg2), new String[] {"text/plain"}, item);
                ImageView iv = (ImageView)((LinearLayout)mChannelGrid.getChildAt(arg2)).getChildAt(1);
                iv.setDrawingCacheEnabled(true);
                iv.buildDrawingCache();
                DragShadowBuilder myShadow = new MyDragShadowBuilder(iv);
                arg1.startDrag(dragData, // the data to be dragged
                    myShadow, // the drag shadow builder
                    null, // no need to use local data
                    0 // flags (not currently used, set to 0)
                );
                return true;
            }
        });

 

 

public class MainActivity extends Activity
{
   
    GridView mGrid;
   
    private List<infoVo> mApps;
   
   
    int movePosition=-1;
   
    private AppsAdapter mAppsAdapter;
   
    boolean b=false;
   
    private Handler mHandler=new Handler(){

        @Override
        public void handleMessage(Message msg)
        {
            Log.e("loadAppsss", "apps size="+mApps.size()+"--what="+msg.what+"movePosition= "+movePosition);
            //这里更新数据
            mApps.remove(movePosition);
            mAppsAdapter.notifyDataSetChanged();
            super.handleMessage(msg);
        }
       
    };
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
       
        loadApps(); // do this in onresume?
       
        setContentView(R.layout.activity_main);
        mGrid = (GridView)findViewById(R.id.gridview);
        mAppsAdapter=new AppsAdapter();
        mGrid.setAdapter(mAppsAdapter);
       
        mGrid.setOnItemLongClickListener(new OnItemLongClickListener()
        {
           
            @Override
            public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id)
            {
                b=true;
                movePosition=position;
                ClipData.Item item = new ClipData.Item(String.valueOf(position));
                ClipData dragData = new ClipData(String.valueOf(position), new String[] {"text/plain"}, item);
                ImageView iv = (ImageView)mGrid.getChildAt(position);
                iv.setDrawingCacheEnabled(true);
                iv.buildDrawingCache();
                DragShadowBuilder myShadow = new DragShadowBuilder(iv);
                view.startDrag(dragData, // the data to be dragged
                    myShadow, // the drag shadow builder
                    null, // no need to use local data
                    0 // flags (not currently used, set to 0)
                );
                return true;
            }
        });
    }
   
    private void loadApps()
    {
        Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
        mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
       
        infoVo appdinfo;
        mApps=new ArrayList<MainActivity.infoVo>();
        List<ResolveInfo> mmm=getPackageManager().queryIntentActivities(mainIntent, 0);
        for (ResolveInfo r : mmm)
        {
            appdinfo=new infoVo();
            appdinfo.setApp(r);
            mApps.add(appdinfo);
        }
       
        Log.e("loadApps", "apps size="+mApps.size());
       
    }
   
    class infoVo
    {
        int type=0;
       
        ResolveInfo app;

        public int getType()
        {
            return type;
        }

        public void setType(int type)
        {
            this.type = type;
        }

        public ResolveInfo getApp()
        {
            return app;
        }

        public void setApp(ResolveInfo app)
        {
            this.app = app;
        }
       
       
    }
   
    public class AppsAdapter extends BaseAdapter
    {
        public AppsAdapter()
        {
        }
       
        public View getView(final int position, View convertView, ViewGroup parent)
        {
            ImageView i;
            i = new ImageView(MainActivity.this);
            i.setScaleType(ImageView.ScaleType.FIT_CENTER);
            i.setLayoutParams(new GridView.LayoutParams(71, 71));
           
            infoVo appdinfo = mApps.get(position);
            ResolveInfo info = appdinfo.getApp();
            int type = appdinfo.getType();
            if (type == 0)
            {
                i.setImageDrawable(info.activityInfo.loadIcon(getPackageManager()));
            }
            else if (type == 1)
            {
                //换成文件夹图标
                i.setImageDrawable(getResources().getDrawable(R.drawable.commend_icon_pressed));
            }
            else
            {
                return null;
            }
            MyOnDragListener m=new MyOnDragListener(position);
            m.setDraglistenerEnter(new DraglistenerEnter()
            {
               
                @Override
                public void itemCompany(int tag)
                {
                    b = false;
                    //这里进行文件夹合并,生成新的图标
                    mApps.get(tag).setType(1);
                    mHandler.sendEmptyMessage(tag);
                }
            });
            i.setOnDragListener(m);
            return i;
        }
        public final int getCount()
        {
            return mApps.size();
        }
       
        public final Object getItem(int position)
        {
            return mApps.get(position);
        }
       
        public final long getItemId(int position)
        {
            return position;
        }
    }

 

 

这个是到特定的地点的时候触发,把拖动的图标显示在这里

DragEventListener mDragEventListener = new DragEventListener(i, mContext, .this);
            logoImageList[i].setOnDragListener(mDragEventListener);

 

 重写监听事件,触发长按拖动松开等效果

class MyOnDragListenerimplements OnDragListener

 

public int tag = -1;
   
    boolean b=false;
   
    public MyOnDragListener(int tag)
    {
        this.tag=tag;
    }
   
    @Override
    public boolean onDrag(View v, DragEvent event)
    {
        Log.e("onDrag", "getAction="+event.getAction()+"--Tag="+tag);
        switch (event.getAction())
        {
            case DragEvent.ACTION_DRAG_STARTED:
                b=true;
                break;
               
            case DragEvent.ACTION_DRAG_LOCATION:
                //TODO 当放在上面的时候背景图标改变
                break;
            case DragEvent.ACTION_DROP:
                if (mdraglistenerEnter != null&&b)
                {
                    b=false;
                    mdraglistenerEnter.itemCompany(tag);
                }
                break;
            case DragEvent.ACTION_DRAG_ENDED:
               
                break;
            default:
                break;
        }
       
        return true;
    }
   
    private DraglistenerEnter mdraglistenerEnter;
   
    public void setDraglistenerEnter(DraglistenerEnter l)
    {
        mdraglistenerEnter = l;
    }
   
    interface DraglistenerEnter
    {
        void itemCompany(int tag);
    } 

 

原创粉丝点击