在 android 自定義 view 中,path 可能用的比較多,pathmeasure 可能用的比較少,就我而言,以前也沒有使用過 pathmeasure 這個 api,看到別人用 pathmeasure 和 valueanimator 結合在一起完成了很好的動畫效果,於是我也學習下 pathmeasure ,此處記錄下。
構造器:
方法名含義pathmeasure()
建立乙個空的 pathmeasure 物件
pathmeasure(path path,boolean forceclosed)
建立 pathmeasure 並關聯乙個指定的 path
forceclosed 含義:
// 建立乙個 path 物件
path = new path();
path.moveto(20, 20);
path.lineto(200, 20);
path.lineto(200, 400);
在 ondraw(canvas canvas) 中繪製 path
可以看到:當 forceclosed = true 時, path 進行了閉合,相應的 path 長度也變長了,即 算上了斜邊的長度。
效果:
繪製對號,叉號,主要是通過 valueanimator 結合 getsegment() 不斷繪製新的弧形段,其中,叉號由兩個 path 組成,在第乙個 path 繪製完成時,需要呼叫 pathmeasure.nextcontour() 跳轉到另乙個 path。
getsegment() 將獲取的片段填充到 destpath 中,在 android 4.4 及以下版本中,不能繪製,需要呼叫 destpath.reset(),destpath.line(0,0)
loadingview 完整**:
public
class
loadingview
extends
view
public
loadingview(context context, attributeset attrs)
private
void
init(context context, attributeset attrs) catch (exception e) finally
}paint = createpaint(color, strokewidth, paint.style.stroke);
}@override
protected
void
onsizechanged(int w, int h, int oldw, int oldh)
private
void
initsuccessanimator()
});}
private
void
initfailanimator()
});// pathmeasure.setpath(leftfailpath, false);
leftfailanimator = valueanimator.offloat(0, 1f);
leftfailanimator.addupdatelistener(new valueanimator.animatorupdatelistener()
});animatorset = new animatorset();
animatorset.play(leftfailanimator).after(rightfailanimator);
animatorset.setduration(500);
animatorset.setinterpolator(new linearinterpolator());
}/**
* 測量控制項的寬高,當測量模式不是精確模式時,設定預設寬高
**@param widthmeasurespec
*@param heightmeasurespec
*/@override
protected
void
onmeasure(int widthmeasurespec, int heightmeasurespec)
if (heightmode == measurespec.at_most || heightmode == measurespec.unspecified)
super.onmeasure(widthmeasurespec, heightmeasurespec);
}@override
protected
void
ondraw(canvas canvas)
}if (startangle > minangle + 300)
canvas.rotate(curangle += rotatedelta, 0, 0);//旋轉rotatedelta=4的弧長
canvas.drawarc(rectf, startangle, endangle, false, paint);
// endangle += 6 放在 drawarc()後面,是防止剛進入時,突兀的顯示了一段圓弧
if (startangle == minangle)
invalidate();
}if (isshowresult) else
if (stateenum == stateenum.load_failed)
canvas.drawpath(destpath, paint);}}
canvas.restore();
}public
void
updatestate(stateenum stateenum) else
if (stateenum == stateenum.load_failed)
}public
enum stateenum
/*** 建立畫筆
**@param color 畫筆顏色
*@param strokewidth 畫筆寬度
*@param style 畫筆樣式
*@return
*/private paint createpaint(int color, int strokewidth, paint.style style)
/*** dp 轉換成 px
**@param dpvalue
*@return
*/private
intdp2px(int dpvalue)
}
github : 仿支付寶支付成功動畫
與支付寶支付成功後類似的乙個動畫,本人小白乙隻大神請繞過,畫的菜大家見諒 直接將view拷貝進專案中即可,動畫開關為loadcircle和stop方法,提供了監聽介面ondonecircleanimlistner以便於和外部邏輯銜接 import android.animation.animator...
iOS 仿支付寶密碼支付
位址如下 問題二 怎麼做到輸入密碼的時候黑點顯示或消失一致 void passwordfielddidchange uitextfield field if passwordfield.text length 6 else add the actions.alertcontroller addact...
高仿支付寶手勢解鎖
支援原創框架,歡迎star,詳細使用方法請參見 corelock 高仿支付寶解鎖!注 本框架是高仿支付寶,並整合了所有功能,並非乙個簡單的解鎖介面展示。個人製作用時1週多,打造解鎖終結者框架。框架特性 ios版本相容ios 7.0及以上.扁平化設計,全部使用quartzcore引擎繪製,沒有使用任何...