Android自定義View---腐蝕面具
0.前言
最近一直在研究opengl,在android應用中可以很好的進行細粒度的對展示的效果進行控制,今天這個腐蝕面具的效果就是基於opengl es來做的。話不多說,先看效果圖

image
1.使用
使用很簡單,在佈局檔案中直接使用CorronisonView
<com.skateboard.corronisonview.CorronisonView app:duration="10" android:id="@+id/corronisonView" android:layout_width="match_parent" android:layout_height="match_parent" />
其中duration代表了銷燬時間。
然後在MainActivity裡設定bitmap
corronisonView.setBitmap(BitmapFactory.decodeResource(resources,R.drawable.icon))
2.程式碼
關於opengl es在android中的使用這裡就不細說了,整個過程其實就是利用了一個紋理來顯示圖片,然後隨著時間的推移捨棄一些片段不進行渲染。這裡主要來看一下片段著色器的程式碼
#version 300 es precision mediump float; in vec2 texCoord; out vec4 fragColor; uniform sampler2D sampler; uniform float percent; void main() { vec4 samplerColor=texture(sampler,texCoord); float size=samplerColor.x+samplerColor.y+samplerColor.z+samplerColor.w; float curSize=4.0*percent; if(size<=curSize) discard; fragColor=samplerColor; }
隨著時間的推移不停的設定percent,然後計算當前顏色的所有顏色分量的和如果小於總分量(也就是4.0)*percent的值的話,就捨棄該片段,不進行渲染。
在CorronisonView中設定時間動畫,不停修改CorronisonViewRender中percent的值
private fun prepareTimeAnimator() { val animator = ValueAnimator.ofInt(time) animator.duration = time.toLong() * 1000 animator.addUpdateListener(ValueAnimator.AnimatorUpdateListener { render?.percent = it.animatedFraction }) this.animator = animator }
3最後
關注我的公眾號

image