Android 频道管理,可拖动item排列,删除,添加
生活随笔
收集整理的這篇文章主要介紹了
Android 频道管理,可拖动item排列,删除,添加
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
樣式效果
? ? ? ? ?
?
1、創建自定義GridView
/*** 作者:created by meixi* 郵箱:15913707499@163.com* 日期:2019/5/31 13*/public class DragGridView extends GridView {/** 點擊時候的X位置 */public int downX;/** 點擊時候的Y位置 */public int downY;/** 點擊時候對應整個界面的X位置 */public int windowX;/** 點擊時候對應整個界面的Y位置 */public int windowY;/** VIEW相對自己的X */private int win_view_x;/**VIEW相對自己的Y*/private int win_view_y;/** 長按時候對應postion */public int dragPosition;/** Up后對應的ITEM的Position */private int dropPosition;/** 開始拖動的ITEM的Position*/private int startPosition;/** item高 */private int itemHeight;/** item寬 */private int itemWidth;/** 拖動的時候對應ITEM的VIEW */private View dragImageView = null;/** 長按的時候ITEM的VIEW*/private ViewGroup dragItemView = null;/** WindowManager管理器 */private WindowManager windowManager = null;/** */private WindowManager.LayoutParams windowParams = null;/** item總量*/private int itemTotalCount;/** 一行的ITEM數量*/private int nColumns = 4;/** 行數 */private int nRows;/** 剩余部分 */private int Remainder;/** 是否在移動 */private boolean isMoving = false;/** */private int holdPosition;/** 拖動的時候放大的倍數 */private double dragScale = 1.2D;/** 震動器 */private Vibrator mVibrator;/** 每個ITEM之間的水平間距 */private int mHorizontalSpacing = 15;/** 每個ITEM之間的豎直間距 */private int mVerticalSpacing = 15;/** 移動時候最后個動畫的ID */private String LastAnimationID;public DragGridView(Context context) {super(context);init(context);}public DragGridView(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);init(context);}public DragGridView(Context context, AttributeSet attrs) {super(context, attrs);init(context);}/*** dip轉為 px*/public int dip2px(Context context, float dipValue) {final float scale = context.getResources().getDisplayMetrics().density;return (int) (dipValue * scale + 0.5f);}public void init(Context context){mVibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);//將布局文件中設置的間距dip轉為pxmHorizontalSpacing = dip2px(context, mHorizontalSpacing);}/** 在ScrollView內,所以要進行計算高度 */@Overridepublic void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,MeasureSpec.AT_MOST);super.onMeasure(widthMeasureSpec, expandSpec);}@Overridepublic boolean dispatchTouchEvent(MotionEvent ev) {if (ev.getAction() == MotionEvent.ACTION_DOWN) {downX = (int) ev.getX();downY = (int) ev.getY();windowX = (int) ev.getX();windowY = (int) ev.getY();setOnItemClickListener(ev);}return super.dispatchTouchEvent(ev);}/** 停止拖動 ,釋放并初始化 */private void stopDrag() {if (dragImageView != null) {windowManager.removeView(dragImageView);dragImageView = null;}}/** 在拖動的情況更新View的位置 */private void onDrag(int x, int y , int rawx , int rawy) {if (dragImageView != null) {windowParams.alpha = 0.6f;windowParams.x = rawx - win_view_x;windowParams.y = rawy - win_view_y;windowManager.updateViewLayout(dragImageView, windowParams);}}/***創建窗口對象、添加我們要移動的View* @param dragBitmap* @param x* @param y*/public void startDrag(Bitmap dragBitmap, int x, int y) {stopDrag();windowParams = new WindowManager.LayoutParams();// 獲取WINDOW界面的//Gravity.TOP|Gravity.LEFT;這個必須加windowParams.gravity = Gravity.TOP | Gravity.LEFT;//得到要移動的View左上角相對于屏幕的坐標windowParams.x = x - win_view_x;windowParams.y = y - win_view_y;//設置拖拽item的寬和高windowParams.width = (int) (dragScale * dragBitmap.getWidth());// 放大dragScale倍,可以設置拖動后的倍數windowParams.height = (int) (dragScale * dragBitmap.getHeight());// 放大dragScale倍,可以設置拖動后的倍數this.windowParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE| WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE| WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON| WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;this.windowParams.format = PixelFormat.TRANSLUCENT;this.windowParams.windowAnimations = 0;ImageView iv = new ImageView(getContext());iv.setImageBitmap(dragBitmap);windowManager = (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE);// "window"windowManager.addView(iv, windowParams);dragImageView = iv;}/** 隱藏 放下 的ITEM*/private void hideDropItem() {((DragAdapter) getAdapter()).setShowDropItem(false);}/** 在松手下放的情況,更新界面 */private void onDrop(int x, int y) {// 根據拖動到的x,y坐標獲取拖動位置下方的ITEM對應的POSTIONint tempPostion = pointToPosition(x, y); // if (tempPostion != AdapterView.INVALID_POSITION) {dropPosition = tempPostion;DragAdapter mDragAdapter = (DragAdapter) getAdapter();//顯示剛拖動的ITEMmDragAdapter.setShowDropItem(true);//刷新適配器,讓對應的ITEM顯示mDragAdapter.notifyDataSetChanged(); // }}/*** 長按點擊監聽* @param ev*/public void setOnItemClickListener(final MotionEvent ev) {setOnItemLongClickListener(new OnItemLongClickListener() {@Overridepublic boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {int x = (int) ev.getX();// 長按事件的X位置int y = (int) ev.getY();// 長按事件的y位置startPosition = position;// 第一次點擊的postiondragPosition = position;if (startPosition <= 1) {//前2個默認不點擊、可以設置return false;}ViewGroup dragViewGroup = (ViewGroup) getChildAt(dragPosition - getFirstVisiblePosition());TextView dragTextView = (TextView)dragViewGroup.findViewById(R.id.text_item);dragTextView.setSelected(true);dragTextView.setEnabled(false);itemHeight = dragViewGroup.getHeight();itemWidth = dragViewGroup.getWidth();itemTotalCount = DragGridView.this.getCount();// 如果特殊的這個不等于拖動的那個,并且不等于-1if (dragPosition != AdapterView.INVALID_POSITION) {// 釋放的資源使用的繪圖緩存。如果你調用buildDrawingCache()手動沒有調用setDrawingCacheEnabled(真正的),你應該清理緩存使用這種方法。win_view_x = windowX - dragViewGroup.getLeft();//VIEW相對自己的X,半斤win_view_y = windowY - dragViewGroup.getTop();//VIEW相對自己的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;return true;}return false;}});}@Overridepublic boolean onTouchEvent(MotionEvent ev) {if (dragImageView != null && dragPosition != AdapterView.INVALID_POSITION) {// 移動時候的對應x,y位置int x = (int) ev.getX();int y = (int) ev.getY();switch (ev.getAction()) {case MotionEvent.ACTION_DOWN:downX = (int) ev.getX();windowX = (int) ev.getX();downY = (int) ev.getY();windowY = (int) ev.getY();break;case MotionEvent.ACTION_MOVE:onDrag(x, y ,(int) ev.getRawX() , (int) ev.getRawY());if (!isMoving){OnMove(x, y);}if (pointToPosition(x, y) != AdapterView.INVALID_POSITION){break;}break;case MotionEvent.ACTION_UP:stopDrag();onDrop(x, y);requestDisallowInterceptTouchEvent(false);break;default:break;}}return super.onTouchEvent(ev);}/** 移動的時候觸發,移動所有改變的Item*/public void OnMove(int x, int y) {// 拖動的VIEW下方的POSTIONint dPosition = pointToPosition(x, y);// 判斷下方的POSTION是否是最開始2個不能拖動的if (dPosition > 1) {if ((dPosition == -1) || (dPosition == dragPosition)){return;}dropPosition = dPosition;if (dragPosition != startPosition){dragPosition = startPosition;}int movecount;//拖動的=開始拖的,并且 拖動的 不等于放下的if ((dragPosition == startPosition) || (dragPosition != dropPosition)){//移需要移動的動ITEM數量movecount = dropPosition - dragPosition;}else{//移需要移動的動ITEM數量為0movecount = 0;}if(movecount == 0){return;}int movecount_abs = Math.abs(movecount);if (dPosition != dragPosition) {//dragGroup設置為不可見ViewGroup dragGroup = (ViewGroup) getChildAt(dragPosition);dragGroup.setVisibility(View.INVISIBLE);float to_x = 1;//移動的X偏移量float to_y;// 移動的Y偏移量//x_vlaue移動的距離百分比(相對于自己長度的百分比)float x_vlaue = ((float) mHorizontalSpacing / (float) itemWidth) + 1.0f;//y_vlaue移動的距離百分比(相對于自己寬度的百分比)float y_vlaue = ((float) mVerticalSpacing / (float) itemHeight) + 1.0f;Log.d("x_vlaue", "x_vlaue = " + x_vlaue);for (int i = 0; i < movecount_abs; i++) {to_x = x_vlaue;to_y = y_vlaue;//向右if (movecount > 0) {// 判斷是不是同一行的holdPosition = dragPosition + i + 1;if (dragPosition / nColumns == holdPosition / nColumns) {to_x = - x_vlaue;to_y = 0;} else if (holdPosition % 4 == 0) {to_x = 3 * x_vlaue;to_y = - y_vlaue;} else {to_x = - x_vlaue;to_y = 0;}}else{//向左,下移到上,右移到左holdPosition = dragPosition - i - 1;if (dragPosition / nColumns == holdPosition / nColumns) {to_x = x_vlaue;to_y = 0;} else if((holdPosition + 1) % 4 == 0){to_x = -3 * x_vlaue;to_y = y_vlaue;}else{to_x = x_vlaue;to_y = 0;}}ViewGroup moveViewGroup = (ViewGroup) getChildAt(holdPosition);Animation moveAnimation = getMoveAnimation(to_x, to_y);moveViewGroup.startAnimation(moveAnimation);//如果是最后一個移動的,那么設置他的最后個動畫ID為LastAnimationIDif (holdPosition == dropPosition) {LastAnimationID = moveAnimation.toString();}moveAnimation.setAnimationListener(new Animation.AnimationListener() {@Overridepublic void onAnimationStart(Animation animation) {isMoving = true;}@Overridepublic void onAnimationRepeat(Animation animation) {}@Overridepublic void onAnimationEnd(Animation animation) {// 如果為最后個動畫結束,那執行下面的方法if (animation.toString().equalsIgnoreCase(LastAnimationID)) {DragAdapter mDragAdapter = (DragAdapter) getAdapter();mDragAdapter.exchange(startPosition,dropPosition);startPosition = dropPosition;dragPosition = dropPosition;isMoving = false;}}});}}}}/** 獲取移動的動畫 */public Animation getMoveAnimation(float toXValue, float toYValue) {TranslateAnimation mTranslateAnimation = new TranslateAnimation(Animation.RELATIVE_TO_SELF, 0.0F,Animation.RELATIVE_TO_SELF,toXValue,Animation.RELATIVE_TO_SELF, 0.0F,Animation.RELATIVE_TO_SELF, toYValue);// 當前位置移動到指定位置mTranslateAnimation.setFillAfter(true);// 設置一個動畫效果執行完畢后,View對象保留在終止的位置。mTranslateAnimation.setDuration(300L);return mTranslateAnimation;} }2、activity實現
public class MainActivity extends AppCompatActivity implements AdapterView.OnItemClickListener {private MyGridView mOtherGv;private DragGridView mUserGv;private List<String> mUserList = new ArrayList<>();private List<String> mOtherList = new ArrayList<>();private OtherAdapter mOtherAdapter;private DragAdapter mUserAdapter;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initView();}public void initView() {mUserGv = (DragGridView) findViewById(R.id.userGridView);mOtherGv = (MyGridView) findViewById(R.id.otherGridView);mUserList.add("推薦");mUserList.add("熱點");mUserList.add("上海");mUserList.add("時尚");mUserList.add("科技");mUserList.add("體育");mUserList.add("軍事");mUserList.add("財經");mUserList.add("網絡");mOtherList.add("汽車");mOtherList.add("房產");mOtherList.add("社會");mOtherList.add("情感");mOtherList.add("女人");mOtherList.add("旅游");mOtherList.add("健康");mOtherList.add("美女");mOtherList.add("游戲");mOtherList.add("數碼");mOtherList.add("娛樂");mOtherList.add("探索");mUserAdapter = new DragAdapter(this, mUserList,true);mOtherAdapter = new OtherAdapter(this, mOtherList,false);mUserGv.setAdapter(mUserAdapter);mOtherGv.setAdapter(mOtherAdapter);mUserGv.setOnItemClickListener(this);mOtherGv.setOnItemClickListener(this);}demo云盤鏈接:https://pan.baidu.com/s/1iKAHJ3yrUeece1Yi1dsSEw
云盤密碼交流:QQ1085220040
demo鏈接:https://download.csdn.net/download/meixi_android/11224016
?
總結
以上是生活随笔為你收集整理的Android 频道管理,可拖动item排列,删除,添加的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HenCoder Plus L02——
- 下一篇: BaaS后端即服务 - 概念篇