在初探自定義View(一)里面畜眨,我們?cè)谠鶷extView的基礎(chǔ)上做了一點(diǎn)小修改昼牛,最后實(shí)現(xiàn)了想要的效果,今天的任務(wù)主要是希望View能夠“動(dòng)”起來(lái)---文字閃動(dòng)效果康聂。
在動(dòng)手之前我們先來(lái)了解一下欲實(shí)現(xiàn)這個(gè)效果需要用到哪些類(lèi):
1.LinearGradient
1.LinearGradient(float x0, float y0, float x1, float y1, int colors[], float positions[], TileMode tile)
第一個(gè)參數(shù)為線性起點(diǎn)的x坐標(biāo)
第二個(gè)參數(shù)為線性起點(diǎn)的y坐標(biāo)
第三個(gè)參數(shù)為線性終點(diǎn)的x坐標(biāo)
第四個(gè)參數(shù)為線性終點(diǎn)的y坐標(biāo)
第五個(gè)參數(shù)為實(shí)現(xiàn)漸變效果的顏色的組合
第六個(gè)參數(shù)為前面的顏色組合中的各顏色在漸變中占據(jù)的位置(比重)贰健,如果為空,則表示上述顏色的集合在漸變中均勻出現(xiàn)
第七個(gè)參數(shù)為渲染器平鋪的模式恬汁,一共有三種
-CLAMP
邊緣拉伸
-REPEAT
在水平和垂直兩個(gè)方向上重復(fù)伶椿,相鄰圖像沒(méi)有間隙
-MIRROR
以鏡像的方式在水平和垂直兩個(gè)方向上重復(fù)辜伟,相鄰圖像有間隙
2.public LinearGradient(float x0, float y0, float x1, float y1, int color0, int color1, TileMode tile)
其他參數(shù)同上
int color0表示漸變起始顏色
int color1表示漸變終止顏色
可以簡(jiǎn)單地把LinearGradient理解成一個(gè)著色器,可以根據(jù)要求來(lái)制定效果
2.Matrix
Matrix就簡(jiǎn)單一點(diǎn)了脊另,簡(jiǎn)單地理解成一個(gè)可移動(dòng)的畫(huà)布导狡。
下面開(kāi)始正式開(kāi)始繪制:
1.繪制工作的核心就是先設(shè)置一個(gè)不斷變化的LinearGradient,然后使Paint帶上這個(gè)屬性來(lái)繪制文字,感官上就覺(jué)得文字在閃動(dòng)偎痛,自定義View的第一步往往是初始化所需的工具旱捧,如LinearGradient、Paint等等:
protected void onSizeChanged(int w,int h,int oldw,int oldh){
super.onSizeChanged(w,h,oldw,oldh);
/*mViewWidth=w;*/
if (mViewWidth==0){
mViewWidth=getMeasuredWidth();
Log.d("tag","width is " + mViewWidth);
if (mViewWidth>0){
Paint mPaint=getPaint();
mLinearGradient=new LinearGradient(0,0,mViewWidth,0,new int[]{Color.BLUE,Color.RED,
Color.BLUE},null, Shader.TileMode.CLAMP);//LinearGradient類(lèi)是Shader類(lèi)的子類(lèi)
mPaint.setShader(mLinearGradient);
mGradientMatrix=new Matrix();//可理解成有軌道的畫(huà)板
}
}
}
2.最后在onDraw()方法中踩麦,讓這個(gè)矩陣滑板以一定的速度和頻率進(jìn)行移動(dòng)枚赡,從而產(chǎn)生文字閃動(dòng)效果:
protected void onDraw(Canvas canvas){
super.onDraw(canvas);
if (mGradientMatrix!=null){
mTranslate+=mViewWidth/5;
if (mTranslate>mViewWidth){ //改變閃爍的頻率,反比例變化
mTranslate=-mTranslate;
}
mGradientMatrix.setTranslate(mTranslate,0);
mLinearGradient.setLocalMatrix(mGradientMatrix);
postInvalidateDelayed(100);//改變一次閃爍中顏色變化的速度谓谦,也就是畫(huà)布移動(dòng)的速度
}
}
由于在執(zhí)行super.onDraw(canvas)
了之后贫橙,文字的繪制工作已經(jīng)完成,所以實(shí)際上在繪制之前反粥,Paint已經(jīng)有了Matrix和LinearGradient的屬性卢肃,這樣在繪制文字的時(shí)候就能產(chǎn)生動(dòng)態(tài)的閃動(dòng)效果。
最后附上動(dòng)態(tài)效果圖:
Still foolish