東西我很快熟起來,很不理想,但是,嘿,它的東西:Gist
基本上繪製基於動畫半徑的圓。爲了得到精確的L效果,應該進行一些調整。有趣的代碼:
@Override
public boolean onTouchEvent(@NonNull final MotionEvent event) {
if (event.getActionMasked() == MotionEvent.ACTION_UP) {
mDownX = event.getX();
mDownY = event.getY();
ObjectAnimator animator = ObjectAnimator.ofFloat(this, "radius", 0, getWidth() * 3.0f);
animator.setInterpolator(new AccelerateInterpolator());
animator.setDuration(400);
animator.start();
}
return super.onTouchEvent(event);
}
public void setRadius(final float radius) {
mRadius = radius;
if (mRadius > 0) {
RadialGradient radialGradient = new RadialGradient(
mDownX,
mDownY,
mRadius * 3,
Color.TRANSPARENT,
Color.BLACK,
Shader.TileMode.MIRROR
);
mPaint.setShader(radialGradient);
}
invalidate();
}
private Path mPath = new Path();
private Path mPath2 = new Path();
@Override
protected void onDraw(@NonNull final Canvas canvas) {
super.onDraw(canvas);
mPath2.reset();
mPath2.addCircle(mDownX, mDownY, mRadius, Path.Direction.CW);
canvas.clipPath(mPath2);
mPath.reset();
mPath.addCircle(mDownX, mDownY, mRadius/3, Path.Direction.CW);
canvas.clipPath(mPath, Region.Op.DIFFERENCE);
canvas.drawCircle(mDownX, mDownY, mRadius, mPaint);
}
在他們的談話「什麼是Android新功能」,他們談到了這個動畫實際上發生在一個單獨的「渲染線程」,這將使得它首次在L-釋放。這將允許更平滑的動畫,即使UI線程正在膨脹,或者做其他任何昂貴的動作。
我會等到明天(當新的L相關的API將被髮布),所以我們可以看到支持庫中是否會有某些內容來支持它。 –
最好的方法是使用自定義drawable。請參閱我以前的答案:http://stackoverflow.com/questions/24213356/animating-actionbars-icon/24214040#24214040(請務必閱讀對答案的評論) – Budius