用Canvas和属性动画造一只萌蠢的“小鬼”

HTML Canvas圆形旋转加载动画特效 在本文中,我们将展示如何使用HTML Canvas创建一个简单而漂亮的圆形旋转加载动画特效。我们将使用JavaScript编写代码来实现这个动画,并通过HTML和CSS将其嵌入到网页中。您可以将上述代码复制粘贴到一个HTML文件中,并在浏览器中打开它,以查看动画效果。您还可以根据自己的需要进行样式和动画参数的调整,以创建更加个性化的加载动画效果。最后,我们可以通过CSS样式对Canvas元素进行一些样式上的调整,例如设置边框样式。在上面的代码中,我们将Canvas元素的边框设置为1像素的黑色边框。 阅读详情

最近没事的时候想自己写一个支持下拉刷新,上拉加载的自定义View。写着写着,就觉得最常见的“一个圈转啊转”的进度条太普通了。
于是,就想看看有没有更有趣的一点的加载效果。在GitHub上以”android loading”为关键字一搜索,就发现有作者开源了这么一个库:

这里写图片描述

库的地址是:https://github.com/ldoublem/LoadingView。里面提供了很多有趣的加载动画(非常棒),个人对其中如下一个效果产生了兴趣:

这里写图片描述

那么,开源的好处就来了,立刻打开源码瞧一瞧别人是怎么实现的吧。一看发现没有借助任何图片,而就是通过canvas配合属性动画完成的整个效果。
按理说别人造好的轮子,我们直接拿来用就好了。但既然感兴趣,为什么不学习一下别人的思路,自己也来实现一个,从而得到提高呢?
所以,综合一想,自己也重新来画一画这个萌蠢萌蠢的小鬼吧。并通过此文来总结一下整个自定义view的思路和收获。
(P.S:会借鉴原作者的思路,但具体实现细节会有不同,但思路当然才是最重要的,具体实现选择自己喜欢的就好)


自定义View的建立

其实说起绘画,就想起了小时候流行的一个口诀,是画“丁老头”的,印象中有“一个丁老头儿,借我俩煤球儿,我说三天还,他说四天还..”之类的。
其实就是这样的,如果猛的一下让我们画个“老头儿”出来,我们可能会有点懵逼。但按照口诀那样一部分一部分的画,似乎就变得容易多了。

所以,我们也可以模仿这个思路来画这个小鬼。我们简单分析一下,可以发现这个小鬼的构成其实就是:头 + 眼睛 + 身体 + 影子。
那么,还等什么呢?赶紧按照这个思路“开画”吧!首先,我们当然是新建一个类,并让其继承View,而名字的话就叫GhostView好了。


onMeasure()

在正式开始“作画”之前,我们肯定是做好相关的准备工作。比如,先确定好要用多大尺寸的“画纸”。哈哈,其实也就是完成View的measure工作。
我们知道自定义View的时候,如果使用默认的onMeasure()方法:WRAP_CONTENT也会被当做MATCH_PARENT来测量,所以其实要做的也很简单:

    // View宽高
    private int mWidth, mHeight;
    // 默认宽高(WRAP_CONTENT)
    private int mDefaultWidth = dip2px(120);
    private int mDefaultHeight = dip2px(180);

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        setMeasuredDimension(measureWidth(widthMeasureSpec), measureHeight(heightMeasureSpec));
    }

    private int measureWidth(int widthMeasureSpec) {
        int specMode = MeasureSpec.getMode(widthMeasureSpec);
        int specSize = MeasureSpec.getSize(widthMeasureSpec);
        if (specMode == MeasureSpec.EXACTLY) {
            mWidth = specSize;
        } else if (specMode == MeasureSpec.AT_MOST) {
            mWidth = Math.min(mDefaultWidth, specSize);
        }
        return mWidth;
    }

    private int measureHeight(int heightMeasureSpec) {
        int specMode = MeasureSpec.getMode(heightMeasureSpec);
        int specSize = MeasureSpec.getSize(heightMeasureSpec);
        if (specMode == MeasureSpec.EXACTLY) {
            mHeight = specSize;
        } else if (specMode == MeasureSpec.AT_MOST) {
            mHeight = Math.min(mDefaultHeight, specSize);
        }
        return mHeight;
    }

非常简单,思路就是:

  • 当View的宽高指定为MATCH_PARENT或者明确的值的时候,就使用实际的值。
  • 当View的宽高指定为WRAP_CONTENT时,宽度为默认的120dp,高度则为180dp。

