首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

小程序也能做这么精致的动效?看完我给大神献上了膝盖…… | 开发

在这篇文章中,会详细介绍如何做出如图的交互效果,我们将根据 canvas 画布渲染圆球所需的步骤进行讲解。...如 GIF 图中所展示的效果,黏糊糊的粘连的路径是由 metaball 函数来创建出的,然后根据返回的路径坐标值,再基于贝塞尔曲线使用 canvas 画布绘制而成。...在两圆完全重合时,小圆不会出现;当两圆之间距离超出设置的最大连接距离时,两圆会完全分离不接触;而重点在于第三种情况,两圆有接触但没有完全重合。...touchstart 触发的事件回调函数中: 通过参数 e.touches[0].x/y 获取当前触摸点位置信息,并赋值给小圆的圆心位置变量。...touchmove 触发的事件回调函数中监听手指移动事件,将当前的触摸点位置信息赋值给小圆的圆心位置变量。

1.3K30

Android自定义View之仿QQ未读消息拖拽效果

效果图具有以下特性: 小圆点拖拽是有范围的 在拖拽范围进行拖拽后释放小圆点会进行回弹后回到初始位置 拖拽的时候,中心的圆会慢慢变小,拖拽的圆大小不变,中间连接的部分越来越长并且越来细,直至消失 如果超出定义的拖拽范围后进行释放会有爆炸的效果并且消失...3.2 绘制 中心的小圆和拖拽的小圆绘制小圆相对比较简单,直接调用canvas.drawCircle即可,定点中心圆的圆心是固定的,拖拽圆的圆形是手指触摸屏幕的坐标。...动态实现 静态效果绘制出来了,那么继续往下走,实现动态效果,实现动态无非是拖拽圆的切点和贝塞尔曲线的控制点在变化,而拖拽圆的圆心其实是触摸屏幕的坐标,那么其切点和控制点根据上一个步骤的公式来求出,下面直接在触摸方法...上面只做了超出拖拽范围的效果,下面添加没有超出拖拽范围效果,松开手后拖拽圆会回弹原来的位置,那就要在MotionEvent.ACTION_UP做处理: 1 //重写onTouchEvent方法...: 1 if(isOut){ 2 //如果一开始超出拖拽范围 后面又移动拖拽圆与中心圆的距离少于30,就恢复中心圆位置 3 if(getDistanceTwo

