-
Drawable的繪制流程查看全部
-
透明度過(guò)濾光計(jì)算查看全部
-
透明度過(guò)濾光計(jì)算查看全部
-
Drawable繪制流程查看全部
-
動(dòng)畫機(jī)制查看全部
-
1、首先確定點(diǎn)擊位置,設(shè)置為啟動(dòng)時(shí)的圓心 2、圓心是逐漸移動(dòng)的,結(jié)束位置為控件的中心區(qū)域 3、圓的半徑最大值為中心到邊緣的最大長(zhǎng)度 4、背景顏色透明度逐漸加深的過(guò)程查看全部
-
完成退出動(dòng)畫 1.退出動(dòng)畫的runnable private Runnable mExitRunnable = new Runnable() { @Override public void run() { mExitProgress = mExitProgress + EXIT_INCREMENT; if (mExitProgress > 1) { Log.d("zxt", "exit runnable done"); onExitProgressChanged(1); return; } float realProgress = mExitInterpolator.getInterpolation(mExitProgress); onExitProgressChanged(realProgress); // 延遲16毫秒再重繪, 保證潔面刷新頻率接近60fps scheduleSelf(mExitRunnable, SystemClock.uptimeMillis() + 16); } }; 2.在onExitProgressChanged()要完成兩個(gè)工作 (1)背景色由深變淡 (2)漣漪的圓顏色減淡 private void onExitProgressChanged(float realProgress) { // 第一個(gè)參數(shù)是初始值, 背景色減淡 mBackgroundColor = changeColorAlpha(0x30000000, 1 - realProgress); // 漣漪的圓減淡 mAlpha = (int) (INIT_ALPHA * (1 - realProgress)); onColorOrAlphaChanged(); invalidateSelf(); } 3.其他的地方好好看一下代碼查看全部
-
增強(qiáng)漣漪動(dòng)畫效果 1.按鈕背景色逐漸變深 (1)使用下面的方法改變顏色的透明度 private int changeColorAlpha(int color, float progress) { int alpha = (color >> 24) & 0xFF; alpha = (int) (alpha * progress); int red = (color >> 16) & 0xFF; int green = (color >> 8) & 0xFF; int blue = color & 0xFF; return (alpha << 24) | (red << 16) | (green << 8) | blue; } 其實(shí)就是變化了alpha值,其他三色都不變。 (2)進(jìn)度值變化時(shí)調(diào)用這個(gè)方法來(lái)改變背景色 private void onProgressChanged(float realProgress) { mRadius = mMaxRadius * realProgress; mDrawableX = mDownCenterX + (mCenterX - mDownCenterX) * realProgress; mDrawableY = mDownCenterY + (mCenterY - mDownCenterY) * realProgress; mBackgoundColor = changeColorAlpha(0x40000000, realProgress); invalidateSelf(); }查看全部
-
增強(qiáng)漣漪動(dòng)畫效果 1.效果圖 (1)背景色變深 (2)圓心位置向中心位置移動(dòng) (3)圓半徑變大 2.先實(shí)現(xiàn)后面兩點(diǎn) 1.圓半徑隨進(jìn)度變大,這個(gè)已經(jīng)實(shí)現(xiàn) 2.漣漪效果的圓心向控件中心靠攏——根據(jù)按下位置和控件中心位置 再結(jié)合進(jìn)度來(lái)計(jì)算 private float mDrawableX, mDrawableY; // 漣漪效果的圓心 private float mDownCenterX, mDownCenterY; // 按下時(shí)的點(diǎn) private float mCenterX, mCenterY; // 控件的中心位置 計(jì)算方法: mDrawableX = mDownCenterX + (mCenterX - mDownCenterX) * realProgress; mDrawableY = mDownCenterY + (mCenterY - mDownCenterY) * realProgress; 綜上,可以抽出一個(gè)方法: private void onProgressChanged(float realProgress) { mRadius = mMaxRadius * realProgress; mDrawableX = mDownCenterX + (mCenterX - mDownCenterX) * realProgress; mDrawableY = mDownCenterY + (mCenterY - mDownCenterY) * realProgress; invalidateSelf(); } 在runnable中進(jìn)度值變化時(shí)調(diào)用。查看全部
-
了解drawable如何實(shí)現(xiàn)動(dòng)畫 1.drawable的動(dòng)畫機(jī)制 (1)常規(guī)動(dòng)畫:逐幀動(dòng)畫,補(bǔ)間動(dòng)畫 僅僅改變動(dòng)畫效果,不改變控件參數(shù)值 (2)屬性動(dòng)畫 改變控件的參數(shù)值 這兩種動(dòng)畫都是通過(guò)handler來(lái)實(shí)現(xiàn)的 2.如何實(shí)現(xiàn)動(dòng)畫 按下的時(shí)候啟動(dòng)一個(gè)runnable,并在這個(gè)runnable里面繼續(xù)schedule這個(gè)runnable private void startEnterRunnable() { mProgress = 0; mRadius = 0; unscheduleSelf(mEnterRunnable); scheduleSelf(mEnterRunnable, SystemClock.uptimeMillis()); } private Interpolator mEnterInterpolator = new DecelerateInterpolator(1.5f); private Runnable mEnterRunnable = new Runnable() { @Override public void run() { mProgress = mProgress + 0.03f; if (mProgress > 1.2) { return; } float realProgress = mEnterInterpolator.getInterpolation(mProgress); mRadius = 400 * realProgress; invalidateSelf(); // 延遲16毫秒再重繪, 保證潔面刷新頻率接近60fps scheduleSelf(mEnterRunnable, SystemClock.uptimeMillis() + 16); } }; 關(guān)于插值器,我已經(jīng)懂了查看全部
-
?。?!查看全部
-
!!!查看全部
-
!!!查看全部
-
!!!!查看全部
-
!!!設(shè)置默認(rèn)值查看全部
-
!!!查看全部
-
!!!查看全部
-
!!!查看全部
-
將顏色值傳進(jìn)來(lái)查看全部
-
!!!查看全部
舉報(bào)
0/150
提交
取消