package com.tiger.quicknews.activity; import android.graphics.Bitmap; import android.os.Bundle; import android.os.Handler; import android.util.Log; import android.view.Menu; import android.view.View; import android.view.ViewGroup; import android.view.ViewGroup.LayoutParams; import android.view.animation.Animation; import android.view.animation.Animation.AnimationListener; 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.tiger.quicknews.App; import com.tiger.quicknews.R; import com.tiger.quicknews.adapter.DragAdapter; import com.tiger.quicknews.adapter.OtherAdapter; import com.tiger.quicknews.bean.ChannelItem; import com.tiger.quicknews.bean.ChannelManage; import com.tiger.quicknews.wedget.DragGrid; import com.tiger.quicknews.wedget.OtherGridView; import com.umeng.analytics.MobclickAgent; import java.util.ArrayList; /** * 频道管理 */ public class ChannelActivity extends BaseActivity implements OnItemClickListener { public static String TAG = "ChannelActivity"; /** 用户栏目的GRIDVIEW */ private DragGrid userGridView; /** 其它栏目的GRIDVIEW */ private OtherGridView otherGridView; /** 用户栏目对应的适配器,可以拖动 */ DragAdapter userAdapter; /** 其它栏目对应的适配器 */ OtherAdapter otherAdapter; /** 其它栏目列表 */ ArrayList<ChannelItem> otherChannelList = new ArrayList<ChannelItem>(); /** 用户栏目列表 */ ArrayList<ChannelItem> userChannelList = new ArrayList<ChannelItem>(); /** 是否在移动,由于这边是动画结束后才进行的数据更替,设置这个限制为了避免操作太频繁造成的数据错乱。 */ boolean isMove = false; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.channel); try { initView(); initData(); } catch (Exception e) { e.printStackTrace(); } } /** 初始化数据 */ private void initData() { userChannelList = ((ArrayList<ChannelItem>) ChannelManage.getManage( App.getApp().getSQLHelper()).getUserChannel()); otherChannelList = ((ArrayList<ChannelItem>) ChannelManage.getManage( App.getApp().getSQLHelper()).getOtherChannel()); userAdapter = new DragAdapter(this, userChannelList); userGridView.setAdapter(userAdapter); otherAdapter = new OtherAdapter(this, otherChannelList); otherGridView.setAdapter(otherAdapter); // 设置GRIDVIEW的ITEM的点击监听 otherGridView.setOnItemClickListener(this); userGridView.setOnItemClickListener(this); } /** 初始化布局 */ private void initView() { userGridView = (DragGrid) findViewById(R.id.userGridView); otherGridView = (OtherGridView) findViewById(R.id.otherGridView); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } /** GRIDVIEW对应的ITEM点击监听接口 */ @Override public void onItemClick(AdapterView<?> parent, final View view, final int position, long id) { // 如果点击的时候,之前动画还没结束,那么就让点击事件无效 if (isMove) { return; } switch (parent.getId()) { case R.id.userGridView: // position为 0,1 的不可以进行任何操作 if (position != 0 && position != 1) { final ImageView moveImageView = getView(view); if (moveImageView != null) { TextView newTextView = (TextView) view.findViewById(R.id.text_item); final int[] startLocation = new int[2]; newTextView.getLocationInWindow(startLocation); final ChannelItem channel = ((DragAdapter) parent.getAdapter()) .getItem(position);// 获取点击的频道内容 otherAdapter.setVisible(false); // 添加到最后一个 otherAdapter.addItem(channel); new Handler().postDelayed(new Runnable() { @Override public void run() { try { int[] endLocation = new int[2]; // 获取终点的坐标 otherGridView .getChildAt(otherGridView.getLastVisiblePosition()) .getLocationInWindow(endLocation); MoveAnim(moveImageView, startLocation, endLocation, channel, userGridView); userAdapter.setRemove(position); } catch (Exception localException) { } } }, 50L); } } break; case R.id.otherGridView: final ImageView moveImageView = getView(view); if (moveImageView != null) { TextView newTextView = (TextView) view.findViewById(R.id.text_item); final int[] startLocation = new int[2]; newTextView.getLocationInWindow(startLocation); final ChannelItem channel = ((OtherAdapter) parent.getAdapter()) .getItem(position); userAdapter.setVisible(false); // 添加到最后一个 userAdapter.addItem(channel); new Handler().postDelayed(new Runnable() { @Override public void run() { try { int[] endLocation = new int[2]; // 获取终点的坐标 userGridView.getChildAt(userGridView.getLastVisiblePosition()) .getLocationInWindow(endLocation); MoveAnim(moveImageView, startLocation, endLocation, channel, otherGridView); otherAdapter.setRemove(position); } catch (Exception localException) { } } }, 50L); } break; default: break; } } /** * 点击ITEM移动动画 * * @param moveView * @param startLocation * @param endLocation * @param moveChannel * @param clickGridView */ private void MoveAnim(View moveView, int[] startLocation, int[] endLocation, final ChannelItem moveChannel, final GridView clickGridView) { 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);// 动画效果执行完毕后,View对象不保留在终止的位置 moveAnimationSet.addAnimation(moveAnimation); mMoveView.startAnimation(moveAnimationSet); moveAnimationSet.setAnimationListener(new AnimationListener() { @Override public void onAnimationStart(Animation animation) { isMove = true; } @Override public void onAnimationRepeat(Animation animation) { } @Override public void onAnimationEnd(Animation animation) { moveViewGroup.removeView(mMoveView); // instanceof 方法判断2边实例是不是一样,判断点击的是DragGrid还是OtherGridView if (clickGridView instanceof DragGrid) { otherAdapter.setVisible(true); otherAdapter.notifyDataSetChanged(); userAdapter.remove(); } else { userAdapter.setVisible(true); userAdapter.notifyDataSetChanged(); otherAdapter.remove(); } isMove = false; } }); } /** * 获取移动的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( LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); mLayoutParams.leftMargin = x; mLayoutParams.topMargin = y; view.setLayoutParams(mLayoutParams); return view; } /** * 创建移动的ITEM对应的ViewGroup布局容器 */ private ViewGroup getMoveViewGroup() { ViewGroup moveViewGroup = (ViewGroup) getWindow().getDecorView(); LinearLayout moveLinearLayout = new LinearLayout(this); moveLinearLayout.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); moveViewGroup.addView(moveLinearLayout); return moveLinearLayout; } /** * 获取点击的Item的对应View, * * @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; } /** 退出时候保存选择后数据库的设置 */ private void saveChannel() { ChannelManage.getManage(App.getApp().getSQLHelper()).deleteAllChannel(); ChannelManage.getManage(App.getApp().getSQLHelper()).saveUserChannel( userAdapter.getChannnelLst()); ChannelManage.getManage(App.getApp().getSQLHelper()).saveOtherChannel( otherAdapter.getChannnelLst()); } @Override public void onResume() { super.onResume(); MobclickAgent.onResume(this); } @Override public void onPause() { super.onPause(); MobclickAgent.onPause(this); } @Override public void finish() { super.finish(); if (userAdapter.isListChanged()) { MainActivity_.isChange = true; saveChannel(); Log.d(TAG, "数据发生改变"); } } }