package com.fruit.launcher;
import com.fruit.launcher.setting.SettingUtils;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.AnimationUtils;
import android.widget.ImageView;
import android.widget.Toast;
public class ThumbnailWorkspace extends ViewGroup {
private static final int ANIMATE_DURATION = 600;
private static final String TAG = "ThumbnailWorkspace";
private static final int ROW_NUM = 3;
private static final int COL_NUM = 3;
private static final int MAX_COUNT = ROW_NUM * COL_NUM;
private Context mContext;
private LayoutInflater mInflater;
private Launcher mLauncher;
private Workspace mWorkspace;
private boolean mIsVisible;
private View mAddScreen;
private int mWidthStartPadding;
private int mWidthEndPadding;
private int mHeightStartPadding;
private int mHeightEndPadding;
private int mThumbWidth;
private int mThumbHeight;
private int mDeleteScreenIndex;
private boolean mReachMax;
private boolean mStartDrag;
private View.OnClickListener mThumbClickListener;
private View.OnClickListener mAddScreenClickListener;
private View.OnClickListener mDeleteScreenClickListener;
private View.OnClickListener mHomeClickListener;
private View.OnLongClickListener mLongClickListener;
private View mDragView;
private int mDragInitPos;
private int mFromPos;
private int mToPos;
private int[] mPos = new int[2];
private ItemAnimate mItemAnimate;
private int mCurSelectedScreenIndex;
public ThumbnailWorkspace(Context context, AttributeSet attrs) {
this(context, attrs, 0);
// TODO Auto-generated constructor stub
}
public ThumbnailWorkspace(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
mItemAnimate = new ItemAnimate(context);
// TODO Auto-generated constructor stub
mIsVisible = false;
mReachMax = false;
mStartDrag = false;
initWorkspace(context);
}
private void setFocusScreen(int pageIndex) {
final int childIndex = mWorkspace.getChildIndexByPageIndex(pageIndex);
Log.d(TAG, "setFocusScreen,childIndex="+childIndex+",pageIndex=" + pageIndex);
//mWorkspace.mCurrentScreen = pos;
//Launcher.setScreen(pos);
mWorkspace.moveToScreenByPageIndex(pageIndex);
}
private int getWorkspaceFocusIndex() {
if (mWorkspace != null) {
CellLayout layout = (CellLayout) mWorkspace.getChildAt(mWorkspace
.getCurrentScreen());
// this.mCurSelectedScreenIndex=layout.getPageIndex();
return (layout.getPageIndex());// mWorkspace.getCurrentScreen();
} else {
return SettingUtils.mHomeScreenIndex;
}
}
private void initWorkspace(Context context) {
// TODO Auto-generated method stub
mContext = context;
mInflater = LayoutInflater.from(context);
mCurSelectedScreenIndex = getWorkspaceFocusIndex();
final Resources r = context.getResources();
mWidthStartPadding = (int) r
.getDimension(R.dimen.thumbnail_width_padding_start);
mWidthEndPadding = (int) r
.getDimension(R.dimen.thumbnail_width_padding_end);
mHeightStartPadding = (int) r
.getDimension(R.dimen.thumbnail_height_padding_start);
mHeightEndPadding = (int) r
.getDimension(R.dimen.thumbnail_height_padding_end);
mThumbClickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
int mCurSnapScreenIndex = findViewIndex(v, 0);
Log.d(TAG, "click to snap,mCurSnapScreenIndex="
+ mCurSnapScreenIndex);
if (mCurSnapScreenIndex == -1) {
// If not find the corrent view, just do nothing
return;
}
mCurSelectedScreenIndex = mCurSnapScreenIndex;
show(false, true);
}
};
mAddScreenClickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
int childIndex = mWorkspace.getChildIndexByPageIndex(mWorkspace.getChildCount()-1)+1;
mWorkspace.addNewScreenByChildIndex(childIndex);
// final int newScreenIndex = mWorkspace.getChildCount() - 1;
CellLayout child = (CellLayout) mWorkspace.getChildAt(childIndex);
View newScreenThumb = generateEmptyThumbView();
//View newScreenThumb = generateThumbView(null, child.getPageIndex(), childIndex);
Log.d(TAG, "add,pageIndex=" + child.getPageIndex()
+ ",childIndex" + childIndex);
//thumb view - add
if (mWorkspace.getChildCount() == MAX_COUNT) {
mReachMax = true;
removeView(mAddScreen);
addView(newScreenThumb);
} else {
addView(newScreenThumb,
(ThumbnailWorkspace.this.getChildCount() - 1));
}
//print
//mWorkspace.printChildCount();
}
};
mDeleteScreenClickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
int deleteScreenIndex = -1;// 0;
if (mWorkspace.getChildCount() <= SettingUtils.MIN_SCREEN_COUNT) {
Toast.makeText(mContext, R.string.delete_screen_error_one,
Toast.LENGTH_SHORT).show();
return;
}
deleteScreenIndex = findViewIndex(v,
R.id.thumbnail_delete_screen);
Log.d(TAG, "delete:deleteScreenIndex=" + deleteScreenIndex);
if (deleteScreenIndex == -1) {
// If not find the corrent view, just do nothing
return;
}
if (deleteScreenIndex == SettingUtils.mHomeScreenIndex) {
Toast.makeText(mContext, R.string.delete_screen_error_home,
Toast.LENGTH_SHORT).show();
return;
}
mDeleteScreenIndex = deleteScreenIndex;
CellLayout cell = (CellLayout) mWorkspace.getChildAt(mWorkspace
.getChildIndexByPageIndex(deleteScreenIndex));
if (cell.getChildCount() > 0) {
// new AlertDialog.Builder(mContext)
// .setIcon(android.R.drawable.ic_dialog_alert)
// .setTitle(R.string.delete_screen_confirm_title)
// .setMessage(R.string.delete_screen_confirm_msg)
// .setPositiveButton(android.R.string.yes, new
// DialogInterface.OnClickListener() {
//
// @Override
// public void onClick(DialogInterface dialog, int which) {
// // TODO Auto-generated method stub
// processDeleteScreen();
// }
// })
// .setNegativeButton(android.R.string.no, null)
// .show();
Toast.makeText(mContext,
R.string.delete_screen_confirm_msg,
Toast.LENGTH_SHORT).show();
return;
} else {
processDeleteScreen();
}
}
};
if (!getResources().getBoolean(R.bool.config_lock_apps)) {
mHomeClickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
int newHomeIndex = findViewIndex(v,
R.id.thumbnail_home_indicator);
int oldHomeIndex = SettingUtils.mHomeScreenIndex;
Log.d(TAG, "home clicked,newHomeIndex=" + newHomeIndex
+ ",oldHomeIndex=" + oldHomeIndex);
if (newHomeIndex == -1) {
// If not find the current view, just do nothing
return;
}
if (newHomeIndex != oldHomeIndex) {
// Set old home indicator off, and set new home
// indicator on
ThumbnailWorkspace mThumbnailWorkspace = ThumbnailWorkspace.this;
ImageView oldHome = (ImageView) mThumbnailWorkspace
.getChildAt(oldHomeIndex).findViewById(
R.id.thumbnail_home_indicator);
oldHome.setImageResource(R.drawable.ic_homescreen_none);
ImageView newHome = (ImageView) v;
newHome.setImageResource(R.drawable.ic_homescreen_on);
mWorkspace.setDefaultScreen(newHomeIndex);
}
//print
//mWorkspace.printChildCount();
}
};
}
mLongClickListener = new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
// TODO Auto-generated method stub
mStartDrag = true;
mDragInitPos = findViewIndex(v, 0);
mFromPos = mDragInitPos;
mToPos = mDragInitPos;
removeView(mAddScreen);
mDragView = v;
v.getParent().bringChildToFront(v);
v.layout(getPosX(mPos[0]), getPosY(mPos[1]), getPosX(mPos[0])
+ mThumbWidth, getPosY(mPos[1]) + mThumbHeight);
Log.d(TAG, "long clicked,mDragInitPos=" + mDragInitPos);
return true;
}
};
};
private int getPosX(int x) {
return x - mThumbWidth / 2;
}
private int getPosY(int y) {
return y - mThumbHeight / 2;
}
private int findViewIndex(View v, int viewId) {
// TODO Auto-generated method stub
int index = -1;
for (int i = 0; i < getChildCount(); i++) {
View child = (viewId == 0) ? getChildAt(i) : getChildAt(i)
.findViewById(viewId);
if (child == v) {
index = i;
break;
}
}
return index;
}
private void processDeleteScreen() {
// TODO Auto-generated method stub
final int deleteScreenIndex = mDeleteScreenIndex;
// mWorkspace.removeScreenAt(
// mWorkspace.getChildIndexByPageIndex(deleteScreenIndex),
// deleteScreenIndex);
mWorkspace.removeScreenByPageIndexAt(deleteScreenIndex);
removeViewAt(deleteScreenIndex);
if (deleteScreenIndex == mCurSelectedScreenIndex) {
// When current screen be deleted, select first thumb view
getChildAt(0).setSelected(true);
mCurSelectedScreenIndex = 0;
} else if (deleteScreenIndex < mCurSelectedScreenIndex) {
mCurSelectedScreenIndex--;
}
// Delete from 9 -> 8, need to add mAddScreen to thumb workspace
if (mReachMax) {
if (mAddScreen == null) {
mAddScreen = mInflater.inflate(R.layout.thumbnail_add_screen,
null);
mAddScreen.setOnClickListener(mAddScreenClickListener);
}
mReachMax = false;
addView(mAddScreen);
}
//print
//mWorkspace.printChildCount();
}
public void setLauncher(Launcher launcher) {
mLauncher = launcher;
}
public void setWorkspace(Workspace workspace) {
mWorkspace = workspace;
mCurSelectedScreenIndex = getWorkspaceFocusIndex();
}
public boolean isVisible() {
return mIsVisible;
}
public boolean isUnderDrag() {
return mStartDrag;
}
public void show(boolean shown, boolean animate) {
// TODO Auto-generated method stub
cancelLongPress();
Log.d(TAG, "show,shown=" + shown + ",animate=" + animate);
//mWorkspace.printChildCount();
mIsVisible = shown;
if (mIsVisible) {
mDragView = null;
// Initialize thumb workspace with all cell layouts
initThumbnail();
// Show thumb workspace as visible
getParent().bringChildToFront(this);
setVisibility(View.VISIBLE);
if (animate) {
startAnimation(AnimationUtils.loadAnimation(getContext(),
R.anim.zoom_in));
} else {
onAnimationEnd();
}
} else {
setFocusScreen(mCurSelectedScreenIndex);
if (animate) {
startAnimation(AnimationUtils.loadAnimation(getContext(),
R.anim.zoom_out));
} else {
onAnimationEnd();
}
}
}
private void initThumbnail() {
// TODO Auto-generated method stub
removeAllViews();
Log.d(TAG, "initThumbnail");
mReachMax = mWorkspace.getChildCount() == MAX_COUNT;
View thumbViews[] = new View[mWorkspace.getChildCount()];
for (int childIndex = 0; childIndex < mWorkspace.getChildCount(); childIndex++) {
CellLayout cell = (CellLayout) mWorkspace.getChildAt(childIndex);
thumbViews[cell.getPageIndex()] = generateThumbView(cell,
cell.getPageIndex(), childIndex);
}
for (int j = 0; j < thumbViews.length; j++) {
addView(thumbViews[j]);
}
if (!mReachMax) {
if (mAddScreen == null) {
mAddScreen = mInflater.inflate(R.layout.thumbnail_add_screen,
null);
mAddScreen.setOnClickListener(mAddScreenClickListener);
}
addView(mAddScreen);
}
}
private View generateThumbView(CellLayout cell, int pageIndex,
int childIndex) {
Log.d(TAG, "generateThumbView,cell has " + cell.getChildCount()
+ " childs,pageIndex=" + pageIndex + ",childIndex="
+ childIndex);
View view = mInflater.inflate(R.layout.thumbnail_item, null);
ImageView thumb = (ImageView) view
.findViewById(R.id.thumbnail_imageview);
ImageView home = (ImageView) view
.findViewById(R.id.thumbnail_home_indicator);
ImageView delete = (ImageView) view
.findViewById(R.id.thumbnail_delete_screen);
Log.d(TAG, "generateThumbView,getMeasuredWidth=" + getMeasuredWidth()
+ ",getMeasuredHeight=" + getMeasuredHeight());
Log.d(TAG, "generateThumbView,getLeft=" + getLeft() + ",getRight="
+ getRight() + ",getTop=" + getTop() + ",getBottom="
+ getBottom());
mThumbWidth = (getMeasuredWidth() - mWidthStartPadding - mWidthEndPadding)
/ COL_NUM;
mThumbHeight = (getMeasuredHeight() - mHeightStartPadding - mHeightEndPadding)
/ ROW_NUM;
Log.d(TAG, "generateThumbView,mThumbWidth=" + mThumbWidth
+ ",mThumbWidth=" + mThumbWidth);
if (thumb != null && cell != null) {
// Force set transformation to false
// for drawing cell layout without any transformations
cell.setStaticTransformationsEnabled(false);
thumb.setImageBitmap(getThumbnail(cell));
cell.setStaticTransformationsEnabled(true);
}
view.setOnClickListener(mThumbClickListener);
// Set getCurrentScreen() as focus
Log.d(TAG, "generateThumbView,mWorkspace.getCurrentScreen()="
+ mWorkspace.getCurrentScreen());
view.setSelected((childIndex == /* cell.getPageIndex() */mWorkspace
.getCurrentScreen()));
// Set mHomeScreenIndex indicator
home.setOnClickListener(mHomeClickListener);
Log.d(TAG, "generateThumbView,home is " + SettingUtils.mHomeScreenIndex);
if (pageIndex/* cell.getPageIndex() */== SettingUtils.mHomeScreenIndex) {
home.setImageResource(R.drawable.ic_homescreen_on);
}
delete.setOnClickListener(mDeleteScreenClickListener);
view.setOnLongClickListener(mLongClickListener);
return view;
}
private View generateEmptyThumbView() {
// Log.d(TAG, "generateThumbView,cell has " + cell.getChildCount()
// + " childs,pageIndex=" + pageIndex + ",childIndex="
// + childIndex);
View view = mInflater.inflate(R.layout.thumbnail_item, null);
ImageView thumb = (ImageView) view
.findViewById(R.id.thumbnail_imageview);
ImageView home = (ImageView) view
.findViewById(R.id.thumbnail_home_indicator);
ImageView delete = (ImageView) view
.findViewById(R.id.thumbnail_delete_screen);
Log.d(TAG, "generateThumbView,getMeasuredWidth=" + getMeasuredWidth()
+ ",getMeasuredHeight=" + getMeasuredHeight());
Log.d(TAG, "generateThumbView,getLeft=" + getLeft() + ",getRight="
+ getRight() + ",getTop=" + getTop() + ",getBottom="
+ getBottom());
mThumbWidth = (getMeasuredWidth() - mWidthStartPadding - mWidthEndPadding)
/ COL_NUM;
mThumbHeight = (getMeasuredHeight() - mHeightStartPadding - mHeightEndPadding)
/ ROW_NUM;
Log.d(TAG, "generateThumbView,mThumbWidth=" + mThumbWidth
+ ",mThumbWidth=" + mThumbWidth);
// if (thumb != null && cell != null) {
// // Force set transformation to false
// // for drawing cell layout without any transformations
// cell.setStaticTransformationsEnabled(false);
// thumb.setImageBitmap(getThumbnail(cell));
// cell.setStaticTransformationsEnabled(true);
// }
view.setOnClickListener(mThumbClickListener);
// Set getCurrentScreen() as focus
Log.d(TAG, "generateThumbView,mWorkspace.getCurrentScreen()="
+ mWorkspace.getCurrentScreen());
// view.setSelected((childIndex == /* cell.getPageIndex() */mWorkspace
// .getCurrentScreen()));
// Set mHomeScreenIndex indicator
home.setOnClickListener(mHomeClickListener);
Log.d(TAG, "generateThumbView,home is " + SettingUtils.mHomeScreenIndex);
// if (pageIndex/* cell.getPageIndex() */== SettingUtils.mHomeScreenIndex) {
// home.setImageResource(R.drawable.ic_homescreen_on);
// }
delete.setOnClickListener(mDeleteScreenClickListener);
view.setOnLongClickListener(mLongClickListener);
return view;
}
private Bitmap getThumbnail(View view) {
float scaleWidth = ((float) mThumbWidth) / ((float) view.getWidth());
float scaleHeight = ((float) mThumbHeight) / ((float) view.getHeight());
Bitmap bitmap = Bitmap.createBitmap(mThumbWidth, mThumbHeight,
Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(bitmap);
c.scale(scaleWidth, scaleHeight);
view.draw(c);
return bitmap;
}
private int getXPos(int index, int thumbWidth) {
if (index >= MAX_COUNT) {
// Only support max_count screens
return 0;
}
return thumbWidth * (index % COL_NUM) + mWidthStartPadding;
}
private int getYPos(int index, int thumbHeight) {
if (index >= MAX_COUNT) {
// Only support max_count screens
return 0;
}
return thumbHeight * (index / ROW_NUM) + mHeightStartPadding;
}
@Override
protected void onAnimationEnd() {
// TODO Auto-generated method stub
Log.d(TAG, "onAnimationEnd");
if (mIsVisible) {
mLauncher.thumbnailShowed(true);
} else {
setVisibility(View.GONE);
mLauncher.thumbnailShowed(false);
}
}
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
// TODO Auto-generated method stub
final int action = event.getAction();
Log.d(TAG, "onInterceptTouchEvent,action=" + action);
switch (action) {
case MotionEvent.ACTION_DOWN:
mPos[0] = (int) event.getX();
mPos[1] = (int) event.getY();
Log.d(TAG, "onInterceptTouchEvent,mPos[" + mPos[0] + "," + mPos[1]
+ "]");
break;
case MotionEvent.ACTION_MOVE:
if (mDragView != null) {
mStartDrag = true;
Log.d(TAG, "onInterceptTouchEvent,ACTION_MOVE:mStartDrag=true");
startDrag((int) event.getX(), (int) event.getY());
}
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
mStartDrag = false;
Log.d(TAG,
"onInterceptTouchEvent,ACTION_UP|ACTION_CANCEL:mStartDrag = false");
endDrag((int) event.getX(), (int) event.getY());
break;
}
Log.d(TAG,
"onInterceptTouchEvent,return="
+ super.onInterceptTouchEvent(event));
return super.onInterceptTouchEvent(event);
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
// TODO Auto-generated method stub
final int thumbWidth = mThumbWidth;
final int thumbHeight = mThumbHeight;
Log.d(TAG, "onLayout,thumbWidth=" + thumbWidth + ",thumbHeight="
+ thumbHeight + ",changed=" + changed);
if (mDragView == null) {
for (int i = 0; i < getChildCount(); i++) {
View view = getChildAt(i);
if (view != null && view.getVisibility() == View.VISIBLE) {
int left = getXPos(i, thumbWidth);
int top = getYPos(i, thumbHeight);
Log.d(TAG, "onLayout,left=" + left + ",top=" + top);
view.layout(left, top, left + thumbWidth, top + thumbHeight);
}
}
}
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
// TODO Auto-generated method stub
int widthSpecSize = MeasureSpec.getSize(widthMeasureSpec);
int widthSpecMode = MeasureSpec.getMode(widthMeasureSpec);
int heightSpecSize = MeasureSpec.getSize(heightMeasureSpec);
int heightSpecMode = MeasureSpec.getMode(heightMeasureSpec);
int mWidthGap = 0;
int mHeightGap = 0;
Log.d(TAG, "onMeasure,widthSpecSize=" + widthSpecSize
+ ",heightSpecSize=" + heightSpecSize + ",widthSpecMode="
+ widthSpecMode);
if (widthSpecMode == MeasureSpec.UNSPECIFIED
|| heightSpecMode == MeasureSpec.UNSPECIFIED) {
throw new RuntimeException(
"Thumbnail cannot have UNSPECIFIED dimensions");
}
mWidthGap = (widthSpecSize - mWidthStartPadding - mWidthEndPadding)
/ COL_NUM;
mHeightGap = (heightSpecSize - mHeightStartPadding - mHeightEndPadding)
/ ROW_NUM;
Log.d(TAG, "onMeasure,mWidthGap=" + mWidthGap + ",mHeightGap="
+ mHeightGap);
int childWidthMeasureSpec = MeasureSpec.makeMeasureSpec(mWidthGap,
MeasureSpec.EXACTLY);
int childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(mHeightGap,
MeasureSpec.EXACTLY);
Log.d(TAG, "onMeasure,childWidthMeasureSpec=" + childWidthMeasureSpec
+ ",childHeightMeasureSpec=" + childHeightMeasureSpec);
for (int i = 0; i < getChildCount(); i++) {
getChildAt(i)
.measure(childWidthMeasureSpec, childHeightMeasureSpec);
}
setMeasuredDimension(widthSpecSize, heightSpecSize);
}
public View pointToView(int x, int y) {
if (getChildCount() > 1) {
Rect frame = new Rect();
for (int i = 0; i < this.getChildCount(); i++) {
final View child = this.getChildAt(i);
if (child.getVisibility() == View.VISIBLE) {
child.getHitRect(frame);
if (frame.contains(x, y)) {
return child;
}
}
}
}
return null;
}
private void startAnimate() {
Log.d(TAG, "startAnimate mFromPos=" + mFromPos + " mToPos=" + mToPos + "counts:"+getChildCount());
if (mFromPos < mToPos) {
for (int init = mFromPos + 1; init < mToPos; init++) {
View child = getChildAt(init - 1);
int x1 = getXPos(init, mThumbWidth);
int y1 = getYPos(init, mThumbHeight);
int x2 = getXPos(init - 1, mThumbWidth);
int y2 = getYPos(init - 1, mThumbHeight);
ItemAnimate itemAnimate = new ItemAnimate(x1, x2, y1, y2, child);
itemAnimate.setDuration(ANIMATE_DURATION);
itemAnimate.setSquare(mThumbWidth, mThumbHeight);
itemAnimate.start();
}
View child = getChildAt(mToPos - 1);
int x1 = getXPos(mToPos, mThumbWidth);
int y1 = getYPos(mToPos, mThumbHeight);
int x2 = getXPos(mToPos - 1, mThumbWidth);
int y2 = getYPos(mToPos - 1, mThumbHeight);
mItemAnimate.stop();
mItemAnimate.setAnimateTarget(x1, x2, y1, y2, child);
mItemAnimate.setDuration(ANIMATE_DURATION);
mItemAnimate.setSquare(mThumbWidth, mThumbHeight);
mItemAnimate.start();
Log.d(TAG, "startAnimate mFromPos=" + mFromPos + " mToPos="
+ mToPos);
mFromPos = mToPos;
} else {
for (int init = mToPos; init < mFromPos - 1; init++) {
View child = getChildAt(init);
int x1 = getXPos(init, mThumbWidth);
int y1 = getYPos(init, mThumbHeight);
int x2 = getXPos(init + 1, mThumbWidth);
int y2 = getYPos(init + 1, mThumbHeight);
ItemAnimate itemAnimate = new ItemAnimate(x1, x2, y1, y2, child);
itemAnimate.setDuration(ANIMATE_DURATION);
itemAnimate.setSquare(mThumbWidth, mThumbHeight);
itemAnimate.start();
}
View child = getChildAt(mFromPos - 1);
int x1 = getXPos(mFromPos - 1, mThumbWidth);
int y1 = getYPos(mFromPos - 1, mThumbHeight);
int x2 = getXPos(mFromPos, mThumbWidth);
int y2 = getYPos(mFromPos, mThumbHeight);
mItemAnimate.stop();
mItemAnimate.setAnimateTarget(x1, x2, y1, y2, child);
mItemAnimate.setDuration(ANIMATE_DURATION);
mItemAnimate.setSquare(mThumbWidth, mThumbHeight);
mItemAnimate.start();
Log.d(TAG, "startAnimate mFromPos=" + mFromPos + " mToPos="
+ mToPos);
mFromPos = mToPos;
}
}
private int getPos(int x, int y) {
int row = y / mThumbHeight;
int col = x / mThumbWidth;
return row * COL_NUM + col;
}
private void startDrag(int x, int y) {
Log.d(TAG, "startDrag,x=" + x + ",y=" + y);
View view = pointToView(x, y);
if (mItemAnimate.animateEnd && view != null) {
if (view != mDragView) {
Log.d(TAG, "startDrag,view != mDragView");
mToPos = findViewIndex(view, 0);
Log.d(TAG, "startDrag,mToPos=" + mToPos + ",mFromPos="
+ mFromPos);
if (mToPos >= mFromPos) {
mToPos++;
}
Log.d(TAG, "startDrag,mToPos=" + mToPos + ",mFromPos="
+ mFromPos);
startAnimate();
} else if (view == mDragView) {
Log.d(TAG, "startDrag,view == mDragView");
int count = getChildCount();
int pos = getPos(x, y);
Log.d(TAG, "startDrag,count=" + count + ",pos=" + pos);
if (pos > count - 1 && mToPos != count - 1) {
mToPos = count - 1;
Log.d(TAG, "startDrag,mToPos=" + mToPos + ",mFromPos="
+ mFromPos);
startAnimate();
}
}
}
mDragView.layout(getPosX(x), getPosY(y), getPosX(x) + mThumbWidth,
getPosY(y) + mThumbHeight);
}
private void endDrag(int x, int y) {
Log.d(TAG, "endDrag,x=" + x + ",y=" + y);
if (mDragView != null) {
if (mDragInitPos != mToPos) {
mWorkspace.exchangeScreenByPageIndex(mDragInitPos, mToPos);
// mCurSelectedScreenIndex = mToPos;
// setFocusScreen(mCurSelectedScreenIndex);
}
removeViewAt(getChildCount() - 1);
addView(mDragView, mToPos);
mDragView = null;
if (!mReachMax) {
addView(mAddScreen);
}
invalidate();
}
}
/**
* @return the mCurSelectedScreenIndex
*/
public int getmCurSelectedScreenIndex() {
return mCurSelectedScreenIndex;
}
/**
* @param mCurSelectedScreenIndex
* the mCurSelectedScreenIndex to set
*/
public void setmCurSelectedScreenIndex(int mCurSelectedScreenIndex) {
this.mCurSelectedScreenIndex = mCurSelectedScreenIndex;
}
}