效果图:
TransitionDrawable 可以用来实现两个Drawable直接的交错渐变的过渡效果
接着上篇,我们这样来实现:
public class MyDragLayer extends FrameLayout {
/**
* The bitmap that is currently being dragged
*/
private Bitmap mDragBitmap = null;
private float mLastMotionX;
private float mLastMotionY;
private float mOffsetX;
private float mOffsetY;
private static final int TRANSITION_DURATION = 250;
public View mTrashBin;
public View mDropTarget;
private final Paint mTrashPaint = new Paint();
private Paint mDragPaint;
private TransitionDrawable mTransition;
public MyDragLayer(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public MyDragLayer(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MyDragLayer(Context context) {
super(context);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
mLastMotionX = ev.getX();
mLastMotionY = ev.getY();
int dx = 0;
int dy = 0;
if (mDragBitmap != null) {
dx = (int)(mLastMotionX - mOffsetX + mDragBitmap.getWidth() / 2);
dy = (int)(mLastMotionY - mOffsetY + mDragBitmap.getHeight() / 2);
}
int action = ev.getAction();
if (action == MotionEvent.ACTION_MOVE) {
//如果之前进入trash view的范围,则mDropTarget必须是trashbin
boolean preIsTrash = mDropTarget == mTrashBin;
mDropTarget = findDropTarget(dx, dy);
boolean currentIsTrash = mDropTarget == mTrashBin;
if (!preIsTrash && currentIsTrash) {
// 由外进入垃圾箱
mTransition.reverseTransition(TRANSITION_DURATION);
} else if (preIsTrash && !currentIsTrash) {
// 有垃圾箱往外
mTransition.reverseTransition(TRANSITION_DURATION);
}
if (currentIsTrash) {
mDragPaint = mTrashPaint;
} else {
mDragPaint = null;
}
} else if (action == MotionEvent.ACTION_UP) {
mDropTarget = findDropTarget(dx, dy);
if (mDropTarget == mTrashBin) {
invalidate();
return true; //QuickNavGridView will receive Action_cancel
}
}
invalidate();
boolean result = super.onInterceptTouchEvent(ev);
return result;
}
private View findDropTarget(int x, int y) {
if (mTrashBin != null && mTrashBin.getVisibility() == View.VISIBLE) {
Rect r = new Rect();
//将mTrashBin的坐标映射到Rect r上
mTrashBin.getHitRect(r);
if (r.contains(x, y)) {
return mTrashBin;
}
}
return null;
}
@Override
protected void dispatchDraw(Canvas canvas) {
super.dispatchDraw(canvas);
if (mDragBitmap != null && !mDragBitmap.isRecycled()) {
// Draw actual icon being dragged
canvas.drawBitmap(mDragBitmap, getScrollX() + mLastMotionX
- mOffsetX, getScrollY() + mLastMotionY - mOffsetY,
mDragPaint);
}
}
public void startDrag(Bitmap bitmap, int offsetx, int offsety) {
mDragBitmap = bitmap;
mOffsetX = offsetx;
mOffsetY = offsety;
mDragPaint = null;
invalidate();
}
public void setTrashBin(View view) {
mTrashBin = view;
mTransition = (TransitionDrawable) view.getBackground();
}
}
activity:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.test);
MyLinearlayout layout = (MyLinearlayout)findViewById(R.id.linear);
layout.mDragLayer = (MyDragLayer) findViewById(R.id.rootView);
layout.mDragLayer.setTrashBin(findViewById(R.id.trashbin));
}
代码: http://download.csdn.net/detail/baidu_nod/7759965