-
Drawable的繪制流程查看全部
-
透明度過濾光計算查看全部
-
透明度過濾光計算查看全部
-
Drawable繪制流程查看全部
-
動畫機制查看全部
-
1、首先確定點擊位置,設置為啟動時的圓心 2、圓心是逐漸移動的,結束位置為控件的中心區(qū)域 3、圓的半徑最大值為中心到邊緣的最大長度 4、背景顏色透明度逐漸加深的過程查看全部
-
完成退出動畫 1.退出動畫的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()要完成兩個工作 (1)背景色由深變淡 (2)漣漪的圓顏色減淡 private void onExitProgressChanged(float realProgress) { // 第一個參數(shù)是初始值, 背景色減淡 mBackgroundColor = changeColorAlpha(0x30000000, 1 - realProgress); // 漣漪的圓減淡 mAlpha = (int) (INIT_ALPHA * (1 - realProgress)); onColorOrAlphaChanged(); invalidateSelf(); } 3.其他的地方好好看一下代碼查看全部
-
增強漣漪動畫效果 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; } 其實就是變化了alpha值,其他三色都不變。 (2)進度值變化時調用這個方法來改變背景色 private void onProgressChanged(float realProgress) { mRadius = mMaxRadius * realProgress; mDrawableX = mDownCenterX + (mCenterX - mDownCenterX) * realProgress; mDrawableY = mDownCenterY + (mCenterY - mDownCenterY) * realProgress; mBackgoundColor = changeColorAlpha(0x40000000, realProgress); invalidateSelf(); }查看全部
-
增強漣漪動畫效果 1.效果圖 (1)背景色變深 (2)圓心位置向中心位置移動 (3)圓半徑變大 2.先實現(xiàn)后面兩點 1.圓半徑隨進度變大,這個已經(jīng)實現(xiàn) 2.漣漪效果的圓心向控件中心靠攏——根據(jù)按下位置和控件中心位置 再結合進度來計算 private float mDrawableX, mDrawableY; // 漣漪效果的圓心 private float mDownCenterX, mDownCenterY; // 按下時的點 private float mCenterX, mCenterY; // 控件的中心位置 計算方法: mDrawableX = mDownCenterX + (mCenterX - mDownCenterX) * realProgress; mDrawableY = mDownCenterY + (mCenterY - mDownCenterY) * realProgress; 綜上,可以抽出一個方法: private void onProgressChanged(float realProgress) { mRadius = mMaxRadius * realProgress; mDrawableX = mDownCenterX + (mCenterX - mDownCenterX) * realProgress; mDrawableY = mDownCenterY + (mCenterY - mDownCenterY) * realProgress; invalidateSelf(); } 在runnable中進度值變化時調用。查看全部
-
了解drawable如何實現(xiàn)動畫 1.drawable的動畫機制 (1)常規(guī)動畫:逐幀動畫,補間動畫 僅僅改變動畫效果,不改變控件參數(shù)值 (2)屬性動畫 改變控件的參數(shù)值 這兩種動畫都是通過handler來實現(xiàn)的 2.如何實現(xiàn)動畫 按下的時候啟動一個runnable,并在這個runnable里面繼續(xù)schedule這個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); } }; 關于插值器,我已經(jīng)懂了查看全部
-
!?。?查看全部
-
!!!查看全部
-
!!!查看全部
-
!!!!查看全部
-
!!!設置默認值查看全部
-
!!!查看全部
-
!!!查看全部
-
!!!查看全部
-
將顏色值傳進來查看全部
-
!!!查看全部
舉報
0/150
提交
取消