黏性控件的使用

在qq上面用一个红色的黏性控件来表示消息已读或未读。可拖动。今天就来分享一下如何实现这个功能。我们需要的jar包是nineoldandroids-2.4.0.jar,还需要一个开源的几何工具类GeometryUtil.java。

应用场景: 未读提醒的清除

1.画静态图

//1.画固定圆

canvas.drawCircle(mStickCenter.x,mStickCenter.y,mStickRadious, mPaint);
//2.画拖拽圆
    canvas.drawCircle(mDragCenter.x,mDragCenter.y,mDragRadius, mPaint);

2.把静态的数值变成变量(计算得到真实的变量)

// 3. 获取控制点坐标
        mControlPoint = GeometryUtil.getMiddlePoint(mDragCenter, mStickCenter);

    // 保存画布状态
    canvas.save();
    canvas.translate(0, -statusBarHeight);

        // 画出最大范围(参考用)
        mPaint.setStyle(Style.STROKE);
        canvas.drawCircle(mStickCenter.x, mStickCenter.y, farestDistance, mPaint);
        mPaint.setStyle(Style.FILL);

3.不断地修改变量, 重绘界面, 动起来了.

// 计算连接点值, 控制点, 固定圆半径

        // 1. 获取固定圆半径(根据两圆圆心距离)
        float tempStickRadius = getTempStickRadius();

        // 2. 获取直线与圆的交点
        float yOffset = mStickCenter.y - mDragCenter.y;
        float xOffset = mStickCenter.x - mDragCenter.x;
        Double lineK = null;
        if(xOffset != 0){
            lineK = (double) (yOffset / xOffset);
        }
        // 通过几何图形工具获取交点坐标
        mDragPoints = GeometryUtil.getIntersectionPoints(mDragCenter, mDragRadius, lineK);
        mStickPoints = GeometryUtil.getIntersectionPoints(mStickCenter, tempStickRadius, lineK);

4.功能分析:

a. 拖拽超出范围,断开, 松手, 消失
b. 拖拽超出范围,断开,放回去了,恢复
c. 拖拽没超出范围, 松手,弹回去

case MotionEvent.ACTION_UP:
            if(isOutofRange){
                float d = GeometryUtil.getDistanceBetween2Points(mDragCenter, mStickCenter);
                if(d > farestDistance){
                    // a. 拖拽超出范围,断开, 松手, 消失
                    isDisappear = true;
                    invalidate();
                }else {
                    //b. 拖拽超出范围,断开,放回去了,恢复
                    updateDragCenter(mStickCenter.x, mStickCenter.y);
                }

            }else {
//              c. 拖拽没超出范围, 松手,弹回去
                final PointF tempDragCenter = new PointF(mDragCenter.x, mDragCenter.y);

                ValueAnimator mAnim = ValueAnimator.ofFloat(1.0f);
                mAnim.addUpdateListener(new AnimatorUpdateListener() {

                    @Override
                    public void onAnimationUpdate(ValueAnimator mAnim) {
                        // 0.0 -> 1.0f
                        float percent = mAnim.getAnimatedFraction();
                        PointF p = GeometryUtil.getPointByPercent(tempDragCenter, mStickCenter, percent);
                        updateDragCenter(p.x, p.y);
                    }
                });
                mAnim.setInterpolator(new OvershootInterpolator(4));
                mAnim.setDuration(500);
                mAnim.start();
            }

            break;

时间: 2024-11-10 12:02:20

黏性控件的使用的相关文章

C++ Builder中如何保持控件的位置及大小

C++ Builder/Delphi是Inprise(原Borland)公司广受欢迎的可视化C++/Pascal开发工具,利用它可极大地加快应用程序的开发速度.但是,也正因为其是可视化编程工具,将控件拖放到Form后,控件的位置就固定死了.随着Form的大小或屏幕分辨率的改变,控件和Form本身的位置往往变得非常混乱.本文将介绍一些正确定位控件及Form的方法. 利用OnResize事件改变控件位置及大小 C++ Builder/Delphi中的Form控件有一个OnResize事件,Form的

javaweb-网页调用ocx控件打开或创建注册表的权限问题