1.9K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    自定义View学习——仿QQ消息气泡拖拽黏连删除

    毕竟前人栽树后人乘凉,该控件又是通过手指触摸调用事件分发处理又是贝塞尔曲线的应用,多少目前能力有限,只有借鉴了。需要的文件图片请从文中提供的MessageBubbleView仿QQ消息控件下载。...参考博客:仿 QQ 未读消息气泡,可拖拽删除,粘连效果 参考博客中的实现思路: 首先我们需要两个圆,一个是在原点不需要跟随手指的圆,一个是跟随手指的圆,当用户开始点击时,绘制跟随手指的圆和圆上的未读消息数量...,同时在手指移动时,不停地判断两圆之间的距离是否超过我们所设定的最远距离,如果未超过这个距离,则在两圆之间,以两圆圆心的中间点为控制点绘制贝塞尔曲线,如果超过距离,则停止绘制贝塞尔曲线,两圆成独立状态移动...用户松开手指时,同样对两圆之间的距离进行判断,如在最远距离内,被拖动的圆自行回到原点,如超过最远距离,则在手指释放位置播放删除动画。 废话不多说,先看一下效果图: ?...dragRadius = centerRadius; } maxDragLength = (int) (4 * dragRadius); //设定圆的初始位置为

    1.5K30

    css实现圆形的四种方法

    该border-radius属性还将影响边框,阴影和元素的触摸/单击目标大小。...0.375em 0 0 rgba(15, 28, 63, 0.125); height: 5em; width: 5em; } 效果: # SVG SVG可以包含一个元素,该元素的样式可以类似于任何其他路径...它们得到了很好的支持,并且可以进行动画制作,但是与其他技术相比,它们需要更多的标记。为防止视觉上截断形状,请确保圆的半径(加上其笔触宽度的一半,如有)略小于SVG的半径viewBox。...> .circle { fill: #456BD9; stroke: #0F1C3F; stroke-width: 0.1875em; } 效果: # clip-path 剪切路径不会影响元素的布局...任何内容都将位于该形状的顶部,但其布局(包括触摸/点击目标大小)将不受影响。根据浏览器的不同,圆的边缘可能会出现锯齿状或模糊不清。

    3K20

    如何实现一个丝滑的点击水波效果

    本文为Varlet组件库源码主题阅读系列第九篇,读完本篇,可以了解到如何使用一个div创建一个点击的水波效果。...Varlet组件库提供了一个使元素点击时生成水波扩散效果的指令: 点击 图片 接下来就从源码角度看看它是如何实现的...div元素,然后设置它的透明度为0、初始位置、缩放、大小、背景颜色,然后添加为被点击元素的子元素,最后在20ms以后修改div的位置、缩放、透明度,只要设置了它的transation过渡属性即可实现过渡效果...;手指点击的位置是水波圆初始的中心点,然后计算其左上角坐标x、y为水波元素的初始位置;水波圆的最终中心点其实就是被点击元素的中心点,换算成左上角坐标centerX、centerY即为水波元素的最终位置。...因为水波元素为被点击元素的子元素,所以这些坐标都是相对于被点击元素的左上角坐标计算的: 从绿色的圆过渡成红色的圆,透明度、大小、位置的变化就是水波的扩散效果。

    60820

    手把手教你写一个经典躲避游戏

    故本文仅在于抛砖引玉,向大家介绍我是如何从零到一,一步一步完成一款能游玩的页面小游戏。如果你本是游戏行业的开发者或是打算步入游戏行业的开发者,建议阅读专业性更强的书籍和学习专业的游戏框架与游戏知识。...123): 第一种是在A点左边时 u 是负数,最近的点为 A 点 第二种是在B点右边时投影超出边的长度,最近的点为 B 点 第三种就是圆正好在边的正上方,最近的点为 C 点 得到圆心距离边最近的点后,...值得注意的是,当我们触摸位置在摇杆中心的时候,玩家是不移动的,这样游戏可操作性就高很多。...所以我们加个 getter 方便后续判断: 然后在更新玩家位置时,再根据控制方式不同区分处理,计算手指触碰位置与摇杆中心的角度就是玩家移动的角度: 最后我们再把摇杆绘制到屏幕上就完成了,具体实现也很简单...,就是画两个圆,一个是大的背景圆,一个是玩家目前移动方向的摇杆圆。

    1.3K20

    手撕一个让人「欲罢不能」的水波纹选中控件

    下边就来看看如何通过自定View的方式实现一个水波纹选中的效果。...自定义水波纹选中控件的步骤 仔细看下这个点击选中的过程,可以拆分为以下几个过程: 获取点击的位置坐标 以点击位置为原点,不断绘制半径不断扩大的同心圆 提升控件 z轴,其实就是绘制阴影 控件圆角裁剪 三、...计算水波纹最长半径 看一个简单的 gif 动画 ? 水波纹 这里以控件中心为例,同心圆不断扩展,最后覆盖整个控件。我们知道,同心圆绘制的时候,超出控件的部分会被自动截断,所以最后效果是这样的 ?...水波纹 要想覆盖整个控件,则 同心圆的最长半径,等于触摸点到控件 四个顶点 四个距离中最长的那个,而半径的大小只要利用 勾股定理 就可以计算出来。 ?...五、收尾 最后就是一些收尾处理了: 加入xml可配置属性,如水波纹颜色,阴影大小,阴影颜色,圆角大小等 加入状态回调,把当前水波纹的状态传递出去 ....

    1.1K40

    自定义View进阶路:绘制饼图

    首先,我们肯定会需要一个占比,这里的意思代表在整个圆显示的一个比例,其次,如果需要根据不同的比例显示不同的颜色区域,我们同样也需要一个颜色值。...将点击的坐标位置转化为以饼状图中心为原点的坐标,对坐标进行处理,之后将坐标转化为点击的角度,判断是否处于某一个饼状图所在的角度区域 接下来我们开始获取当前视图左边缘、上边缘以及圆心坐标。...// 获取用户点击的位置距当前视图的左边缘距离 float x = event.getX(); // 获取用户点击的位置距当前视图的上边缘距离 float y = event.getY(); // 将点击的...返回-1(1+1) -2  int searchResult = Arrays.binarySearch(mStartAngles, touchAngle);  // 防止点击边缘位置 增加判断...mTouchmRectF.right = mRadius + 15; // 右 mTouchmRectF.bottom = mRadius + 15; // 下 接下来,我们只需要在onDraw方法中通过之前我们存储的位置去判断什么时候绘制被触摸的扇形区域或绘制饼图

    73120

    CALayer 图层概念二、CALayer属性二、方法

    其实,对比CALayer,UIView多了一个事件处理的功能,也就是说,CALayer不能处理用户的触摸事件,而UIView可以.所以,如果显示出来的东西需要跟用户进行交互的话,用UIView.UIView...用来接收和处理系统事件,触摸事件.如果不需要跟用户进行交互,用UIView或者CALayer都可以.当然,CALayer的性能会高一些,因为它少了事件处理的功能,更加轻量级 ---- 二、CALayer...view的clipToBounds 裁剪多余边缘 设置photoView中的所有子控件如果超出了photoView的有效范围,那么超出的部分将不会显示 photoView.clipsToBounds...= YES ; 设置两边多余地方不裁剪 button.imageView.clipsToBounds = NO; 路径绘制,绘图剪裁 矩形图片剪裁成圆并且外面设置圆环并存储 给layer设置背景图片...对应) - (void)removeAnimationForKey:(NSString *)key; 6、layer动画移动后回到原位置的解决办法: 方法一 :layer 的真实位置还在原来的位置

    1.4K70

    这里有一份史上最详细仿QQ未读消息拖拽粘性效果的实现,快来收藏!

    根据上面的分析我们得出绘制步骤: 1、在指定位置绘制起始圆(圆中间可以带数字) 2、使用贝塞尔曲线绘制两圆之间的连接带 3、处理onTouchEvent事件(down、move、up) 4、添加一些动画特效...ok了,还费什么话先看看效果咋样,先把终点圆坐标定死在一个位置看下效果,为了方便看到绘制的路径我们把画笔样式设为STROKE ?...3、处理onTouchEvent事件 3.1、处理ACTION_DOWN事件 手指按下的时候我们要判断手指所在位置是不是在起点圆上,只有按到起点圆上之后拖拽才有效,还记得我们文章开始的时候定义的变量mIsCanDrag...3.3、处理ACTION_UP事件 手指抬起的时候我们要判断抬起的时候终点圆所在位置和起点圆的圆心距是否超过设置最大距离,如果没有超过就还原拖拽状态,只保留一个起点圆,如果超过了最大距离就让圆消失...,显示在需要的位置,当用户触摸到view的时候把view从当前布局中移除,使用windowManage去addView(view)把我们的可拖拽View添加到window层,铺满屏幕,注意初始位置定位即可实现

    65710

    史上最详细仿QQ未读消息拖拽粘性效果的实现

    根据上面的分析我们得出绘制步骤: 1、在指定位置绘制起始圆(圆中间可以带数字) 2、使用贝塞尔曲线绘制两圆之间的连接带 3、处理onTouchEvent事件(down、move、up) 4、添加一些动画特效...ok了,还费什么话先看看效果咋样,先把终点圆坐标定死在一个位置看下效果,为了方便看到绘制的路径我们把画笔样式设为STROKE ?...3、处理onTouchEvent事件 3.1、处理ACTION_DOWN事件 手指按下的时候我们要判断手指所在位置是不是在起点圆上,只有按到起点圆上之后拖拽才有效,还记得我们文章开始的时候定义的变量mIsCanDrag...3.3、处理ACTION_UP事件 手指抬起的时候我们要判断抬起的时候终点圆所在位置和起点圆的圆心距是否超过设置最大距离,如果没有超过就还原拖拽状态,只保留一个起点圆,如果超过了最大距离就让圆消失...,显示在需要的位置,当用户触摸到view的时候把view从当前布局中移除,使用windowManage去addView(view)把我们的可拖拽View添加到window层,铺满屏幕,注意初始位置定位即可实现

    83520

    史上最详细仿QQ消息拖拽粘性效果

    至此关于贝塞尔曲线这部分就介绍完了,下边把圆个弧度代码串联起来就ok了,还费什么话先看看效果咋样,先把终点圆坐标定死在一个位置看下效果,为了方便看到绘制的路径我们把画笔样式设为STROKE ?...3 处理onTouchEvent事件 3.1 处理ACTION_DOWN事件 手指按下的时候我们要判断手指所在位置是不是在起点圆上,只有按到起点圆上之后拖拽才有效,还记得我们文章开始的时候定义的变量mIsCanDrag...3.2 处理ACTION_MOVE事件 手指按在起点圆是可move的前提,然后根据手指滑动取出移动点位置的坐标,这就是可拖拽的终点圆的坐标。 ?...3.3 处理ACTION_UP事件 手指抬起的时候我们要判断抬起的时候终点圆所在位置和起点圆的圆心距是否超过设置最大距离,如果没有超过就还原拖拽状态,只保留一个起点圆,如果超过了最大距离就让圆消失。...固定自定义view大小为圆的大小,显示在需要的位置,当用户触摸到view的时候把view从当前布局中移除,使用windowManage去addView(view)把我们的可拖拽View添加到window

    81520

    如何用UIKit做一个转轮(3)

    A Digression Into Trigonometry(三角函数的介绍) 在学校里我们都学过如何用度表示角度,并且我们都知道一个圆有360度。...如果你根据上面图片中红线对圆的周长进行分割并你把它画直为一条直线,这条线会跟圆的半径有相同的长度。 换句话说,如果按一个角度划分的弧的长度等于半径,那么这个角度的大小为1弧度。非常酷!不是么?...另一个重要的情况是,除了半径的长度,一整个圆还有2*PI个弧度。当你把旋转应用到转轮上时会非常有用。你会把圆分割成8个相等的块,所以每个块大约0.78弧度,即2*PI/8。 ?...你会从左侧触摸这个圆,按顺时针方向转,所以0弧度应该在左侧。下面的图片显示了你这个方案中八个扇区的角度和弧度的值。 ? 黑色的小点代表每个扇区在弧度上的中间点。...NO,表明组件不会处理此次触摸事件。

    80310

    Android自定义View

    :对两个按钮的单击事件进行处理,单击“返回”键的时候提示并结束当前Activity,单击“操作”按钮的时候进行提示。...-- 加入自定义的控件 --> 布局文件也比较简单,值得注意的是使用自定义控件要写完整的类的路径名,当然,也可以使用 在加载layout...文件夹中的布局文件,这样的话就得在activity_main.xml对应的类文件中书写加载的布局文件的事件处理逻辑,否则这个加载的布局文件就没有事件处理效果了 最后是MaiActivity.java...:onTouch // TODO 自动生成的方法存根 myDetector.onTouchEvent(event); // 触发手势探测器的触摸事件方法...(MotionEvent e1, MotionEvent e2, float vX, float vY) { /* * e1:手指在屏幕触摸的开始位置

    60710

    现代浏览器探秘(part4):事件处理

    当发生类似在屏幕上的触摸的用户动作时,浏览器是最先先接收到动作的进程之一,但是浏览器进程只知道该动作发生的位置。...图1:通过浏览器进程路由到渲染器进程的输入事件 合成器接收输入事件 在上一篇文章中,我们研究了合成器是如何通过合成栅格化图层来平滑地处理滚动的。...对于输入来说,典型的触摸屏设备每秒发送60-120次触摸事件,而典型的鼠标每秒发送100次事件。 输入事件具有比屏幕刷新更高的保真度。...在这种情况下,你可以在鼠标事件中使用getCoalescedEvents方法来获取有关这些合并事件的信息。 ? 图9:左侧是平滑的触摸手势路径,右侧是合并限制路径 ?...这可以防止你的代码阻止解析器,并且浏览器也不需要担心暂停解析器。 总结 ? thank you(图中有作者的推特) 当开始构建网站时,我几乎只关心如何编写代码以及怎样才能帮助我提高工作效率。

    1.3K20

    cocos2d-objc 3.0+ 游戏开发学习手册(三): CCAction 的简单使用与触摸

    本文通过对CCAction的简单使用示例,帮助大家了解在实际应用中如何借助这些Action实现自己的动画效果....,这就需要我们监听某个动画的完成情况.cocos2d中我们常常使用CCActionCallFunc来监听一个动画结束后的回调处理....: - (void)touchBegan:(UITouch *)touch withEvent:(UIEvent *)event{ // 获取触摸位置 CGPoint...如果点击触摸在屏幕边缘的时候,我们发现精灵会有一部分内容超出屏幕,导致显示不完整.例如下图: 精灵超出屏幕 另外,我们希望移动的时间可以根据距离变化而不同,最后的代码如下: - (void)...中提供的action也非常丰富,希望大家能够通过基本的练习可以触类旁通,因为它们都用法都十分相近,掌握起来也不会特别困难.例如大家可以思考一下如何实现一个始终运动的游戏背景,就像下面这样: 运动背景 悄悄提示

    63430
    领券