ViewDragHelper的延伸操作

转载请注明出处王亟亟的大牛之路
最近都在看帖子学习之类的度过,然后一直对可拖拽的试图这一些不是太了解,然后正好看到大牛的博文,然后敲了敲他的例子,对这一类型的实现,有了一个初步的了解。具体实现和理念还是看大牛的帖子吧hongyang
言归正传,那既然事例和大体内容都是大牛分析出来的那我干什么呢?
在敲的过程当中自己犯二的一个点,就当记录下吧。
先上效果图:

运动方式啊,实现啊,跟大牛的没什么区别,只是多一个个Toast,记录下这个错误。
VDHLayout

public class VDHLayout extends LinearLayout
{
    private ViewDragHelper mDragger;

    private View mDragView;
    private View mAutoBackView;
    private View mEdgeTrackerView;

    private Point mAutoBackOriginPos = new Point();

    public VDHLayout(Context context, AttributeSet attrs)
    {

        super(context, attrs);
        mDragger = ViewDragHelper.create(this, 1.0f, new ViewDragHelper.Callback()
        {
            @Override
            public boolean tryCaptureView(View child, int pointerId)
            {
                //mEdgeTrackerView禁止直接移动
                return child == mDragView || child == mAutoBackView;
            }

            @Override
            public int clampViewPositionHorizontal(View child, int left, int dx)
            {
                return left;
            }

            @Override
            public int clampViewPositionVertical(View child, int top, int dy)
            {
                return top;
            }

            //手指释放的时候回调
            @Override
            public void onViewReleased(View releasedChild, float xvel, float yvel)
            {
                //mAutoBackView手指释放时可以自动回去
                if (releasedChild == mAutoBackView)
                {
                    mDragger.settleCapturedViewAt(mAutoBackOriginPos.x, mAutoBackOriginPos.y);
                    invalidate();
                }
            }

            //在边界拖动时回调
            @Override
            public void onEdgeDragStarted(int edgeFlags, int pointerId)
            {
                mDragger.captureChildView(mEdgeTrackerView, pointerId);
            }

            @Override
            public int getViewHorizontalDragRange(View child)
            {
                return getMeasuredWidth()-child.getMeasuredWidth();
            }

            @Override
            public int getViewVerticalDragRange(View child)
            {
                return getMeasuredHeight()-child.getMeasuredHeight();
            }
        });
        mDragger.setEdgeTrackingEnabled(ViewDragHelper.EDGE_ALL);

    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent event)
    {
        return mDragger.shouldInterceptTouchEvent(event);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event)
    {
        mDragger.processTouchEvent(event);
        return true;
    }

    @Override
    public void computeScroll()
    {
        if(mDragger.continueSettling(true))
        {
            invalidate();
        }
    }

    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b)
    {
        super.onLayout(changed, l, t, r, b);

        mAutoBackOriginPos.x = mAutoBackView.getLeft();
        mAutoBackOriginPos.y = mAutoBackView.getTop();
    }

    @Override
    protected void onFinishInflate()
    {
        super.onFinishInflate();
        mDragView=getChildAt(0);
        mAutoBackView = getChildAt(1);
        mEdgeTrackerView = getChildAt(2);
    }

}

补充下,要让他动,必须要有getViewVerticalDragRange()getViewHorizontalDragRange() 已经亲测过了,确实如此不然的话你的Button或者TextView是不会动的。
然后说下问题所在,初以为接收子View的点击事件什么的可以在这个自定义的LinearLayout里完成。
也就是
private View mDragView;
private View mAutoBackView;
private View mEdgeTrackerView;

