如何自定义圆形进度条哪,也就是替换一下进度条的图片而已。
先分析一下,系统对进度条如何定义的:
咱们一般情况下载布局文件中这么书写:
从上面可以看出,进度条的样式放在了系统的主题样式里面的,做为系统样式的一部分。
再看看这个样式文件如何定义的:
看到这里就知道,引用的图片在这里:<item name="android:indeterminateDrawable">@android:drawable/progress_small_white</item>注意:spinner_white_16不一定就是一张纯的图片,有可能是动画。
从下面的实现方式就能知道spinner_white_16到底是不是图片:在这里明确一下,可以是图片,当然也可以使其他的,请看下面的实现
定义实现:
其实就是
把这个属性指向的资源改为你想要的就可以。
实现的三种方式:
1.指向动画的实现方式
熊猫阅读就是利用这种方式实现的:
看代码:
在res资源文件夹下的anim文件夹下创建一个动画文件:
内容如下:比如名字命名为loading.xml
每个item分别引用一张图片引用就是这样
2.指向用颜色定义的drawable资源:
引用的时候就是使用drawble了 当然这样也可以:
3.引用一个图片
drawable文件:
引用一张图片
最后总结一下,其实引用的里面,都有旋转动画,如果只引用一张图片的话,他不会旋转的。有兴趣的朋友自己可以试一下。也可以看看源码如何实现的。有什么建议请留言。
使用drawable和第二种方式一样。
需要源码的同学,加入这个群:200956440,群共享里有源码。
在GLSL中,subroutine是这样一种机制:它根据某个变量的值把一个函数调用和一个函数定义集合中的某一个函数定义绑定起来。在很多方面它和C语言中的函数指针类似。一个全局变量充当指针,用来调用函数。可以在OpenGL中设置这个变量的值,这样可以把它和多个函数定义中的一个绑定起来。subroutine中的函数定义不一定要同名,但是必须要有同等数量和相同类型的参数以及相同的返回类型
Subroutines提供了在运行时刻不用切换着色器或者是重新编译或者是使用if判断就能选择不同实现功能的方法。例如,一个着色器里面可以实现多种算法用来在场景中渲染不同的对象。当渲染场景的时候,我们可以通过改变subroutines的全局变量的值来选择合适的渲染算法而不是去通过切换着色器或者是使用条件判断来实现。
注意:由于性能在着色器中越来越重要,所以避免条件判断或着色器切换是很有必要的。有了subroutines,我们就能够在不增加计算负载的情况下实现条件判断和着色器切换的功能。
下面用一个例子来进行说明。在这个例子中,采用subroutine渲染了两次茶壶。分别采用不同的光照模型。第一次用ADS(ambient,diffuse,specular)模型进行渲染,第二次只用diffuse模型渲染。一个subroutine全局变量用来选择渲染算法。下面两幅图可以看出效果的对比。
左边是ADS模型渲染效果,右边是diffuse模型渲染效果。
下面介绍使用subroutines的步骤。
我们在vertex shader中进行subroutines的定义。
(1)首先是定义subroutine类型:
subroutine vec3 shadeModelType( vec4 position, vec3 normal);
上面的代码定义了一个新的subroutine类型,其名字是shadeModelType。其语意和函数原型很类似。它定义了一个名字,一个参数列表和返回类型,参数名不是必须的。
(2)紧接着我们定义一个上述类型的uniform变量shadeModel:
subroutine uniform shadeModelType shadeModel;
这个变量充当了函数指针的作用,它在OpenGL应用程序中将会被赋值为两个可能的函数之一。
(3)定义两个函数,作为subroutine的一部分。
它们都有一个前缀是:
subroutine( shadeModelType )
其意味着函数和subroutine类型匹配。我们使用这个前缀定义了两个函数:
(4)函数调用在vertex shader的main函数中,我们使用subroutine的uniform变量shadeModel来调用定义的两个函数。
LightIntensity = shadeModel( eyePosition, eyeNorm );
这样,根据uniform变量shadeModel的值,这个调用会被绑定到上述我们定义的两个函数之一。
(5)给subroutine uniform变量赋值。
分两步进行。
1、使用glGetSubroutineIndex函数查询每个subroutine函数的索引。
第一个参数是程序的句柄。第二个是着色器。第三个是subroutine的名字。查询到的索引存储在两个GLuint型的值中。2、为了选择合适的subroutine函数,我们需要给subroutine uniform变量shadeModel赋值。采用如下函数调用实现:
glUniformSubroutinesuiv( GL_VERTEX_SHADER, 1, &adsIndex);
这个函数可以一次设置多个uniform变量值。第一个参数指定着色阶段。第二个是要设定的uniform变量的数量。这里只需要设置一个uniform变量的值。
如果要设置多个,那么第三个参数应该是个数组,通常数组中的第i个元素赋值给subroutine uniform变量中索引为i的那个。
这里只需要设置一个值,我们设置的是索引为0 的那么subroutine uniform变量。
注意:OpenGL中,uniform 变量的索引默认就是从0开始的。如果有多个变量需要设置,可以用 glGetSubroutineUniformLocation()查询。
接下来进行渲染就可以得出相应的效果了。
要进行另外一种效果的渲染只需调用下面函数:
glUniformSubroutinesuiv( GL_VERTEX_SHADER, 1, &diffuseIndex);
再进来渲染过程即可。
网站上传的500多张图片后发现需要区分缩略图,大图,中图。但是之前上传的没有区分,无奈之下只能省事的办法了,总不能一张一张的修改吧。
写一段bash,使用mv命令达到批量重命名的目的。
例子:我现在要把aaaaaaaaaaaaa.jpg重命名为aaaaaaaaaaaaa_MED.jpg
请使用如下命令:
for i in *.jpg;do mv "$i" "${i%.jpg}_MED.jpg" ;done
同理aaaaaaaaaaaaa_MED.jpg重命名为aaaaaaaaaaaaa_LRG.jpg的方法:
for i in *.jpg;do mv "$i" "${i%_MED.jpg}_LRG.jpg" ;done