`
lexsain
  • 浏览: 17756 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

安卓手机QQ红点拖拽消除的实现

阅读更多

新版手机QQ5.+上新增了一种“一键退朝”的功能,即在页面上的红点可进行拖拽消除。按照设计思路在Android上模仿手Q实现下拖拽的过程。

bezier

 

整体的思路,封装好一个view。在界面上找到四个点,即框出手势拖动点与红点之间的范围,利用贝塞尔曲线修饰边框,计算红点和手势拖动点间的距离,判断红点的消除与回弹。
借用下设计图:

20141125101909968

 

首先确定以红点为坐标原点,在坐标上所要计算的就是p1, p2, p3, p4四个点,其中..为贝塞尔曲线,在p1p2和p3p4之间需要绘制半径为R和r的圆。

接下来需要的就是在拖动过程中计算(0,0)和(x0, y0)两点间的距离,通过距离控制贝塞尔曲线的弧度和圆的大小,实现模拟现实生活中弹性效果。

在代码中通过Path来控制p1, p2, p3, p4四个点所围成的范围,并填充相应地色值:

1.确定四个点,这里简单地将两个圆起始半径设置相等

 

01 float x1 = startX - offsetX; 
02 float y1 = startY + offsetY; 
03    
04 float x2 = x - offsetX; 
05 float y2 = y + offsetY; 
06    
07 float x3 = x + offsetX; 
08 float y3 = y - offsetY; 
09    
10 float x4 = startX + offsetX; 
11 float y4 = startY - offsetY; 
12    
13 path.reset(); 
14 path.moveTo(x1, y1); 
15 path.quadTo(anchorX, anchorY, x2, y2); 
16 path.lineTo(x3, y3); 
17 path.quadTo(anchorX, anchorY, x4, y4); 
18 path.lineTo(x1, y1); 

2.填充范围和绘制圆形:

1 canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.MULTIPLY); 
2 canvas.drawPath(path, paint); 
3 canvas.drawCircle(startX, startY, radius, paint); 
4 canvas.drawCircle(x, y, radius, paint); 

3.在调用super.onDraw(canvas);方法绘制在canvas层上面的消息点图标imageView
通过在代码中的onTouchEvent方法进行控制触摸点的相应位置,实现拖动的效果。

01 @Override 
02     public boolean onTouchEvent(MotionEvent event) { 
03         if(event.getAction() == MotionEvent.ACTION_DOWN){ 
04             // 判断触摸点是否在tipImageView中 
05             Rect rect = new Rect(); 
06             int[] location = new int[2]; 
07             tipImageView.getDrawingRect(rect); 
08             tipImageView.getLocationOnScreen(location); 
09             rect.left = location[0]; 
10             rect.top = location[1]; 
11             rect.right = rect.right + location[0]; 
12             rect.bottom = rect.bottom + location[1]; 
13             if (rect.contains((int)event.getRawX(), (int)event.getRawY())){ 
14                 isTouch = true
15             
16         }else if(event.getAction() == MotionEvent.ACTION_UP || event.getAction() == MotionEvent.ACTION_CANCEL){ 
17             isTouch = false
18             tipImageView.setX(startX - tipImageView.getWidth()/2); 
19             tipImageView.setY(startY - tipImageView.getHeight()/2); 
20         
21         invalidate(); 
22         if(isAnimStart){ 
23             return super.onTouchEvent(event); 
24         
25         anchorX =  (event.getX() + startX)/2
26         anchorY =  (event.getY() + startY)/2
27         x =  event.getX(); 
28         y =  event.getY(); 
29         return true
30     

4.拖动过程中计算两个圆心之间的距离,通过圆心间的距离调整圆心为(0, 0)圆的半径大小

1 float distance = (float) Math.sqrt(Math.pow(y-startY, 2) + Math.pow(x-startX, 2)); 
2 radius = -distance/15+DEFAULT_RADIUS; 

用新的半径去绘制(0, 0)的圆,这样随着距离的增加,圆相应变小就给人如同快要沾不住黏黏的感觉。
5.距离超过设定的最大范围,则设置为红点挣脱状态,如果手指抬起,则开始播放相应爆炸动画。

1 exploredImageView.setVisibility(View.VISIBLE); 
2 exploredImageView.setImageResource(R.drawable.tip_anim); 
3 ((AnimationDrawable) exploredImageView.getDrawable()).stop(); 
4 ((AnimationDrawable) exploredImageView.getDrawable()).start();

6.在Activity布局中引用相应封装好的view即可。

1 <github.chenupt.bezier.BezierView 
2         android:layout_width="match_parent" 
3         android:layout_height="match_parent" 
4         android:background="@android:color/transparent" /> 

最开始设想的view在类似于红点范围的一个控件,但是这样实现就达不到拖动到父类控件的范围之外,比如拖动红点超过页签布局范围时,红点则无法绘制。因此在QQ的消息列表中是将其设置相应全屏的一个view。背景为截图的上个背景,这样在最上一层实则只有红点的控件。这样就能相应地拖动红点到屏幕的各个位置。所以才会在红点列表爆照动画结束之前页签是不可点击,并且拖动红点的时候列表数据没有刷新。

分享到:
评论

相关推荐

    模仿手机QQ红点消除功能

    手机QQ红点消除的功能大家应该印象很深,我一直奇怪微信为什么不跟进这个功能,毕竟消息太多。 功能图如下: ![这里写图片描述](http://img.blog.csdn.net/20151118101649390) 简单的功能描述是这样的:**新消息...

    android仿qq拖拽小红点demo

    android仿qq拖拽小红点demo qq小红点可以拖动相信大家已经玩过了,用户体验也非常的好.效果很不错 思路:小红点是可以拖拽到原来的控件外面的, 那么就在点击下去之后在它的最外层添加一个覆盖层来在小红点所在位置...

    仿qq拖拽红点效果

    实现"仿qq拖拽红点效果"的过程中,开发者可能需要结合前端技术(如HTML5, CSS3, JavaScript)以及移动开发平台(如Android, iOS)的相关知识。对于Web应用,可能还需要利用框架(如React, Vue等)来简化开发流程。总...

    仿QQ消息提醒小红点拖拽粘连效果

    在Android应用开发中,"仿QQ消息提醒小红点拖拽粘连效果"是一个常见的交互设计,用于模拟QQ等即时通讯应用中的未读消息提示。这个设计不仅提升了用户体验,也使得用户能直观地感知到有新的消息等待查看。在本文中,...

    仿QQ拖动红点消除

    一款仿QQ,拖拽消除红点的自定义View,可以很简单的进行使用,还有另一款http://jcodecraeer.com/a/opensource/2015/0203/2406.html,也可以实现同样的效果

    unity实现仿QQ红点拖动效果

    unity实现防QQ红点拖动效果,拖动,还原,回调等,完美实现。

    仿QQ可拖动小红点

    综上所述,实现仿QQ可拖动小红点涉及到了Android UI设计、自定义View开发、触摸事件处理、手势识别、布局管理、动画效果、数据绑定以及代码组织等多个技术点。通过学习和实践这些知识点,开发者可以创建出更加丰富和...

    Android带拖拽效果的红点提示控件 DragIndicatorView

    Android带拖拽效果的红点提示控件 DragIndicatorView

    安卓消息小红点

    在安卓应用开发中,"安卓消息小红点"是一个常见的功能,用于提示用户有未读消息或者更新。这个功能的设计通常简洁而引人注意,一个小红点悬挂在应用图标或菜单项旁边,提醒用户有待处理的内容。在本案例中,开发者...

    安卓QQ相关相关-仿qq拖拽红点效果.rar

    这个压缩包“安卓QQ相关相关-仿qq拖拽红点效果.rar”可能包含了实现这一效果的相关代码和资源,尽管无法逐一验证所有文件的可用性,但我们可以探讨一下实现这种效果的关键技术和知识点。 首先,拖拽红点效果的核心...

    仿QQ消息红点

    在Android开发中,"仿QQ消息红点"的实现是一个常见的需求,主要用于提示用户有未读消息或更新。这个功能的实现主要涉及到自定义View的知识,这也是【标签】所指出的关键点。下面将详细讲解如何创建一个可拖动的、...

    iOS 数字红点角标仿QQ拖拽清除

    本文将深入探讨如何在iOS中实现QQ风格的数字红点角标,并支持拖拽清除功能。这一特性使得用户体验更加友好,因为用户可以直接通过拖动角标来消除通知,而无需进入具体页面进行操作。 首先,我们需要了解数字红点角...

    仿QQ消息小红点效果

    本项目旨在教你如何在自己的Android应用中实现类似QQ的消息小红点效果,让用户能清晰地看到有未读内容的提示。 首先,我们需要了解“QQ消息小红点”的基本概念。它通常是一个红色的小圆点,出现在应用图标或者某个...

    博客《自定义控件三部曲之绘图篇(十五)——QQ红点拖动删除效果实现(基本原理篇)》

    博客《自定义控件三部曲之绘图篇(十五)——QQ红点拖动删除效果实现(基本原理篇)》对应源码,博客地址:http://blog.csdn.net/harvic880925/article/details/51615221

    ios-红点拖拽,爆炸效果.zip

    红点拖拽 支持拖拽黏滞效果, 支持松手取消, 黏滞效果距离偏移可控, 完成距离偏移可控, github: https://github.com/Modool/EVRElasticViewReference

    仿qq消息提示可拖动小红点

    在Android开发中,"仿qq消息提示可拖动小红点"是一个常见的用户界面(UI)设计元素,常用于表示应用内有未读消息或更新。这个设计灵感来源于QQ这款流行的即时通讯应用,其小红点提示用户有新的消息或者通知,而拖动...

    Android-Android-NavMenu-master一个底部导航栏实现了显示未读消息数显示红点等效果的封装

    在这个项目中,红点可能是通过设置自定义View或者使用Android的Drawable资源来实现的。开发者可能会根据是否有未读消息或者其他特定条件来动态显示或隐藏红点。 至于"smashinggit-Android-NavMenuLayout-28c5a91"这...

    WPF C#仿ios 安卓 红点消息提示

    在本文中,我们将深入探讨如何使用C#和WPF(Windows Presentation Foundation)技术来实现一个类似于iOS和Android设备上常见的右上角红点消息提示功能。这个功能在UI设计中非常常见,通常用来表示未读通知或者更新...

Global site tag (gtag.js) - Google Analytics