精华内容
下载资源
问答
  • JS星星发光

    2019-06-17 21:30:33
    的代码,我们可以用JS的代码写一个简单的方法,就是实现一个用gif图然后结合JS实现发光的效果。 那么这个代码要怎么写呢,首先我们需要先在界面上写一下的Html的代码,我们来看一下界面的代码是什么,看以下截图: ...

    JS星星发光

    下面我们使用Visual Studio这个软件来写一个JS.的代码,我们可以用JS的代码写一个简单的方法,就是实现一个用gif图然后结合JS实现发光的效果。
    那么这个代码要怎么写呢,首先我们需要先在界面上写一下的Html的代码,我们来看一下界面的代码是什么,看以下截图:

    在这里插入图片描述

    在截图中我们可以看到界面的代码就是非常的简单啦。就是直接用一个body里面直接给他写一个属性,这个属性是背景颜色为黑色的。
    Html界面就这么简单了,然后我们来写一下script里面的代码。
    代码的内容,见截图:

    在这里插入图片描述

    首先我们先写一个script的方法,然后在这个方法里面写上代码。
    我们通过第24行写一个鼠标点击的方法。
    这个onclick的意思就是该onclick属性返回当前元素的click事件处理程序代码。
    注意:当使用该click事件触发某个动作时,还可以考虑将相同的动作添加到该keydown事件中,以允许不使用鼠标或触摸屏的人使用该动作
    然后第25行就是let关键字,它跟var关键字的区别就是。
    声明后未赋值,表现相同
    使用未声明的变量,表现不同
    重复声明同一个变量时,表现不同
    变量作用范围,表现不同
    然后他的意思就是创建一个img,接着26行的意思设置一个src的路径地址,他的路径就是你找的图片的位置。然后接着27行的意思就是设置图片的大小位置随机,然后29行的意思就是设置一下图片的位置,利用图片的style.potion属性给他设置一个“absoloute”绝对定位,然后在图片的属性X和Y轴上,clientX和clientY的意思就是在点击位置距离当前body可视区域的x,y坐标,然后最后再讲图片插入在body里面。
    接着我们就可以实现出来这个方法,我们可以看一下实现的功能是怎么样子的
    看以下截图代码:

    在这里插入图片描述

    接着我们就可以从页面上看到上面截图的效果,当你鼠标点击window窗口的时候,然后他会获取鼠标的位置,接着就实现代码的流程,首先先创建img的图片,然后给他设置图片的路径,接着就是设置图片的位置还有给图片进行定位,还有设置它的样式,接着就是图片的随机大小,最后就是插入在页面的body里面了。

    展开全文
  • 2d-sprite-glow-inner.gif一、内发光原理学习 Shader 过程中,偶然在网上看到一句的内发光原理,十分精辟受用:采样周边像素alpha取平均值,叠加发光效果事实上,根据这句精辟的原理,就可以实现内发光了,你也试试...

    本章为大家带来内发光特效。

    2d-sprite-glow-inner.gif

    一、内发光原理

    学习 Shader 过程中,偶然在网上看到一句的内发光原理,十分精辟受用:

    采样周边像素alpha取平均值,叠加发光效果

    事实上,根据这句精辟的原理,就可以实现内发光了,你也试试吧?

    以下为我的实现过程。

    二、采样周边像素Alpha取平均值

    怎么采集某个点的周边像素呢?这里我们可以用 「按圆采样」 算法

    2.1 采样圆边上某点的 Alpha 值

    如果我们已知圆的半径 radius ,已经某个角度 angle ,那么这个点的坐标就很好计算了,其上的 Alpha 值就不再话下 :

    Step 1

    x = radius * cos(angle);

    y = radius * sin(angle);

    在 Cocos Creator 的 Shader 中,代码如下:

    /**

    * 获取指定角度方向,距离为xxx的像素的透明度

    *

    * @param angle 角度 [0.0, 360.0]

    * @param dist 距离 [0.0, 1.0]

    *

    * @return alpha [0.0, 1.0]

    */

    float getColorAlpha(float angle, float dist) {

    // 角度转弧度,公式为:弧度 = 角度 * (pi / 180)

    // float radian = angle * 0.01745329252; // 这个浮点数是 pi / 180

    float radian = radians(angle);

    vec4 color = getTextureColor(texture, v_uv0 + vec2(dist * cos(radian), dist * sin(radian)));

    return color.a;

    }

    PS:

    这里我们用到了 sin 和 cos 函数,函数接受的参数是弧度制,因此我们要实现角度转弧度

    // 角度转弧度,公式为:弧度 = 角度 * (pi / 180)

    float radian = angle * 0.01745329252; // 这个浮点数是 pi / 180

    但实际上,GLSL ES 语言已然存在内置函数 radians(float degree):将角度值转化为弧度值,因此我们就用内置函数即可。

    2.2 采样圆边上所有点的 Alpah 平均值

    上面我们已经实现了获取圆上某点的颜色 Alpha 值。那么,我们只需要来一个 for 循环,遍历 0 到 360 度,那这个圆上所有点的颜色 Alpha 平均值就很容易算出来了。

    但是,这样子可能会有两个问题:

    计算量可能会太多,导致我们的性能低下

    半径很少的时候,相邻的两个或多个角度的点可能很近,或者甚至重合,此时这两个点的 Alpha 值有可能相差不大,那么此时分别计算这些角度的 Alpha 值,就可能显得有点冗余了,取其一即可

    基于以上考虑,最终我采用的是圆采样方式为:

    以某个角度作为间隔,遍历由此产生的各个方向的Alpha值,将这些值的和的平均值近似看作这个圆的Alpha值

    比如:

    假设以 45° 角间隔,那么我只需要计算下图的 [10, 17] 共计 8 个点的 Alpha 平均值,那么这个值我就可以近似看作这个圆上所有点的 Alpha 平均值了

    Step2

    在 Cocos Creator 的 Shader 中,代码如下:

    /**

    * 获取指定距离的周边像素的透明度平均值

    *

    * @param dist 距离 [0.0, 1.0]

    *

    * @return average alpha [0.0, 1.0]

    */

    float getAverageAlpha(float dist) {

    float totalAlpha = 0.0;

    // 以30度为一个单位,那么「周边一圈」就由0到360度中共计12个点的组成

    totalAlpha += getColorAlpha(0.0, dist);

    totalAlpha += getColorAlpha(30.0, dist);

    totalAlpha += getColorAlpha(60.0, dist);

    totalAlpha += getColorAlpha(90.0, dist);

    totalAlpha += getColorAlpha(120.0, dist);

    totalAlpha += getColorAlpha(150.0, dist);

    totalAlpha += getColorAlpha(180.0, dist);

    totalAlpha += getColorAlpha(210.0, dist);

    totalAlpha += getColorAlpha(240.0, dist);

    totalAlpha += getColorAlpha(270.0, dist);

    totalAlpha += getColorAlpha(300.0, dist);

    totalAlpha += getColorAlpha(330.0, dist);

    return totalAlpha * 0.0833; // 1 / 12 = 0.08333

    }

    2.3 采样点周边像素 Alpha 平均值

    上面两个步骤,我们已经实现了 近似采样一个圆上所有点的 Alpha 平均值 。

    而如果我们把「周边」这个词语理解为由很多个半径不同的圆组合起来,那么现在我们只需要采样多几个圆,那么就可以实现我们的最终需求了—— 采样周边像素Alpha取平均值 。

    Step3

    那么,那么我们要采样多少个圆呢?采集少了,效果可能粗糙,采集多了,可能计算量过多导致性能降低

    一般而言,这种可变的属性,我们应该交给上层去传入,但是如果上层要用内发光特效,你暴露的一个参数名字叫 采样多少个圆 ,那使用者一般会很茫然。

    事实上,更加贴合上层使用者理解的属性名应该为 发光宽度 glowColorSize。

    那我们又如何在程序上,在这个发光宽度上,控制采样多少个圆呢?

    划分方案有很多种,这里我们采用按照发光宽度,等比划分10个圆,只采样这10个圆。(当然你可以改动这里的划分方案)

    在 Cocos Creator 的 Shader 中,代码如下:

    /**

    * 获取发光的透明度

    */

    float getGlowAlpha() {

    // 如果发光宽度为0,直接返回0.0透明度,减少计算量

    if (glowColorSize == 0.0) {

    return 0.0;

    }

    // 将传入的指定距离,平均分成10圈,求出每一圈的平均透明度,

    // 然后求和取平均值,那么就可以得到该点的平均透明度

    float totalAlpha = 0.0;

    totalAlpha += getAverageAlpha(glowColorSize * 0.1);

    totalAlpha += getAverageAlpha(glowColorSize * 0.2);

    totalAlpha += getAverageAlpha(glowColorSize * 0.3);

    totalAlpha += getAverageAlpha(glowColorSize * 0.4);

    totalAlpha += getAverageAlpha(glowColorSize * 0.5);

    totalAlpha += getAverageAlpha(glowColorSize * 0.6);

    totalAlpha += getAverageAlpha(glowColorSize * 0.7);

    totalAlpha += getAverageAlpha(glowColorSize * 0.8);

    totalAlpha += getAverageAlpha(glowColorSize * 0.9);

    totalAlpha += getAverageAlpha(glowColorSize * 1.0);

    return totalAlpha * 0.1;

    }

    2.4 调试发光

    Ok,有了上面的采样手段,现在我们可以来调试了。

    首先,那么发光颜色选什么好呢?

    交给上层控制吧,我们只需要定义一个 发光颜色 glowColor 即可。

    float alpha = getGlowAlpha();

    gl_FragColor = glowColor * alpha;

    先来个内发红光看下: glowColor = vec4(1.0, 0.0, 0.0, 1.0);

    Test 1

    可以看到右边的调试结果还是挺符合我们的输出预期,周边点明显是有一个渐变透明过程

    但是,此时我们得到的是内部透明度为1,靠近边缘的为接近0的透明度,其他位置为0的透明度。而内发光效果的话,恰恰相反,我们需要的是一个内部透明度为0,靠近内边缘透明度为1的效果。

    那么我们尝试反转一下

    float alpha = getGlowAlpha();

    // 内发光是从边缘发光的,是需要内部透明度为0,靠近边缘的接近1的透明度

    // 因此我们需要反转一下透明度

    alpha = 1.0 - alpha;

    gl_FragColor = glowColor * alpha;

    Test 2

    现在是反转了,但是图像外边的其他位置却上色了,而在反转之前,图像外边的其他位置是透明的,为了应用这部分过来,在反转之前,我们判断一下,透明度大于某个 阈值 ,我们才反转 alpha 值。

    那么这里的 阈值 要怎么定义呢?

    为了更加深入理解这个问题,我们先来放大一下 Cocos 的 Logo 上方的那个角,先看清楚一个问题:

    glowThreshold

    可以看到图像的边缘黑色并不是立即切换到完全透明的,而是一个过渡效果,从黑色开始慢慢变透明直到完全透明,透明从1 -> 0 慢慢过渡。事实上大部分的图像边缘都差不多类似这样子,甚至部分图片的设计,本身就是有一个很长的渐变过渡带。

    那么问题来了,针对这种有渐变过渡带的纹理,在我们实现的内发光特效中,我们的发光边缘要怎么定义呢?

    从图像边缘最外边的透明度为0.0开始发光?

    从图像边缘往内,不透明(即透明度为1.0)的地方开始发光?

    从图像 0.0 到 1.0 之间的某个值开始发光?

    不好取舍,不同图片可能是需要不同处理,效果才好。

    既然如此,我们就可以将这几种定义抽象一下,比如叫 发光阈值 glowThreshold,范围[0.0, 1.0]。我们暴露给上层使用者,交由上层使用者自行根据纹理去控制此值的大小即可。

    现在我们的代码就可以修改为这样子了:

    float alpha = getGlowAlpha();

    if (alpha > glowThreshold) {

    // 内发光是从边缘发光的,是需要内部透明度为0,靠近边缘的接近1的透明度

    // 因此我们需要反转一下透明度

    alpha = 1.0 - alpha;

    }

    gl_FragColor = glowColor * alpha;

    在 glowThreshold 为 0.2 时,效果如下:

    Test 3

    OK,看上去差不多的样子了,现在我们试着简单手动混合一下,看起来内发光效果就有了

    Test 4

    ???

    好像还并不是内发光的效果,看上去上方尖角的光源有点扩边了?这是那里出问题了呢?

    因为我们是要做内发光,所以如果点本来是透明的或者小于我们设立的阈值,那么其实这个点是没必要进行采样周边Alpha平均值的,否则就会有上面这种 扩边 的问题,那么我们在取发光透明度的时候,在判断一下即可

    /**

    * 获取发光的透明度

    */

    float getGlowAlpha() {

    // 如果发光宽度为0,直接返回0.0透明度,减少计算量

    if (glowColorSize == 0.0) {

    return 0.0;

    }

    // 因为我们是要做内发光,所以如果点本来是透明的或者接近透明的

    // 那么就意味着这个点是图像外的透明点或者图像内透明点(如空洞)之类的

    // 内发光的话,这些透明点我们不用处理,让它保持原样,否则就是会有内描边或者一点扩边的效果

    // 同时也是提前直接结束,减少计算量

    vec4 srcColor = getTextureColor(texture, v_uv0);

    if (srcColor.a <= glowThreshold) {

    return srcColor.a;

    }

    // 将传入的指定距离,平均分成10圈,求出每一圈的平均透明度,

    // 然后求和取平均值,那么就可以得到该点的平均透明度

    float totalAlpha = 0.0;

    totalAlpha += getAverageAlpha(glowColorSize * 0.1);

    totalAlpha += getAverageAlpha(glowColorSize * 0.2);

    totalAlpha += getAverageAlpha(glowColorSize * 0.3);

    totalAlpha += getAverageAlpha(glowColorSize * 0.4);

    totalAlpha += getAverageAlpha(glowColorSize * 0.5);

    totalAlpha += getAverageAlpha(glowColorSize * 0.6);

    totalAlpha += getAverageAlpha(glowColorSize * 0.7);

    totalAlpha += getAverageAlpha(glowColorSize * 0.8);

    totalAlpha += getAverageAlpha(glowColorSize * 0.9);

    totalAlpha += getAverageAlpha(glowColorSize * 1.0);

    return totalAlpha * 0.1;

    }

    现在看下来效果差不多了,是内发光了!

    Test 5

    但是好像发光强度不够得样子?没关系,我们给它加点料,来个一元四次方程加强,让靠近边缘的地方更加亮

    flavour

    对应代码如下:

    float alpha = getGlowAlpha();

    if (alpha > glowThreshold) {

    // 内发光是从边缘发光的,是需要内部透明度为0,靠近边缘的接近1的透明度

    // 因此我们需要反转一下透明度

    alpha = 1.0 - alpha;

    // 给点调料,让靠近边缘的更加亮

    alpha = -1.0 * (alpha - 1.0) * (alpha - 1.0) * (alpha - 1.0) * (alpha - 1.0) + 1.0;

    }

    gl_FragColor = glowColor * alpha;

    现在大概效果已经出来了:

    Glow Inner

    三、混合颜色

    在上面动图中,实际上为了演示,我是有两个 Sprite, 一个用内置材质,一个用在调试中的内发光材质,通过手动移动的方式,我们已经大概看到将内发光叠加到原图上方,看起来就是内发光特效了。

    Test 5

    那么这一步,我们要怎么实现一步到位,直接就将内发光叠加在原图上,形成最终效果。

    实际上,这也叫 混合模式 ,混合模式主要解决的是两种颜色之间,该如何混合,比如叠加、覆盖等等。

    混合模式在我们平时开发中也是经常在使用着的,比如,Sprite 组件:

    Blend

    理解不同的组合,对于我们实现不同混合效果,是基础中的基础。

    关于这部分,官方在 UI渲染批次合并指南的 Blend 模式章节 一文中有说到,觉得纯文字比较难以理解的,可以参考网上 2dx 关于混合模式的相关文章。

    回归我们的主题,要实现在原图上叠加我们的内发光特效,那么

    // 源颜色就是内发光颜色

    vec4 color_dest = o;

    // 目标颜色就是图案颜色色

    vec4 color_src = glowColor * alpha;

    // 按照官方的混合颜色介绍和规则

    //

    // 要在图案上方,叠加一个内发光,将两者颜色混合起来,那么最终选择的混合模式如下:

    //

    // (内发光)color_src: GL_SRC_ALPHA

    // (原图像)color_dest: GL_ONE

    //

    // 即最终颜色如下:

    // color_src * GL_SRC_ALPHA + color_dest * GL_ONE

    gl_FragColor = color_src * color_src.a + color_dest;

    混合后的最终效果:

    Glow Inner

    四、编辑器 texture 函数问题

    在对比 浏览器 和 Cocos Creator 编辑器 的预览结果的后,你可能会发现编辑器的发光效果,相比起浏览器的没有那么好,比如编辑器左右两边的发光很窄。

    texture function problem

    这是因为

    在 Cocos Creator 2.2.1 的编辑器中,超出边界的uv并不是返回 vec4(0.0, 0.0, 0.0, 0.0),实际返回为

    超出左边界的uv,返回 v_uv0.x = 0 的颜色

    超出右边界的uv,返回 v_uv0.x = 1 的颜色

    超出上边界的uv,返回 v_uv0.y = 1 的颜色

    超出下边界的uv,返回 v_uv0.y = 0 的颜色

    而这样子的处理,会导致我们获取图像边缘位置的周边像素的的 alpha 值有可能偏低。

    比如:在我们这个例子上,以图像中间左边缘为例,采样周边平均 Alpha 的时候,因为超出图像边界的都是 1.0 ,因此这个图像左边缘的 平均 Alpha 就是1.0,相当于没有内发光了,光不起来,同理图像其他边缘也是。

    要修复这个问题其实也很简单,我们只需要封装一层获取 uv 像素的函数

    vec4 getTextureColor(sampler2D texture, vec2 v_uv0) {

    if (v_uv0.x > 1.0 || v_uv0.x < 0.0 || v_uv0.y > 1.0 || v_uv0.y < 0.0) {

    return vec4(0.0, 0.0, 0.0, 0.0);

    }

    return texture(texture, v_uv0);

    }

    然后将原来所有的 texture() 函数的地方直接替换为 getTextureColor() 即可

    PS:上面用到的静图、动图都是修复后的效果图

    五、总结

    5.1 采样算法

    在实现 采样周边像素Alpha取平均值 的时候,我们采用了 「按圆采样」 算法去进行采样,实际上,这里有很多种采样方式,比如: 矩形偏移采样

    矩形偏移采样:

    取右、右上、上、左上、左、左下、下、右下共计8个方向的点作为周边

    按照上一步的定义去扩大「周边」,从而实现收集

    大概步骤如下图:

    Total

    不过,你也可以看到,这种方案的收集方式存在一个问题:

    随着收集距离的扩大,会出现越来越多的点不会收集到,因为收集方向就只有8个,方向夹角之间的点是收集不了的(比如 23 -> 24, 33 -> 34 之间的点)

    那是不是这个方案就不好呢,其实也不是,这个方案的最大优点是减少了很多 sin , cos 的计算,因为就收集的8个方向,而这8个方向恰好只需要加法和减法就可以的出来了,因此性能上会更好,对于部分图片,如果发光宽度很短,那么此采集方案可能更优。

    那么,简单总结下现在讨论的两种「周边采样算法」的优劣:

    采样算法

    优点

    缺点

    适用场合

    按圆采样

    覆盖面相对较全,效果相对细腻

    计算量相对偏多

    绝大部分场合

    矩形偏移采样

    覆盖面相对少,效果相对粗糙,且由于方向固定,可能存在特殊情况下,效果不理想

    计算量相对较少

    发光宽度较少,比较少大转折弯的纹理

    当然,还有其他很多采样算法,如果你有想法,不妨自己动手试下吧,试完之后记得分析下优劣和使用场合,这会让你有更多收获。

    5.2 关于发光强度

    为了实现边缘更加光亮,我直接写死了一个 一元四次方程,实际上这可能不好控制。另外一些好的公式可以使用 二次贝塞尔 或者 三次贝塞尔 可以很方便操作控制点,从而实现不同曲度。

    5.3 其他

    当然,在操作一遍下来后,说不准你也觉得这种实现不好,xxx地方有哪些地方可以优化,如果有更好的方案,我们不妨留言交流一下吧。

    OK,本章完,完整代码在我的 Github 仓库 或 Gitee 仓库 中可以找到。

    展开全文
  • 我是个小白,才学完jquery,项目效果需要外发光,应该如何使用,求大神指教!谢谢!![图片说明](http://forum.csdn.net/PointForum/ui/scripts/csdn/Plugin/001/face/6.gif)
  • 正常运行在手机中时,效果很流畅,gif上可能是由于录制完转码的时候,速度调快了,所以看上去速度比较快,这都是小事情,接下来我们来看看源码是如何实现的。 1.代码很简单,主要是利用xml布局文件的几个属性,并且...
  • GIF闪亮图片制作软件

    2008-10-09 14:18:01
    用它可以设计出很美的图片,闪动的、发光的、它都可以做到!
  • android实现LED发光字效果实战

    千次阅读 2016-10-26 11:31:24
    正常运行在手机中时,效果很流畅,gif上可能是由于录制完转码的时候,速度调快了,所以看上去速度比较快,这都是小事情,接下来我们来看看源码是如何实现的。 1.代码很简单,主要是利用xml布局文件的几个属性,并且...

    转载请注明出处:http://blog.csdn.net/woshizisezise/article/details/52932614

    大家好,这一篇博客来教大家一个类似于LED闹钟显示屏样式的小案例,UI比较美观,文末会提供下载相关资源地址供大家下载,首先我们来看一看这个案例的运行效果。
    这里写图片描述

    正常运行在手机中时,效果很流畅,gif上可能是由于录制完转码的时候,速度调快了,所以看上去速度比较快,这都是小事情,接下来我们来看看源码是如何实现的。


    • 1.代码很简单,主要是利用xml布局文件的几个属性,并且通过设置我们特定的字体就能很容易的实现我们看到的效果啦,首先我们创建一个类LedTextView继承自TextView。
    public class LedTextView extends TextView {
    
      private static final String FONTS_FOLDER = "fonts";
      private static final String FONT_DIGITAL_7 = FONTS_FOLDER
          + File.separator + "digital-7.ttf";
    
      public LedTextView(Context context) {
        super(context);
        init(context);
      }
    
      public LedTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(context);
      }
    
      public LedTextView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init(context);
      }
    
      private void init(Context context) {
        AssetManager assets = context.getAssets();
        final Typeface font = Typeface.createFromAsset(assets,
            FONT_DIGITAL_7);
        setTypeface(font);
      }
    
    }

    这里我们设置了我们特定的字体样式digital-7.ttf。

    • 2.下面我们看看布局文件是如何写的
    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:background="#000000"
        android:layout_height="match_parent">
    
        <com.eloancn.ledtextview.LedTextView
            android:layout_centerInParent="true"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:text="88:88:88"
            android:textColor="#3300ff00"
            android:textSize="80sp" />
    
        <com.eloancn.ledtextview.LedTextView
            android:layout_centerInParent="true"
            android:id="@+id/main_clock_time"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:shadowColor="#00ff00"
            android:shadowDx="0"
            android:shadowDy="0"
            android:shadowRadius="10"
            android:textColor="#00ff00"
            android:textSize="80sp" />
    
    </RelativeLayout>
    

    可以看到,我们主要是在上面一层的TextView控件上设置了以下几个属性

    android:shadowColor="#00ff00"
    android:shadowDx="0"
    android:shadowDy="0"
    android:shadowRadius="10"

    并且设置了指定的颜色,这样就能实现LED发光字的效果。

    • 3.下面我们再来看看MainActivity是如何实现的,代码很简单,主要是获取当前时间,分别截取时分秒赋给我们的textView。
    public class MainActivity extends AppCompatActivity {
        private static final String DATE_FORMAT = "%02d:%02d:%02d";
        private static final int REFRESH_DELAY = 500;
    
        private final Handler mHandler = new Handler();
        private final Runnable mTimeRefresher = new Runnable() {
            @Override
            public void run() {
                final Date d = new Date();
                mTextView.setText(String.format(DATE_FORMAT, d.getHours(),
                        d.getMinutes(), d.getSeconds()));
                mHandler.postDelayed(this, REFRESH_DELAY);
            }
        };
    
        private TextView mTextView;
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            mTextView = (TextView) findViewById(R.id.main_clock_time);
        }
    
        @Override
        protected void onResume() {
            super.onResume();
            mHandler.post(mTimeRefresher);
        }
    
        @Override
        protected void onStop() {
            super.onStop();
            mHandler.removeCallbacks(mTimeRefresher);
        }
    }

    怎么样,代码是不是很简单就实现了呢,大家赶快试一试吧!

    字体资源下载地址:http://download.csdn.net/detail/woshizisezise/9664309


    如果你觉得我的文章对你有帮助,并且希望帮助更多人,欢迎分享并关注我的微信公众号“Android开发的奥秘”,或扫描识别下方的二维码,我会不定期的分享给大家更多有用的资讯,谢谢!
    这里写图片描述

    展开全文
  • 位图:位图又叫点阵图或像素图,计算机屏幕上的图是由屏幕上的发光点(即像素)构成的,每个点用二进制数据来描述其颜色与亮度等信息。因为这些点是离散的,类似于点阵,同时因为多个像素的色彩组合就形成了图片,...

    1.图片

     

    2. 前言

    首先,我们要清楚的是,图片从类型上分,可以分为 位图矢量图

    • 位图:位图又叫点阵图或像素图,计算机屏幕上的图是由屏幕上的发光点(即像素)构成的,每个点用二进制数据来描述其颜色与亮度等信息。因为这些点是离散的,类似于点阵,同时因为多个像素的色彩组合就形成了图片,所以叫这种图为点阵图或者位图。常见位图有 JPG、PNG、GIF 等格式。
    • 矢量图:矢量图又叫向量图,它是由一系列计算机指令来描述和记录一幅图,一幅图可以解为点、线、面等组成的子图。生成的矢量图文件存储量很小,特别适用于文字设计、图案设计等,而在前端中比较常用的矢量图有 SVG 等格式……

    然后,我们按压缩划分,可以将图片分为 无损压缩有损压缩

    • 无损压缩:无损压缩是对文件本身的压缩,使图片占用的存储空间变小,并且不会损害图片的质量。常见无损压缩有 PNG 等。
    • 有损压缩:有损压缩是对图像本身的改变,会对图片质量造成损害,随着压缩次数越来越多,那么图片质量会越来越差。常见有损压缩有 JPG 等。

    最后,究根结底,我们需要知道在计算机中,像素是用二进制来表示的。不同图片格式中像素与二进制位数之间的对应关系是不同的。一个像素对应的二进制位数越多,那么它可以表示的颜色种类就越多,成像效果也就越细腻,文件体积相应也会越大。

    一个二进制位表示两种颜色 【 0|1 <——对应——> 黑|白 】,如果一种图片格式对应的二进制位数有 n 个,那么它就可以呈现 2^n 中颜色。例如:

    • PNG-8:它有 2^8 种颜色,即 256 种颜色。
    • PNG-24:它有 2^24 种颜色,即 1677216 种颜色(1600 万种颜色)。

    OK,知道了这些基础知识,我们就按图片出现的顺序,一一讲解下常用的图片知识吧!

    3.1 BMP

    早期使用的图片格式,叫 BMP,取自英文单词 BitMap,Windows 中文版译作 位图,它的文件结构很简单,没有压缩,一个一个像素地记录下来。

    如果你的系统是 Windows,你可以打开 画图 工具,然后点击另存为,你可以看到保存的选项中有个 24位位图 的格式,即 1600 万色的图片。

    当然,历史总在前进,BMP 这种没有压缩的图片格式,逐渐被后起之秀代替了。

    不知道为什么,查不到 JPG、PNG、GIF 的出现顺序,下面只好按我个人记忆方式来编文章段落。

    3.2 JPEG

    关键字:有损压缩、体积小、加载快、不支持透明

    简要介绍

    JPEG/JPG 格式,是应用最广泛的图片格式之一,特点如下:

    1. JPEG/JPG 采用特殊的有损压缩算法,将不易被人眼察觉的图像颜色删除,从而达到较大的压缩比,因此它的压缩文件尺寸较小,下载速度快,成为互联网最广泛使用的格式。
    2. JPEG/JPG 因为属于有损压缩,所以当压缩级别逐渐增大的时候,图片质量会逐渐损耗,所以压缩要适当。

    在合适的场景下,即便我们将图片体积压缩至原有体积的 50% 以下,JPG 仍能保持住 60% 的品质,且因为 JPG 格式以 24 位图存储单个图,可以呈现多达 1600 万种颜色,足以满足大多数场景,

    适用场景

    1. 大的背景图
    2. 轮播图
    3. Banner 图

    3.3 PNG

    关键字:无损压缩、质量高、体积大、支持透明

    简要介绍

    PNG(可移植网络图形格式)是一种无损压缩的高保真的图片格式,它的压缩比高于 GIF,支持图像透明,可以利用 Alpha 通道调节图像透的明度。

    PNG 分 PNG-8 和 PNG-24。

    • PNG-8:PNG-8 是无损压缩的索引色彩模式。PNG-8 是 GIF 格式很好的替代,虽然不能像 GIF 一样有动画,也不兼容 IE6 等老旧浏览器。PNG-8 最多支持 256 中颜色。
    • PNG-24:PNG-24 是无损压缩的直接色彩模式。PNG-24 会比 JPEG、GIF、PNG-8 占用更大的存储空间。PNG-24 可以呈现 1600 万种颜色。

    2^8 = 256,2^24 = 1677216

    适用场景

    • 普遍场景
    1. 小的 Logo,颜色简单且对比强烈的图片或者背景。
    2. 颜色简单、对比度强的透明小图。
    • 什么时候使用 PNG-8,什么时候使用 PNG-24 呢?
    1. 理论上,位数最大的就是最好的,直接上 PNG-24;但是实际上,为了避免体积过大的问题,一般在适合使用 PNG 的场景中,优先选择比较小巧的 PNG-8。
    2. 如何确定是使用 PNG-8 还是 PNG-24,这就看你的 UI 设计师或者负责人能接受那个了,除非你设计功底非常好,要不然不要做这个选择!

    3.4 GIF

    关键字:支持动画

    简要介绍

    GIF 格式,不仅仅支持静止图片,也可以支持动画,并且支持透明背景图像,适用于多种操作系统,体积很小,网上小动画很多是 GIF 格式。但是色域不太广,只支持 256 种颜色,这意味着颜色种类少。

    GIF 格式的压缩率一般在 50% 左右。

    适用场景

    1. 动图

    3.5 SVG

    关键字:文本文件、体积小、不失真、兼容性好

    简要介绍

    SVG(可缩放矢量图形)是一种基于 XML 语法的图像格式,是可缩放的矢量图形。与 JPG、PNG、GIF 等位图不同,SVG 可以直接用代码来描绘图像,并通过任意文字处理工具打开 SVG 图像,通过改变部分代码来使图像具有交互功能,并可以随时插入到 HTML 中通过浏览器来观看。

    SVG 格式的图片可以任意放大图形显示,并且不会损失图片质量;SVG 格式可编辑和可搜寻;SVG 格式平均来讲,比 JPG 和 GIF 格式文件要小,并且下载也比较快。

    SVG 文件通常是极小的,但是当图形的复杂度变高的时候,SVG 文件大小会随之上升,因为 SVG 在渲染的时候需要比像素图更多的计算能力,这也意味着性能的损耗。所以在 Logo 等图上,应尽可能简洁。

    适用场景

    1. SVG loading 效果图:SVG-Loaders
    2. 转换工具:在线 JPG、PNG 转 SVG 工具
    3. 矢量图标库:阿里巴巴矢量图标

    3.6 Base64

    关键字:文本文件、依赖编码、小图标解决方案

    简要介绍

    Base64 并非一种图片格式,而是一种编码方式,它类似于雪碧图,是作为小图标解决方案而存在的。和雪碧图一样,Base64 图片的出现,也是为了减少加载网页图片时对服务器的请求次数,从而提升网页性能。Base64 是作为雪碧图的补充而存在的。

    Base64 是一种用于传输 8 Bit 字节码的编码方式,通过对图片进行 Base64 编码,我们可以直接将编码结果写入 HTML 或者写入 CSS,从而减少 HTTP 请求的次数。

    适用场景

    1. 图片的实际尺寸很小。尽可能在图片不超过 2KB 的情况下(可查看掘金的 Base64 图)。
    2. 图片无法以雪碧图的形式与其他小图结合(合成雪碧图仍是主要的减少 HTTP 请求的途径,Base64 是雪碧图的补充)。
    3. 图片的更新频率非常低(不需要我们重复编码和修改文件内容,维护成本较低)

    为什么大图不使用 Base64?
    因为 Base64 编码后,图片大小会膨胀为源文件的 4/3,如果将大图编码到 HTML 或者 CSS 中,这样后者的体积增加,即便减少了 HTTP 请求,也无法弥补庞大的体积带来的性能开销。

    如何获取

    1. Webpack 的 loader:url-loader
    2. 在线编码工具:图片转换Base64

    3.7 WebP

    关键字:年轻的全能型选手

    简要介绍

    2010 年由 Google 提出,转为 Web 开发的一种旨在加快图片加载速度的图片格式,支持有损压缩和无损压缩。

    WebP 像 JPEG 一样对图片细节丰富,像 PNG 一样支持透明,像 GIF 一样可以显示动态图片。

    官方介绍:与 PNG 相比,WebP 无损图像的尺寸缩小了 26%。在等效的 SSIM 质量指数下,WebP 有损图像比同类 JPEG 图像小 25-34%。 无损 WebP 支持透明度(也称为 alpha 通道),仅需 22% 的额外字节。对于有损 RGB 压缩可接受的情况,有损 WebP 也支持透明度,与 PNG 相比,通常提供 3 倍的文件大小。

    适用场景

    由于 WebP 支持情况仅 Chrome、UC 等几家浏览器支持,所以局限性较大,目前暂不考虑使用。

    参考自 Can I Use 网站中的浏览器支持程度:webp

    3.8 雪碧图

    雪碧图,CSS Sprites,听起来就很清爽的一种图片,刚开始的时候 jsliang 以为是大街小巷上卖的 3 块钱瓶装雪碧饮料上的图片,后来知道压根不是同一码事。

    雪碧图不属于图片格式,而是一种图片应用形式。但是因为它在前端赫赫有名,经常使用,故此将其记载下来。

    雪碧图又叫精灵图,因为 Sprites 的原因叫 “雪碧”,出现的原因是随着网速的提升,同时因为请求次数过多的时候会卡网页,所以我们就将 N 张小图集成到一张大图上,从而提升页面打开的速度。这种多张小图放在一张大图上的操作,就叫做精灵图(雪碧图 - CSS Sprites)

    那么,平时如何使用雪碧图呢?

    .img{background:url(../images/img.png)  no-repeat;}
    .my-head{height:160px;width:120px;background-position:0 0;}
    .my-picture{height:292px;width:1253px;background-position:0 -160px;}
    复制代码
    @mixin img{background:url(../images/img.png) no-repeat; }
    @mixin my-head{height:160px;width:120px;background-position: 0 0;}
    @mixin my-picture{height:292px;width:1253px;background-position: 0 -160px;}
    复制代码

    如上面代码所示,现在网上有非常多的雪碧图制作工具,我们只需要将小图发到工具上去,就可以生成大图,同时获得它的 css/sass 代码,而不需要自己一个一个定位。

    这是 Windows 版本的工具,网上有很多雪碧图/精灵图制作工具,这里就不推荐本人使用的了。

    MDN 定义:图像精灵(sprite,意为精灵),被运用于众多使用大量小图标的网页应用之上。它可取图像的一部分来使用,使得使用一个图像文件替代多个小文件成为可能。相较于一个小图标一个图像文件,单独一张图片所需的 HTTP 请求更少,对内存和带宽更加友好。

    四 总结

    至此,我们对图片的介绍就结束了,在这里我们列个表进行汇总:

    格式使用场景
    JPG/JPEG 1. 大的背景图; 2. 轮播图; 3. Banner 图
    PNG 1. 小 Logo; 2. 透明背景
    GIF 动态图片
    SVG 能适应不同设备且画质不能损坏的图片
    Base64 大小不超过 2KB,且更新率低的图片
    雪碧图 小图太多的时候,集中成一张图片减少 HTTP 请求

    雪碧图不属于格式,但属于一种应用形式

    如果小伙伴有其他的好用资源推荐,可以 QQ 或者评论留言:

    • 常用优秀资源
    1. SVG loading 效果:SVG-Loaders
    2. 矢量图标库:Iconfont-阿里巴巴矢量图标库
    3. 在线制作 Logo:U 钙网
    4. 压缩 PNG 或者 JPG:TinyPNG
    • 获取图片素材
    1. 千库网:地址
    2. 包图网:地址
    • 在线转换工具
    1. JPG、PNG 转 SVG
    2. JPG、PNG、GIF 转 Base64
    3. JPG、PNG、GIF 转 ICO
    • 其他资料支持
    1. Can I Use —— 查看各种浏览器支持程度:caniuse.com

    五 参考文献

    1. 《jpg、png、svg、gif等图片格式的区别》
    2. 《PNG、JPEG、GIF、SVG应该用哪个?》
    3. 《图片优化——质量与性能的博弈》
    4. 《横向对比 gif、jpeg、png、svg,教你如何合理选择图像格式》
    5. 《JPG?GIF?PNG?前端如何选择图片格式?》
    6. 《矢量图与位图的区别》
    7. 《无损压缩和有损压缩是数码图像文件压缩的两种类型。》



    转载于:https://www.cnblogs.com/gaoht/p/10482942.html

    展开全文
  • 今天我们要学的GIF动画效果非常简单易学。让文字闪闪发光,相信在网页的任何角落出现都不会被忽略。一、准备(文章结尾处有下载!)星星画笔一星星画笔二二、基本文字造型打开PS,新建一个文档。文档大小我选用600px*...
  • 有别于普通的书包,该背包表面为全彩LED显示屏,可设置文字、图片、GIF动画等。滴滴方面表示,发光包旨在提高代驾师傅们在夜间的识别度,提升骑行安全,同时也可作为移动的反酒驾公益广告。目前,首批发光包已在北京...
  • 今天我们来一起学习一下发光霓虹灯字体效果吧!首先,打开PS软件。新建画布:矩形工具,绘制一个画布大小的矩形,填充黑色,并锁定全部:文字工具输入文字,调整大小合适:将文字图层Ctrl+J复制一层,拷贝图层字体...
  • 记住这张gif 之后教你怎么做 一直都想认真地写篇文章,恰巧近期因某些不可描述的缘由以及不可告人的目的参与了学校某个会徽征集比赛。心有所悟便寻思着好好分享一波,并直抒胸臆一波。 你说我这一个学生...
  •  第二周:新增发光字效果的验证码。  思路:借鉴PS图层叠加方法,验证码字符串变形处理,加干扰色图层和干扰字符串图层。  方案一:验证码字符串随机颜色/栅格化(百叶窗)/斜切处理,加干扰色图层和干扰...
  • Needs More Glitter-crx插件

    2021-04-06 04:44:15
    在您可能会访问的任何网站上闪闪发光gif图像和手写文字会打乱您的日常浏览。 此扩展程序以随机​​选择的闪光gif替换网页上的所有图像,让人联想到过度定制的Myspace页面和早期的互联网网站,以及将网络字体更改为...
  • gif 动图,质量有损失 静态效果图 其他效果: 发光的谷歌小恐龙 发光的桥本 发光的桥本 代码和详细注释 #iChannel0 "file://../../images/AEES.jpg" float decay = 0.92; float density = 1.0...
  • android呼吸灯效果设计思路使用颜色渐变,使其边缘灯光区,与背景色无缝连接使用属性动画,控制呼吸灯的发光效果图如下:GIF.gif代码文件package com.tian.criminalintent;import android.animation.Animator;import...
  • Easy Watermark Studio可以加水印处理,支持阴影、外发光等多种水印效果,支持多种图片格式、支持GIF格式等加水印,让的作品不再被盗用! 还在担心自己的图片没有水印加吗?让Easy Watermark Studio帮你加水印吧。 ...
  • 这是一篇基础的photoshop教程主要为大家介绍使用photoshop中的动画面板制作一幅流星划过夜空的GIF动画图片 1按下Ctrl+N新建一个图片 2使用油漆桶工具在背景图层上填充黑色 3再在背景上新建一个图层 4选择滤镜风格化...
  • 有两种方法告诉大家 第一:给图像加外发光 1、双击所在图层 2、选择外发光 3、调整发光颜色为白色 4、确定导出就可以 第二:给图像加描边 1、选择描边 2、调整描边颜色为白色, 3、点击确认完成 补充教程...
  • CSS实现Loading加载动画

    千次阅读 2016-03-04 01:11:05
    GIF相比,CSS实现的好处主要在于,对于不同背景颜色,该动画都是完美的,还可以用CSS轻松实现阴影、发光等特效,而GIF虽然支持透明色,但创建时选择的背景色和实际背景色不一致会导致有明显的毛边,而且
  • 其中使用的是GDI+来显示.png透明背景的图片,图片是在网上找的一张,然后又用PS把其中发光的星星给去掉了,做了一张不带发光星星的 .png图片,然后在程序中使用一个定时器来定时刷新窗口背景,使用这两张图片交替...
  • 需求是做一个类似转盘的功能,详细看一下Gif,如下图: 黄色发光图一开始加速转动然后再缓慢停下,弹出奖励的效果,底部背景不动,只有黄色发光图在闪烁,每一个奖励的位置是可以获取的,想想怎样才能实现加速然后...
  • 但对于有透明度、阴影、发光等效果的,PNG图片就比GIF图片更有优势。但目前只有Firefox、Opera、IE7这三款浏览器对PNG图片支持得比较好,我们常用的IE6.0却不支持透明的PNG图片,因此要让PNG透明背景图片在IE6.0 中...
  • 预览图均为GIF,较大 控件列表 GlowCircularImage 圆形发光图像 MagicFish 灵动的小鱼 ImageHelper 支持动图的编辑器 FramelessWindow 无边框窗口 PolygonWindow 多边形窗口 HistoryEditor 历史编辑器...
  • PNG图处作为背景的问题

    千次阅读 2011-05-16 17:16:00
    png图片在IE6下透明效果...但对于有透明度、阴影、发光等效果的,PNG图片就比GIF图片更有优势。但目前只有Firefox、Opera、IE7这三款浏览器对PNG图片 解决IE6下png透明失效的问题-IE6 png 透明 (四种解决方法)
  • 以前我们大部分的Loading动画都是利用gif图片实现的,这种图片实现Loading动画的方法虽然也很不错,但是作为HTML5开发者来说,如果能利用HTML5和CSS3实现这些超酷的Loading动画,那将是一件非常痛快的事情。...
  • Otkritkiok.ru-crx插件

    2021-04-06 15:54:01
    很酷的动画图片,祝贺,以及有趣的闪闪发光GIF,发送在社交网络上。 从卷发领导者 - otkritkiok.ru的明信片,图片和祝贺。最大的美丽明信片的目录生日快乐,祝贺凉爽的照片,以及每日GIF,早上好,晚安。超过1500...
  • 以前我们大部分的Loading动画都是利用gif图片实现的,这种图片实现Loading动画的方法虽然也很不错,但是作为HTML5开发者来说,如果能利用HTML5和CSS3实现这些超酷的Loading动画,那将是一件非常痛快的事情。...
  • 以前我们大部分的Loading动画都是利用gif图片实现的,这种图片实现Loading动画的方法虽然也很不错,但是作为HTML5开发者来说,如果能利用HTML5和CSS3实现这些超酷的Loading动画,那将是一件非常痛快的事情。...
  • 超酷jQuery进度条加载动画集合

    千次阅读 2015-08-13 22:20:36
    在丰富多彩的网页世界中,进度条加载动画的形式非常多样,有利用gif图片实现的loading动画,也有利用jQuery和CSS3实现的进度加载动画,本文主要向大家介绍很多jQuery和CSS3实现的进度条加载动画,每一个都非常具有...

空空如也

空空如也

1 2 3
收藏数 59
精华内容 23
关键字:

发光gif