Paint,准备画笔

显然,想要画东西,当然我们还需要画笔。可以从之前的效果图里看到,“小鬼”的整个形象需要三种颜色元素,分别是:
白色的身体、黑色的眼睛、以及灰灰的影子。所以,对应来说,我们也需要准备三支不同颜色的画笔:

    // 画笔
    Paint mBodyPaint, mEyesPaint, mShadowPaint;
    private void initPaint() {
        mBodyPaint = new Paint();
        mBodyPaint.setAntiAlias(true);
        mBodyPaint.setStyle(Paint.Style.FILL);
        mBodyPaint.setColor(Color.WHITE);

        mEyesPaint = new Paint();
        mEyesPaint.setAntiAlias(true);
        mEyesPaint.setStyle(Paint.Style.FILL);
        mEyesPaint.setColor(Color.BLACK);

        mShadowPaint = new Paint();
        mShadowPaint.setAntiAlias(true);
        mShadowPaint.setStyle(Paint.Style.FILL);
        mShadowPaint.setColor(Color.argb(60, 0, 0, 0));
    }

从“头”开始,画个圆脑袋

现在我们的准备工作都做好了,自然就可以正式开始画这个“小鬼”了。我们先从最容易画的入手,搞个圆圆的脑袋出来:

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        drawHead(canvas);
    }

    // 头部的半径
    private int mHeadRadius;
    // 圆心(头部)的X坐标
    private int mHeadCentreX;
    // 圆心(头部)的Y坐标
    private int mHeadCentreY;
    // 头部最左侧的坐标
    private int mHeadLeftX;
    // 头部最右侧的坐标
    private int mHeadRightX;
    // 距离View顶部的内边距
    private int mPaddingTop = dip2px(20);

    private void drawHead(Canvas canvas) {
        mHeadRadius = mWidth / 3;
        mHeadCentreX = mWidth / 2;
        mHeadCentreY = mWidth / 3 + mPaddingTop;
        mHeadLeftX = mHeadCentreX - mHeadRadius;
        mHeadRightX = mHeadCentreX + mHeadRadius;
        canvas.drawCircle(mHeadCentreX, mHeadCentreY, mHeadRadius, mBodyPaint);
    }

代码同样很简单,事实上现在我们就可以使用这个自定义View,来看一看目前为止的效果了:

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/colorPrimary">

    <me.rawn_hwang.ghostdrawer.Ghost
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:background="@color/colorAccent" />

</RelativeLayout>

这里写图片描述

。。。。。。。。好吧,目前为止我们还看不到任何“萌蠢小鬼”的迹象。没关系,一步一步的来。


谁说“鬼”就没影子

有了小鬼的头之后,我们接着做什么呢?正常来说我们应该想着接着画身体。但是从之前的效果图我们可以看到,小鬼的底部是有一个影子的。
所以,个人选择先画这个影子。因为:影子位于View的底部,先完成影子的绘画,之后更方面我们确定小鬼身体的高度和位置。

其实所谓的影子也非常的简单,就是一个灰蒙蒙的“椭圆形”而已:

    // 影子所占区域
    private RectF mRectShadow;
    // 小鬼身体和影子之间的举例
    private int paddingShadow;

    private void drawShadow(Canvas canvas) {
        paddingShadow = mHeight / 10;
        mRectShadow = new RectF();
        mRectShadow.top = mHeight * 8 / 10;
        mRectShadow.bottom = mHeight * 9 / 10;
        mRectShadow.left = mWidth / 4;
        mRectShadow.right = mWidth * 3 / 4;
        canvas.drawArc(mRectShadow, 0, 360, false, mShadowPaint);
    }

这个时候,我们再来看一看效果变成了什么样子:

这里写图片描述


重头戏,加上身体

