Android 仿今日頭條頻道管理(上)(GridView之間Item的移動和拖拽)
阿新 • • 發佈:2019-01-19
前言
經常逛今日頭條、發現它的頻道管理功能做的特別贊,互動體驗非常好、如圖:
它是2個gridview組成、2個gridview之間的Item是可以相互更換的、而且我的頻道的Item是可以拖拽進行排序。仔細觀察、今日頭條有些細節做的的非常好,當一個gridview1的item移動到另一個gridview2時、gridview1的item不會立即消失、而是有一個沒有內容的背景框、等item移動gridview2操作完畢才會消失、並且gridview2在gridview1的Item到達之前也有一個沒有內容的背景框,等到達後覆蓋。給使用者一個很強的互動體驗,很贊。而且在item拖拽移動排序時、拖拽的item會變大變色、效果很贊,體驗極好。感興趣的話可以下一個今日頭條的客戶端看看。當看到這麼讚的互動體驗,我就想看看是怎麼實現的,這篇部落格先講2個Gridview之間item的移動,下一篇在帶來gridview的拖拽排序。
實現思路
要實現2個gridview之間的Item相互移動:
1、首先我們獲取我們點選的位置、處於gridview哪個位置
2、獲取位置後、我們就能拿到這個Item的View,我們獲取item繪製快取的Bitmap物件。
3、將Bitmap設定的一個Imageview上,然後將這個ImageView放到一個容器中去進行移動操作,這樣可能有人有疑問,為什麼不直接把item放到容器中去呢,是因為item已經有自己的父容器gridview,所以我們new一個Imageview來代替item
4、然後我們將imageview移動到另一個gridview的最後一個位置。
5、最後重新整理2個gridview的檢視、就能實現我們所見的效果。
實現程式碼
主程式程式碼:
- package com.test.drag;
- import android.graphics.Bitmap;
- import android.os.Bundle;
- import android.os.Handler;
- import android.support.v7.app.AppCompatActivity;
- import android.view.View;
-
import android.view.ViewGroup;
- import android.view.animation.Animation;
- import android.view.animation.AnimationSet;
- import android.view.animation.TranslateAnimation;
- import android.widget.AdapterView;
- import android.widget.AdapterView.OnItemClickListener;
- import android.widget.GridView;
- import android.widget.ImageView;
- import android.widget.LinearLayout;
- import android.widget.TextView;
- import com.test.drag.view.MyGridView;
- import java.util.ArrayList;
- import java.util.List;
- public class MainActivity extends AppCompatActivity implements OnItemClickListener {
- private MyGridView mUserGv, mOtherGv;
- private List<String>mUserList = new ArrayList<>();
- private List<String>mOtherList = new ArrayList<>();
- private OtherAdapter mUserAdapter, mOtherAdapter;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- initView();
- }
- public void initView() {
- mUserGv = (MyGridView) 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 OtherAdapter(this, mUserList,true);
- mOtherAdapter = new OtherAdapter(this, mOtherList,false);
- mUserGv.setAdapter(mUserAdapter);
- mOtherGv.setAdapter(mOtherAdapter);
- mUserGv.setOnItemClickListener(this);
- mOtherGv.setOnItemClickListener(this);
- }
- /**
- *獲取點選的Item的對應View,
- *因為點選的Item已經有了自己歸屬的父容器MyGridView,所有我們要是有一個ImageView來代替Item移動
- * @param view
- * @return
- */
- private ImageView getView(View view) {
- view.destroyDrawingCache();
- view.setDrawingCacheEnabled(true);
- Bitmap cache = Bitmap.createBitmap(view.getDrawingCache());
- view.setDrawingCacheEnabled(false);
- ImageView iv = new ImageView(this);
- iv.setImageBitmap(cache);
- return iv;
- }
- /**
- * 獲取移動的VIEW,放入對應ViewGroup佈局容器
- * @param viewGroup
- * @param view
- * @param initLocation
- * @return
- */
- private View getMoveView(ViewGroup viewGroup, View view, int[] initLocation) {
- int x = initLocation[0];
- int y = initLocation[1];
- viewGroup.addView(view);
- LinearLayout.LayoutParams mLayoutParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
- mLayoutParams.leftMargin = x;
- mLayoutParams.topMargin = y;
- view.setLayoutParams(mLayoutParams);
- return view;
- }
- /**
- * 建立移動的ITEM對應的ViewGroup佈局容器
- * 用於存放我們移動的View
- */
- private ViewGroup getMoveViewGroup() {
- //window中最頂層的view
- ViewGroup moveViewGroup = (ViewGroup) getWindow().getDecorView();
- LinearLayout moveLinearLayout = new LinearLayout(this);
- moveLinearLayout.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
- moveViewGroup.addView(moveLinearLayout);
- return moveLinearLayout;
- }
- /**
- * 點選ITEM移動動畫
- *
- * @param moveView
- * @param startLocation
- * @param endLocation
- * @param moveChannel
- * @param clickGridView
- */
- private void MoveAnim(View moveView, int[] startLocation, int[] endLocation, final String moveChannel,
- final GridView clickGridView, final boolean isUser) {
- int[] initLocation = new int[2];
- //獲取傳遞過來的VIEW的座標
- moveView.getLocationInWindow(initLocation);
- //得到要移動的VIEW,並放入對應的容器中
- final ViewGroup moveViewGroup = getMoveViewGroup();
- final View mMoveView = getMoveView(moveViewGroup, moveView, initLocation);
- //建立移動動畫
- TranslateAnimation moveAnimation = new TranslateAnimation(
- startLocation[0], endLocation[0], startLocation[1],
- endLocation[1]);
- moveAnimation.setDuration(300L);//動畫時間
- //動畫配置
- AnimationSet moveAnimationSet = new AnimationSet(true);
- moveAnimationSet.setFillAfter(false);//動畫效果執行