接上一篇博客:http://blog.csdn.net/xiangzhihong8/article/details/51262939
这部分主要是实现频道管理页面,先上两张图片,
自定义拖动控件,onInterceptTouchEvent事件拦截,dispatchTouchEvent事件分发,onTouchEvent(对于View而言)
想要具体了解android的事件拦截机制,请访问下面的地址:http://blog.csdn.net/xiangzhihong8/article/details/51317291
接下来说说我们如何实现头条的拖动效果吧,
首先,对于我们来说需要获取控件的位置,控件在屏幕的位置
downX = (int) ev.getX(); downY = (int) ev.getY(); windowX = (int) ev.getX(); windowY = (int) ev.getY();
然后长按的时候,拖动控件,实际是通过计算,引入相应的布局,具体看代码
{ setOnItemLongClickListener(new OnItemLongClickListener() { @Override public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { int x = (int) ev.getX();// 长安事件的X位置 int y = (int) ev.getY();// 长安事件的y位置 startPosition = position;// 第一次点击的postion dragPosition = position; if (startPosition < 1) { return false; } ViewGroup dragViewGroup = (ViewGroup) getChildAt(dragPosition - getFirstVisiblePosition()); TextView dragTextView = (TextView)dragViewGroup.findViewById(R.id.item_channel_name); dragTextView.setSelected(true); dragTextView.setEnabled(false); itemHeight = dragViewGroup.getHeight(); itemWidth = dragViewGroup.getWidth(); itemTotalCount = DragGridView.this.getCount(); int row = itemTotalCount / nColumns;// 算出行数 Remainder = (itemTotalCount % nColumns);// 算出最后一行多余的数量 if (Remainder != 0) { nRows = row + 1; } else { nRows = row; } // 如果特殊的这个不等于拖动的那个,并且不等于-1 if (dragPosition != AdapterView.INVALID_POSITION) { // 释放的资源使用的绘图缓存。如果你调用buildDrawingCache()手动没有调用setDrawingCacheEnabled(真正的),你应该清理缓存使用这种方法。 win_view_x = windowX - dragViewGroup.getLeft();//VIEW相对自己的X,半斤 win_view_y = windowY - dragViewGroup.getTop();//VIEW相对自己的y,半斤 dragOffsetX = (int) (ev.getRawX() - x);//手指在屏幕的上X位置-手指在控件中的位置就是距离最左边的距离 dragOffsetY = (int) (ev.getRawY() - y);//手指在屏幕的上y位置-手指在控件中的位置就是距离最上边的距离 dragItemView = dragViewGroup; dragViewGroup.destroyDrawingCache(); dragViewGroup.setDrawingCacheEnabled(true); Bitmap dragBitmap = Bitmap.createBitmap(dragViewGroup.getDrawingCache()); mVibrator.vibrate(50);//设置震动时间 startDrag(dragBitmap, (int)ev.getRawX(), (int)ev.getRawY()); hideDropItem(); dragViewGroup.setVisibility(View.INVISIBLE); isMoving = false; requestDisallowInterceptTouchEvent(true); return true; } return false; } }); }
我这里就不贴代码了,然后我们通过中间数据库操作整个app的逻辑流程流转,具体代码请到下面地址下载:
https://github.com/xiangzhihong/topNews
时间: 2024-09-18 00:44:43