现在,我们就来到了最关键的部分了:为小鬼加上身体。其实总的来说,小鬼的身体就是在头部大约半圆的位置,分别画上两条带有弧度的延长线。
但是,怎么才能让小鬼身体的这两条线与头部比较完美的融合呢?原作者在这里使用了一些正弦、余弦的公式来计算圆的弧度,从而完成了需要。
然而,悔不及当初没有好好念书啊,患上了晕“数学公式”的病。所以我机智的选择用另一种方法,虽然没那么高大上,但是比较简单。就像下面这样:

    private Path mPath = new Path();
    // 小鬼身体胖过头部的宽度
    private int mGhostBodyWSpace;

    private void drawBody(Canvas canvas) {
        mGhostBodyWSpace = mHeadRadius * 2 / 15;
        // 先画右边的身体
        mPath.moveTo(mHeadLeftX, mHeadCentreY);
        mPath.lineTo(mHeadRightX, mHeadCentreY);
        mPath.quadTo(mHeadRightX + mGhostBodyWSpace, mRectShadow.top - paddingShadow,
                     mHeadRightX - mGhostBodyWSpace, mRectShadow.top - paddingShadow);

        canvas.drawPath(mPath,mBodyPaint);
    }

这里写图片描述

上图中左边的部分就是我们目前为止得到的效果;而右边就是通过把画笔设置为stroke来解释这样做的原理,实际上就是:先通过lineTo在小鬼头部的中间画一条直径,这个时候path的LastPoint就到了最右边的这个点,然后我们从这个点在右边向下画一条二阶贝塞尔曲线,就有了小鬼右边身体的轮廓了。

那么接着我们该做什么呢?回忆一下,我们发现小鬼的身体下方是有“波纹”的,就想裙子的褶皱一样,所以我们现在就给添上裙子。
其实原理仍然很简单,这个时候path的LastPoint也已经移动到了小鬼右边身体的下面,我们从这里开始向左不断画多个贝塞尔曲线形成裙褶就行了:

    // 单个裙褶的宽高
    private int mSkirtWidth, mSkirtHeight;
    // 裙褶的个数
    private int mSkirtCount = 7;

    private void drawBody(Canvas canvas) {
        mGhostBodyWSpace = mHeadRadius * 2 / 15;
        mSkirtWidth = (mHeadRadius * 2 - mGhostBodyWSpace * 2) / mSkirtCount;
        mSkirtHeight = mHeight / 16;

        // ......

        // 从右向左画裙褶
        for (int i = 1; i <= mSkirtCount; i++) {
            if (i % 2 != 0) {
                mPath.quadTo(mHeadRightX - mGhostBodyWSpace - mSkirtWidth * i + (mSkirtWidth / 2), mRectShadow.top - paddingShadow - mSkirtHeight,
                        mHeadRightX - mGhostBodyWSpace - (mSkirtWidth * i), mRectShadow.top - paddingShadow);
            } else {
                mPath.quadTo(mHeadRightX - mGhostBodyWSpace - mSkirtWidth * i + (mSkirtWidth / 2), mRectShadow.top - paddingShadow + mSkirtHeight,
                        mHeadRightX - mGhostBodyWSpace - (mSkirtWidth * i), mRectShadow.top - paddingShadow);
            }
        }

        canvas.drawPath(mPath,mBodyPaint);
    }

这里写图片描述

可以看到到了现在,基本就能看见整个小鬼的轮廓了,但我们注意到小鬼左边似乎有点僵硬。没关系,我们也给他加上一点对应的弧度就行了:

        mPath.quadTo(mHeadLeftX - mGhostBodyWSpace, mRectShadow.top - paddingShadow, mHeadLeftX, mHeadCentreY);

这里写图片描述


画“鬼”点睛

到了现在,我们的绘图工作其实基本就已经完成了。但眼睛是心灵的窗户,少了眼睛,这个小鬼看上去有点四不像的感觉。赶紧加上眼睛吧!

同样的,眼睛的绘制其实也非常简单,就在先要的位置,画上两个黑色的小圆就可以了:

    private void drawEyes(Canvas canvas) {
        canvas.drawCircle(mHeadCentreX , mHeadCentreY, mHeadRadius / 6, mEyesPaint);
        canvas.drawCircle(mHeadCentreX + mHeadRadius / 2, mHeadCentreY, mHeadRadius / 6, mEyesPaint);
    }

现在我们所有的绘制工作就完成了,把之前粉红色的背景颜色去掉,再看看效果,是不是有点呆萌的赶脚了呢?

这里写图片描述


让小鬼动起来

现在小鬼我们已经画完了,剩下的工作自然就是让它动起来,别死气沉沉的。而我们已经知道了,这个工作就是通过属性动画来完成的。

那么,我们可以添加一个最简单的位移动画,比如说这样做:

    private void startAnim(){
        ObjectAnimator animator = ObjectAnimator.ofFloat(this,"translationX",0,500);
        animator.setRepeatMode(ObjectAnimator.RESTART);
        animator.setRepeatCount(ObjectAnimator.INFINITE);
        animator.setDuration(5000);
        animator.start();
    }

    @Override
    protected void onDraw(Canvas canvas) {
        // ......
        startAnim();
    }

这里写图片描述

可以看到这样“小鬼”就已经动起来了,不过现在它肯定没有那么萌了。因为它的行进路径和恐怖片里那些白衣幽灵看上去一样一样的。
不过这里主要是表达个意思嘛,要实现作者原本的那个动画效果实际上也不难,我们分析一下可以发现它主要有几个动作:
就是小鬼在行进的同时还会上下跳动,并且底部的影子会随着小鬼跳起和落下而改变大小,那么我们就可以借助ValueAnimator来实现。
简单来说,要做的工作就是之前描绘小鬼时的相关属性(例如小鬼的头部的圆心坐标,影子的rect的宽度等)不要写死,而是与某个值产生关联。
然后我们用ValueAnimator来监听和不断的改变这个值,然后让view不断重绘,就可以得到响应的一些动画效果了。

智慧农业小程序端开发实战:WebSocket与ECharts难点拆解 物联网系统通常由感知层、传输层和应用层构成,而应用层的人机交互界面直接决定用户对系统的感知。在智能农业、智能家居等场景中,实时数据展示与远程控制依赖稳定高效的前端通信机制。WebSocket长连接凭借低延迟、双向通信特性,成为设备数据实时推送的首选方案;ECharts则提供灵活的可视化图表,用于呈现历史趋势。然而,在微信小程序环境中,开发者常面临WSS协议限制、连接生命周期管理、Canvas渲染兼容性等工程挑战。本文聚焦智慧农业监测系统的小程序端开发,深入解析WebSocket封装、断线重连、ECharts 阅读详情

相关推荐

HTML5 Canvas 3D跳动Loading加载动画-可调节参数

这是一款纯CSS3漩涡样式的Loading加载动画和CSS3发光线条旋转Loading加载动画,支持动态调节动画参数。

使用Canvas自定义图形 之 自定义加载动画效果

使用Canvas自定义图形 之 自定义加载动画效果

syfxx的博客 444

html5 canvas实现的酷炫页面预加载动画图标效果源码.zip

这是一款基于html5 canvas实现的酷炫页面预加载动画图标效果源码。有多种预加载动画效果可供选择,动画渐变效果平滑自然,是一款经典的html5加载动画。建议使用支持html5与css3效果较好的火狐或谷歌等浏览器预览本源码。

使用canvas实现一个loading的效果

这段代码首先定义了一个canvas元素和相关的绘制上下文。然后,它定义了一个函数来绘制一个完整的圆(作为loading动画的外圈),以及另一个函数来绘制加载部分的动画。元素可以实现各种动态效果,包括loading动画。函数,可以创建一个平滑的动画效果。你可以根据需要调整颜色、速度、半径等参数来定制这个loading动画的外观和行为。文件中添加JavaScript代码来控制canvas并创建动画。在前端开发中,使用HTML5的。首先,在HTML文件中添加一个。

王铁柱666的博客 447

7款 HTML5 Loading动画特效

7款HTML5 Loading动画特效,主要实现方式是通过Canvas+Css实现,纯代码实现

HTML5基于Canvas实现超酷Loading动画特效源码

这款Loading动画加载效果主要是利用几何的特性来模拟的,可实现伸缩旋转的视觉效果。建议使用支持HTML5较好的火狐或谷歌等浏览器预览。

使用canvas标签来完成动画效果

本次实现的效果为一个黑色小人在浏览器中不停的奔跑,需要用到canvas标签跟定时器来完成效果

2301_77717688的博客 595

HTML5 Canvas 液体流动样式Loading加载动画

之前我们分享过很多基于jQuery和HTML5的Loading加载动画,比如这款HTML5 Canvas发光Loading动画就是基于Canvas的。今天我们要分享另外一款基于HTML5 Canvas的液体流动样式Loading加载动画,这款Loading动画在加载时会呈现液体流动的动画效果,并且由于和背景颜色的对比,也略微呈现发光的动画效果。

从零复刻经典吃豆人:JavaScript Canvas游戏开发全解析

游戏开发的核心在于理解其底层运行机制,其中游戏循环、状态机和碰撞检测是构建任何交互式体验的基础原理。游戏循环负责驱动画面更新与逻辑处理,状态机管理游戏实体(如角色、系统)的行为切换,而碰撞检测则是实现交互反馈的关键技术。这些基础概念共同支撑起从简单2D游戏到复杂3A大作的开发框架,其技术价值在于将动态的视觉艺术转化为严谨的可编程逻辑。在实践层面,通过复刻经典游戏项目,开发者能深入掌握这些原理的应用。例如,在基于HTML5 Canvas和JavaScript的吃豆人复刻项目中,开发者需要运用网格化地图实现高效

weixin_34319111的博客 355

HTML5 Canvas圆形旋转加载动画特效

一组简单扁平风格的HTML5 Canvas圆形旋转加载动画特效,圆环转动网页加载动画,包含6种样式。

c语言【分糖果】2023蓝桥杯4124(枚举,递归,dfs)

但是这是不符合我们糖果刚好分完的条件的,我们应该往回退到上一层,也就是孩子6这层,然后j+1=3,孩子7分到3个第二种糖果,这也不符合我们糖果刚好分完的条件,然后就会再次回退到孩子6这里,然后j+1=4,让我们的孩子7获得5块第二种糖果,然后还是不符合糖果刚分完的条件,于是再一次退回到孩子6这里,然后就会有外循环i+1=1,j=1,孩子7分到1块第一种糖果1块第二块糖果......然后就是这样的不停地回溯,试探,直到把整棵树遍历一遍,并且记录所有的满足条件的组合。先放一下我的代码,我的代码超时啦救命!

weixin_74331419的博客 730

想要自我介绍与众不同?游戏版“时间线”Canvas模块给你信心!

时间轴游戏模块 小新快跑介绍 本项目为苏一恒个人网站的(预备)组件之一,以游戏的形式展示自己的比较重要的人生历程(时间轴)。 创造不易,感谢手动star???? 游戏说明 键盘左右键控制人物,按压即可移动,松开即可暂停。当经过不同建筑时会有不同的说明,所有的历程按照时间顺序一字排开。 安装/启动说明 将项目下载到本地并执行命令 npm install npm run start 迁移说明 可以将整个GamePine文件夹迁移到你的项目中,然后引入组件 width:设置模块在浏览器中的宽度 imp

苏一恒 434

单细胞转录组数据质控实战:如何用Seurat精准过滤低质量细胞(附完整代码)

本文详细介绍了使用Seurat进行单细胞转录组数据质控的实战方法,包括基因检出数、分子计数和线粒体基因比例等关键指标的解读与可视化技巧。通过动态阈值策略和高级质控技巧(如双细胞检测和红细胞过滤),帮助研究者精准过滤低质量细胞,提升数据分析可靠性。附完整代码示例,适合生物信息学研究人员参考实践。

ii567的博客 824

使用canvas制作一个加载的动画

这段代码创建了一个简单的加载动画,其中有一个旋转的控制杆在一个半透明的背景圆内旋转。你可以根据需要调整颜色、速度、半径等参数来定制动画的外观和行为。元素可以创建丰富的图形和动画。以下是一个简单的示例,展示如何使用canvas制作一个加载动画。文件中,添加以下JavaScript代码来创建动画。首先,在HTML文件中添加一个。在前端开发中,使用HTML的。

王铁柱666的博客 543

C# 调用高德地图关键词 API

今天我们要一起探索如何使用 C# 来调用高德地图的关键词搜索 API,从而实现精准的地理位置搜索功能。高德地图的关键词搜索 API 可以帮助我们轻松地实现这一点,它能够返回一系列匹配关键词的地点坐标和其他相关信息。通过简单的几行 C# 代码,我们就实现了调用高德地图关键词搜索 API 的功能。接下来,我们将在一个 C# 控制台应用中实现调用高德地图关键词搜索 API 的功能。此外,如果要在生产环境中使用,还需要考虑安全性问题,例如不要在客户端暴露 API 密钥。🔥关注墨瑾轩,带你探索编程的奥秘!

java专栏 1103

修改legged_gym地形后仍然是平地,如何解决?