问题描述 网页调用ocx控件打开或创建注册表的权限问题 在某几个win7 64位笔记本上, 通过服务器页面调用ocx读取注册表会提示无权限的现象,但使用本地html文件调用没问题, 不知是何原因,求大侠给点提示 解决方案 又试了一下,使用世界之窗浏览器可以正常使用了.但不明白为何? 解决方案二: ie本地file协议浏览(intranet)和http访问(internet)使用的是不同的安全设置,你按照本地的intranet安全配置internet安全设置 不过你这种需求没什么意义,只能针对特殊

web-关于不用控件绑定数据的问题

问题描述 关于不用控件绑定数据的问题 各位大神 我是一名在校计算机系大学生 想请教一下现在企业里做web是不是不用vs里面自带的控件 如果不用控件 这个gridview绑定数据库的数据应该如何实现 能说详细点或者给个链接教程吗 先不说 mvc架构 我想先用代码去实现 再去学mvc 谢谢 求大神指点 解决方案 很难的 怎么有点看不到是什么啊 解决方案二: 对WEB来说.其实很简单.WEB中表格的本质是 <table><tr><td></td></tr&g

控件-mscomm串口波形绘制范例,求大神解析这三个函数,急急急,绘制波形图的原理是什么,拜托了

问题描述 mscomm串口波形绘制范例,求大神解析这三个函数,急急急,绘制波形图的原理是什么,拜托了 //串口void CPort_testDlg::OnComm() { //if(stop)return; VARIANT m_input1; COleSafeArray m_input2; long lengthi; BYTE data[600]; CString str; int ai=0bi=0ci=0di=0; int sum=0; if(m_Comm.GetCommEvent()==2)

Javascript 遍历页面text控件详解

 本篇文章主要是对Javascript遍历页面text控件进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助 以下函数实现了列出页面中所有html控件类型为text的控件ID    代码如下:         function Texts()          {               //var els= document.getElementsByTagName("*");   //els得到页面所有控件               var els= document.

充分利用 .NET 框架的 PropertyGrid 控件(微软)之二

控件|微软 创建 PropertyGrid 控件要使用 Visual Studio .NET 创建 PropertyGrid 控件,需要将该控件添加到工具箱中,因为默认情况下并不包含该控件.在 Tools(工具)菜单中,选择 Customize Toolbox(自定义工具箱).在对话框中选择 Framework Components(框架组件)选项卡,然后选择 PropertyGrid. 如果您从命令行编译代码,请使用 /reference 选项并指定 System.Windows.Forms.

如何用c#来制作一个activeX控件或类似的东西

active|activex|控件 Q cat: 操作系统: 2000/xp 编程工具: vs.net 2003 /c# 问题: 我想制作一个activeX控件或类似的东西,有用户界面的,然后想在ie中使用,通过Vbscript与其进行数据交换,在以前好像可以使用vb就能做到,但是现在是vs.net 2003企业版,好像已经进化了,activeX成了老的技术,那vs.net如何解决这种类似的问题?如果要使用c#来编程的话,具体如何操作?还要有界面. A回答: 在C#中和ActiveX控件对应的是

手机端产品交互设计:手机端产品翻页控件的设计

文章描述:对手机端产品翻页控件做的一些粗浅整理归纳.具体到设计应用中,我们需要根据产品性质.用户操作使用情景.手机和操作平台本身的特性等具体情况来考虑设计使用翻页控件. 翻页控件在很多手机端产品中属于容易被忽视但又不可或缺的一部分,今天就手机端产品翻页控件的分类和使用谈谈自己一些粗浅的看法. 在手机端产品中,翻页控件的展示形式五花八门:以所展示信息内容的性质和用户的使用情境作为维度划分的话,大致可以分为这样几个类型: A:时效类翻页控件 产品所展示的信息在"时效性""关联度&

iOS8新特性扩展(Extension)应用之四——自定义键盘控件

iOS8新特性扩展(Extension)应用之四--自定义键盘控件         iOS8系统的开放第三方键盘,使得用户在输入法的选择上更加自主灵活,也更加贴近不同语言的输入风格.这篇博客,将介绍如何开发一个第三方的键盘控件. 一.了解UIInputViewController类         UIInputViewController是系统扩展支持键盘扩展的一个类,通过这个类,我们可以自定义一款我们自己的键盘提供给系统使用.         首先,我们先来看一下这个类中的一些属性和方法: