ExplosionField簡單分析
首先來個傳送門吧
先來看看怎麼使用吧(比較簡單)
- 首先獲取到ExplosionField例項
ExplosionField.attach2Window(this);
- 接著就是呼叫了撒
mExplosionField.explode(v);
- 看看實現效果吧 _ ( 盜用作者的圖哈~~)
原始碼分析
- 吧原始碼搞下來 (~~就只用3個類 哈哈)
- 首先來看attach方法 ExplosionField.attach2Window(this)
public static ExplosionField attach2Window(Activity activity) {
ViewGroup rootView = (ViewGroup) activity.findViewById(
Window.ID_ANDROID_CONTENT);
ExplosionField explosionField = new ExplosionField(activity);
rootView.addView(explosionField,
new ViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT)
);
return explosionField;
}
-
這個Window.ID_ANDROID_CONTENT,稍微解釋哈,我們setContentView的時候就其實就是吧我們的佈局新增到一個FrameLayout裡面,而這個FrameLayout的id就是android.R.id.content
最後在ContentView裡面新增一個ExplosionField控制元件,並且把這個控制元件返回給呼叫著。
-
接下來看看呼叫這個控制元件ExplosionField怎麼實現的
- 首先在構造方法裡面呼叫了init方法,就是初始化了一個int陣列,初始化的值都是32dp
private int[] mExpandInset = new int[2];
private void init() {
Arrays.fill(mExpandInset, Utils.dp2Px(32));
}
- onDraw方法,可以看到就是遍歷了一個集合並呼叫了集合元素的draw方法。
```java
private List<ExplosionAnimator> mExplosions = new ArrayList<>();
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
for (ExplosionAnimator explosion : mExplosions) {
explosion.draw(canvas);
}
}
- 初始化和onDraw方法都看完了,現在來看看呼叫的explode方法。其實就是獲取控制元件的位置,然後構造了一個ValueAnimator,最後呼叫了start方法
public void explode(final View view) {
Rect r = new Rect();
view.getGlobalVisibleRect(r);
int[] location = new int[2];
getLocationOnScreen(location);
r.offset(-location[0], -location[1]);
r.inset(-mExpandInset[0], -mExpandInset[1]);
int startDelay = 100;
ValueAnimator animator = ValueAnimator.ofFloat(0f, 1f).setDuration(150);
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
Random random = new Random();
@Override
public void onAnimationUpdate(ValueAnimator animation) {
view.setTranslationX((random.nextFloat() - 0.5f) * view.getWidth() * 0.05f);
view.setTranslationY((random.nextFloat() - 0.5f) * view.getHeight() * 0.05f);
}
});
animator.start();
view.animate().setDuration(150).setStartDelay(startDelay).scaleX(0f).scaleY(0f).alpha(0f).start();
explode(Utils.createBitmapFromView(view), r, startDelay, ExplosionAnimator.DEFAULT_DURATION);
}
```java
public void explode(Bitmap bitmap, Rect bound, long startDelay, long duration) {
final ExplosionAnimator explosion = new ExplosionAnimator(this, bitmap, bound);
explosion.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
mExplosions.remove(animation);
}
});
explosion.setStartDelay(startDelay);
explosion.setDuration(duration);
mExplosions.add(explosion);
explosion.start();
}
- 最後看看比較取巧的一個執行動畫的方法,在view的onDraw方法呼叫ValueAnimator的draw方法,ValueAnimator的draw方法在去呼叫View的invalidate方法。
```java
public boolean draw(Canvas canvas) {
if (!isStarted()) {
return false;
}
for (Particle particle : mParticles) {
particle.advance((float) getAnimatedValue());
if (particle.alpha > 0f) {
mPaint.setColor(particle.color);
mPaint.setAlpha((int) (Color.alpha(particle.color) * particle.alpha));
canvas.drawCircle(particle.cx, particle.cy, particle.radius, mPaint);
}
}
mContainer.invalidate();
return true;
}
Nothing is certain in this life. The only thing i know for sure is that. I love you and my life. That is the only thing i know. have a good day
:)
相關文章
- mr原理簡單分析
- SSRF漏洞簡單分析
- 簡單陰影分析
- Dubbo原理簡單分析
- js熱更新簡單分析JS
- MediaScanner原始碼簡單分析原始碼
- 骷髏病毒簡單分析
- 簡單的UrlDns鏈分析DNS
- HDLC報文簡單分析
- butterknife原始碼簡單分析&原理簡述原始碼
- redux簡單實現與分析Redux
- 簡單分析shared pool(一)
- 簡單分析shared pool(二)
- 簡單分析shared pool(三)
- 一隻android簡訊控制馬的簡單分析Android
- Java 8 ArrayList 原始碼簡單分析Java原始碼
- 面試官:簡單聊聊 Go 逃逸分析?面試Go
- 伺服器系統簡單分析伺服器
- 簡單的招聘資訊圖表分析
- 簡單分析percona-zabbix-templates
- MySQL修復表的簡單分析MySql
- ElasticSearch 簡單的 搜尋 聚合 分析Elasticsearch
- ZipperDown漏洞簡單分析及防護
- 資料遷移工具簡單分析
- Teleport pro 演算法簡單分析演算法
- org.springframework.core簡單分析SpringFramework
- 分析行連結的簡單方法
- 簡單分析MySQL中的primary key功能MySql
- 編譯程式(compiler)的簡單分析編譯Compile
- 簡單分析軟體專案成本管理
- 爬蟲-BeautifulSoup簡單分析和學習爬蟲
- JavaScript簡單計算器程式碼分析JavaScript
- Android ListView初始化簡單分析AndroidView
- wifidog 程式碼簡單分析(1)WiFi
- 簡單分析oracle的資料儲存Oracle
- 中文詞法分析的簡單程式 (轉)詞法分析
- 金融大資料分析還不簡單,有了Smartbi簡單幾步就能搞定大資料
- CVE-2016-1757簡單分析