变成
`private Button mDragView;
private View mAutoBackView;
然后在构造函数中处理相应的业务逻辑,只要在布局的XML里添加ID即可

 <Button
        android:layout_margin="10dp"
        android:gravity="center"
        android:layout_gravity="center"
        android:background="#44ff00"
        android:text="button"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:id="@+id/mDragView"/>

像这样,然后 正常的findViewById来操作,因为想当然的以为Button继承TextView,TextView继承View所以想当然的觉得捕捉View的回调函数也会调用Button,实则是一对的空指针。
所以Button的一系列点击事件要抽离到那个主Activity中去实现。

public class MainActivity extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button  mDragView=(Button)findViewById(R.id.mDragView);
        mDragView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(MainActivity.this, "123", Toast.LENGTH_SHORT).show();
            }
        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}

然后在他 自定义布局的那部分还是让他以View的形式存在着
记录下自己的2B…
Demo地址:http://yunpan.cn/ccuVURC7RpsUu 访问密码 4dfe
Gradle是2.2.1的如果没有那么高版本的小伙伴可以下载Gradle去找自己所需要的版本!!
Thanks for watch.

时间: 2024-10-25 13:12:59

ViewDragHelper的延伸操作的相关文章

图片展现形式的思考

图片,是构成网页的基本元素之一.图片不仅能够增加网页的吸引力,传达给用户更加丰富的信息,同时也大大地提升了用户在浏览网页的体验.图片的展示形式丰富多样,不同形式的图片展现也让浏览网页的乐趣变得更加多样化. 跟随我们分别来体验一下目前存在的各种图片展现形式,让我们的眼睛去旅行吧. 一.多图展现 图片限制最大高度或宽度并进行矩阵平铺展现,这是最常见的多张图片展现形式.不同的边距与距离可产生不同的风格,用户一扫而过的快速浏览可以在短时间获得更多的信息.同时,鼠标悬浮时显示更多信息或功能按钮,既避免过多

网页设计中图片展现形式的思考

图片,是构成网页的基本元素之一.图片不仅能够增加网页的吸引力,传达给用户更加丰富的信息,同时也大大地提升了用户在浏览网页的体验.图片的展示形式丰富多样,不同形式的图片展现也让浏览网页的乐趣变得更加多样化. 跟随我们分别来体验一下目前存在的各种图片展现形式,让我们的眼睛去旅行吧. 一.多图展现 图片限制最大高度或宽度并进行矩阵平铺展现,这是最常见的多张图片展现形式.不同的边距与距离可产生不同的风格,用户一扫而过的快速浏览可以在短时间获得更多的信息.同时,鼠标悬浮时显示更多信息或功能按钮,既避免过多

轻社交重沟通 微信真心不是营销工具

中介交易 SEO诊断 淘宝客 云主机 技术大厅 微信真的需要群发吗? 前段时间钛媒体发了一个消息称微信要取消群发,震动了整个微信界,很多人以为微信要取消公众账号群发功能了,不少人都开始考虑该往那个平台转移了,但其实原文的标题是有一个问号的,只是后来别的媒体转载时把问号去掉了. 当然这个消息肯定是假的,据我后来了解只是某公司高管在申请微信接口时,和微信的人对接时理解错了,最终导致了这场闹剧,但从这件事可以看出,所有的微信公众账号运营者是有多看重微信的群发功能,一旦取消的话就如世界末日. 确实微信的

Flash &amp; Ajax 操作 XML 实例:无刷新分页

ajax|xml|分页|刷新|无刷新 其实标题只是一个噱头罢了,只是想谈一下,Javascript 与 Actionscript 是如何操作XML的. 希望能帮助一些只用 Javascript  或 只懂 Actionscript 的朋友,了解两者的相同与不同之处. Flash 与 后台连接有许多种,Actionscript 调用 XML() 算是比较简单的一种了, 而Javascript 调用 xmlHttp ,便形成了现在很流行的Ajax了. 现在就用一个网上常出现的分页效果来对 Flash

jQuery对象中的类数组操作

我们都知道jQUery对象中有一个类数组的元素包装集,该集合类似js中的数组一样拥有length属性,因此我们称此为类数组,下面我们就来总结下这个jQuery对象中的类数组时如何进行操作的,看看我们的jQuery为我们都提供了哪些可用的方法: size():很明显,它应该是返回包装集中的元素个数,如$('a').size()表示链接元素的个数: get(index):当没指定index时就默认取包装集中所有元素,并以js中的数组形式返回,如果指定了index,则返回下标为index对应的元素,如

论Domain首页不在第一位之延伸观点(终篇)

既论Domain首页不在第一位之延伸观点(一,二)2篇文章发布以后,受到了很多站长圈子认识和不认识的朋友大力支持.咱们郑州方圆网络今天继续在写一个终篇. domain不在首位相信部分网站推广者都可能遇见过这种情况,这是由于自身网站做了不正当或者受到不正当情况的影响出了问题.(最近大家关注比较多的是seo界保持几年位置的seowhy论坛排名降到第2页,有消息说是因为服务器的稳定造成的,部分省份和地区直接访问不了.像这种可能不能麻烦解决的突发问题真的没办法完全避免.)那么如果出了问题既然被进行了降权

总结新站收录前问题延伸(终篇)

上次我们谈到新网站上线不要急于快速的让网站收录,对这一话题进行了延伸<<总结新站收录前问题延伸(一)>> 如果您是新站,请对照好是否符合自身的情况.做好上线前的一些准备工作,然后在提交给搜索引擎.早收录未必就是好事.如今天咱们郑州启凡软件继续和大家一起探讨一下新站上线前的一些问题延伸. 前面的工作做好以后,那么这个时间我们可以希望搜索引擎能够快速收录我们的网站了,使用一些不错的方法还是能够促进收录速度的: 1.搜索引擎的一般收录时间 古人云:知己知彼百战不殆.既然咱们想让搜索引擎快

接单一个月时间的关键词操作和整站优化心得

本人接手同城送餐网到今天刚好一个月了,一个月里网站在我手里有了不错的提升,网站流量从10几到将近200,关键词排名也大批量上升,很多关键词都在前3,百度权重由0上升到2,网站的订单也就多了许多,而且由于网站优化难度不难,加上方法得当,所以我每天基本只要花3.4个小时维护网站,轻轻松松的就把网站优化做好,下面我就谈谈我是如何轻松的做好网站优化: 1.内容方面,由于网站以前基本没什么内容,收录才可怜的50几,都靠图片来维持更新,我过去就直接给网站加了两个文章版块,不过由于做优化的只有我一个人,编辑也

菜鸟操作淘客两种方法分享

网赚大部分都是从流量开始,做淘宝客也要解决流量的问题.对于淘宝客来说流量的数量不是很重要,最重要的是流量的质量.要分析好你流量的目标客户群.搜索引擎来的流量一般都比较精准,现在做淘宝客很多都是利用搜索引擎.一般都是开个淘宝客的网站,做好关键字和SEO优化,进网站的大都是从百度谷歌来的,都是想买这个产品的目标客户.这样的流量质量高,成交也高.100个IP可能成交10个,赚上百元也是有可能的,想想你做cpa﹑cpc什么的1000IP赚20元都不容易. 通过网站做SEO对于新人来说还是不容易的,关键字