🏆 本文收录于《全栈Bug调优(实战版)》专栏,致力于分享我在项目实战过程中遇到的各类Bug及其原因,并提供切实有效的解决方案。无论你是初学者还是经验丰富的开发者,本文将为你指引出一条更高效的Bug修复之路,助你早日登顶,迈向财富自由的梦想🚀!同时,欢迎大家关注、收藏、订阅本专栏,更多精彩内容正在持续更新中。让我们一起进步,Up!Up!Up!    备注: 部分问题/难题源自互联网,经过精心筛选和整理,结合数位十多年大厂实战经验资深大佬经验总结所得,数条可行方案供所需之人参考。

**My Coding Family** 1563

canvas做loading动画

由于公司最近项目不是很忙,所以,自己利用闲暇的时间来研究了一阵子的htm5和css3,正巧,公司最近要对以前的项目进行一次统一的升级,而我被告知时,主要是在以前的版本中加入一些页面动画。有4人参与了动画特效的编写,我很幸运自己也被选中。 第一次做动效还是用css3,心里好激动。虽然自己对css3不是很了解,但是,我还是有信心自己能够胜任这次的任务。接下来近2个月的时间里,我都在做css3动效,由...

weixin_30518397的博客 468

从工具选型到落地实践:吃透 SAP Fiori Launchpad 配置工具体系

摘要: SAP Fiori Launchpad配置远非简单添加应用和分配角色,涉及技术目录、业务目录、Spaces/Pages等多层管理。官方推荐新工具分工:技术目录用FLPAM维护应用定义,业务目录用FLPCM编排应用组合,Spaces/Pages优化用户体验布局,而传统Groups模式已被标记弃用。这种分层治理模式(定义层-编排层-展示层)能有效解决传输混乱、升级兼容性问题,尤其适合大规模项目实施。关键在于区分技术配置与业务呈现,避免将所有功能堆砌在单一旧工具中。(149字)

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 103

致敬六一:js+canvas实现页面卡通人物屏幕上飘动

实现js+canvas实现页面卡通人物屏幕上飘动的全部代码

前端-尔嵘 963

Machine Unlearning: A Survey

机器学习已经引起了广泛的关注,并发展成为一种使能技术,用于广泛的高度成功的应用,如智能计算机视觉、语音识别、医疗诊断等。然而,由于隐私、可用性和/或被遗忘权,一些特定样本的信息需要从称为机器遗忘的模型中删除,这就产生了一种特殊的需求。这项新兴技术因其创新性和实用性而引起了学术界和工业界的极大兴趣。与此同时,这个雄心勃勃的问题导致了许多旨在应对其挑战的研究工作。据我们所知,没有任何研究分析过这一复杂的主题,也没有比较过现有的遗忘解决方案在不同场景下的可行性。因此,通过这项调查,我们旨在了解遗忘技术的关键概念。

c_cpp_csharp的专栏 1158

用MATLAB计算卡方值

然后,我们计算了期望频数,即在两个分类变量独立的情况下,每个单元格的预期频数。接下来,我们使用卡方检验的公式计算了卡方值。卡方检验是一种常用的统计方法,用于确定两个分类变量之间是否存在相关性。它基于观察到的频数和期望频数之间的差异来评估分类变量之间的独立性。在MATLAB中,我们可以使用。请注意,这只是一个简单的示例代码,用于说明如何使用MATLAB计算卡方值。在实际应用中,您可能需要根据您的具体数据和研究问题进行相应的修改和调整。在上面的代码中,我们首先创建了两个分类变量。函数显示了计算得到的卡方值。

CodeNexus的博客 2658

canvas loading动画js特效代码

canvas loading动画特效代码。

ICode联盟 177

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

html绘制动态小人,JavaScript+html5 canvas绘制的小人效果

本文实例讲述了JavaScript+html5 canvas绘制的小人效果。分享给大家供大家参考,具体如下:运行效果截图如下:index.html代码如下:canvas中的缩放#canvas {background:black; margin-top:100px; margin-left:200px;}cache = {};var offsetX = 50,offsetY = 20;cache.c...

weixin_39531037的博客 522

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

如何使用 HTML5 的 Canvas 实现动画效果?

<title>HTML5 Canvas 动画示例</title><style>canvas {canvas {</style>

破损的天堂鸟博客 2206

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

canvas实现小人张口闭口

效果展示: 代码展示: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <style> * { margin: 0...

Tonglanlinling的博客 421
上一篇: 动手写一个Android数据加载时界面状态切换的开源库
下一篇: 自个儿写Android的下拉刷新/上拉加载控件
LaterEqualsNever
博客等级 码龄12年 297粉丝 61原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值