如果模拟一种图标被删除时一种颜色渐变的效果,采用TransitionDrawable实现

效果图:

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

如果模拟一种图标被删除时一种颜色渐变的效果,采用TransitionDrawable实现

时间: 2024-11-08 11:59:35

如果模拟一种图标被删除时一种颜色渐变的效果,采用TransitionDrawable实现的相关文章

应用删除后 Launchpad 上仍有应用图标无法删除的解决方法

应用删除后 Launchpad 上仍有应用图标上带有问号且无法删除时,可以将 launchpad 重置. 在终端输入: defaults write com.apple.dock ResetLaunchPad -bool true 回车 killall Dock 回车 等待 LaunchPad 重启 .

salesforce lightning零基础学习(七) 列表展示数据时两种自定义编辑页面

上一篇Lightning内容描述的是LDS,通过LDS可以很方便的实例化一个对象的数据信息.当我们通过列表展示数据需要编辑时,我们常使用两种方式去处理编辑页面:Pop Up Window弹出修改详情以及在本页面隐藏详情页面显示编辑页面. 实现这个功能以前主要需要先了解几个标签: lightning:recordForm: 此标签允许用户快速的创建一个form去查看,添加以及修改一条记录.集合了 lightning:recordEditForm 以及 lightning:recordViewFor

JAVA List删除时需注意的地方

JAVA的LIST在删除时,一般会用list.remove(o); 但这样往往会出现问题,先来看下面的这段代码: package com.demo; import java.util.ArrayList; import java.util.List; public class Test11 { public void delete(){ List<Integer> list = new ArrayList<Integer>(); list.add(1); list.add(2);

002-UIImageView和UIButton对比 UIImageView的帧动画 格式符补充 加载图片两种方式 添加删除SUBVIEW

一>.UIImageView和UIButton对比 显示图片 1> UIImageView只是一种图片(图片默认会填充整个UIImageView)  image\setImage: 2> UIButton能显示2种图片 * 背景 (背景会填充整个UIButton)  setBackgroundImage:forState: * 前置(覆盖在背景上面的图片,按照之前的尺寸显示)  setImage:forState: * 还能显示文字 点击事件 1> UIImageView默认是不能

点击删除时弹出是否删除提示框

点击删除时弹出是否删除提示框:在通常情况下,想要点击删除某一项的时候,一般会弹出一个框,以提示操作者是否真的要删除此项,这样可以免于出现误操作,比较人性化的一个举措,下面就简单介绍一下如何实现此效果.实例代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="author" content="http://www.soft

以指针和引用两种参数实现删除单链表L中所有值为X的结点的函数

下面是单链表的数据结构 typedef struct LNode{ ElemType data; struct LNode *next; }LNode,*Linklist; 1.以指针参数实现 void delete_x_1(LNode *head,ElemType x){//head为单链表头结点,删除结点的值为x LNode *l = head; LNode *p = head->next; while(p != null){ if(p->data == x){ l->next =

DragVideo,一种在播放视频时,可以任意拖拽的方案

转载请把头部出处链接和尾部二维码一起转载,本文出自逆流的鱼yuiop:http://blog.csdn.net/hejjunlin/article/details/53638896 前言 项目已开源到我的github: https://github.com/hejunlin2013/DragVideo DragVideo A Method to Drag the Video When Playing Video 一种在播放视频时,能够拖拽的方案 为什么有这个工程 经常在爱奇艺网站上看电影,看到如

ios8 tableView设置滑动删除时 显示多个按钮

** *  tableView:editActionsForRowAtIndexPath:     //设置滑动删除时显示多个按钮 *  UITableViewRowAction                        //通过此类创建按钮 *  1. 我们在使用一些应用的时候,在滑动一些联系人的某一行的时候,会出现删除.置顶.更多等等的按钮,在iOS8之前,我们都需要自己去实现.但是,到了iOS8,系统已经写好了,只需要一个代理方法和一个类就搞定了 *  2. iOS8的协议多了一个方法

MySQL删除数据几种情况以及是否释放磁盘空间【转】

MySQL删除数据几种情况以及是否释放磁盘空间: 1.drop table table_name 立刻释放磁盘空间 ,不管是 Innodb和MyISAM ; 2.truncate table table_name 立刻释放磁盘空间 ,不管是 Innodb和MyISAM .truncate table其实有点类似于drop table 然后creat,只不过这个create table 的过程做了优化,比如表结构文件之前已经有了等等.所以速度上应该是接近drop table的速度; 3.delet