資源簡介
參照:http://blog.csdn.net/Poison_H/article/details/43735445。點擊手機屏幕實現水波效果,如下圖:
【核心代碼】
public class WaterWaveView extends SurfaceView implements SurfaceHolder.Callback { // 背景圖的寬度和高度 private int backWidth; private int backHeight; /** * buf1 和 buf2是波能緩沖區,分別代表了每個點的前一時刻和后一時刻的波幅數據 */ private short[] buf1; private short[] buf2; private int[] bitmap1; private int[] bitmap2; private Bitmap bgImage = null; // 是否第一次加載 private boolean firstLoad = false; WavingThread wavingThread = new WavingThread(); // 顯示一個surface的抽象接口,使你可以控制surface的大小和格式, 以及在surface上編輯像素,和監視surace的改變 SurfaceHolder mSurfaceHolder = null; private int doubleWidth; private int fiveWidth; // 持續時間 private int loopTime; private int bitmapLen; public WaterWaveView(Context context) { super(context); mSurfaceHolder = getHolder(); mSurfaceHolder.addCallback(this); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { if (!firstLoad) { // 背景圖 bgImage = BitmapFactory.decodeResource(this.getResources(), R.drawable.bg); bgImage = Bitmap.createScaledBitmap(bgImage, w, h, false);// 縮放而已 backWidth = bgImage.getWidth(); backHeight = bgImage.getHeight(); buf2 = new short[backWidth * backHeight]; buf1 = new short[backWidth * backHeight]; bitmap2 = new int[backWidth * backHeight]; bitmap1 = new int[backWidth * backHeight]; // 將bgImage的像素拷貝到bitmap1數組中,用于渲染。。。 bgImage.getPixels(bitmap1, 0, backWidth, 0, 0, backWidth, backHeight); bgImage.getPixels(bitmap2, 0, backWidth, 0, 0, backWidth, backHeight); for (int i = 0; i < backWidth * backHeight; i) { buf2[i] = 0; buf1[i] = 0; } doubleWidth = backWidth << 1; fiveWidth = 5 * backWidth; loopTime = ((backHeight - 4) * backWidth) >> 1; bitmapLen = backWidth * backHeight - 1; firstLoad = true; } } class WavingThread extends Thread { boolean running = true; public void setRunning(boolean running) { this.running = running; } @Override public void run() { Canvas c = null; while (running) { c = mSurfaceHolder.lockCanvas(); makeRipple(); doDraw(c); mSurfaceHolder.unlockCanvasAndPost(c); } } } /******************************************************* * 計算波能數據緩沖區 *******************************************************/ private void makeRipple() { int k = fiveWidth; int xoff = 0, yoff = 0; int cp = 0; int tarClr = 0; int i = fiveWidth; while (i < loopTime) { // 波能擴散 buf2[k] = (short) (((buf1[k - 2] buf1[k 2] buf1[k - doubleWidth] buf1[k doubleWidth]) >> 1) - buf2[k]); // 波能衰減 buf2[k] = (short) (buf2[k] - (buf2[k] >> 5)); // 求出該點的左上的那個點xoff,yoff cp = k - doubleWidth - 2; xoff = buf2[cp - 2] - buf2[cp 2]; yoff = buf2[cp - doubleWidth] - buf2[k - 2]; tarClr = k yoff * doubleWidth xoff; if (tarClr > bitmapLen || tarClr < 0) { k = 2; continue; } // 復制象素 bitmap2[k] = bitmap1[tarClr]; k = 2; i; } short[] tmpBuf = buf2; buf2 = buf1; buf1 = tmpBuf; } /***************************************************** * 增加波源 x坐標 y坐標 波源半徑 波源能量 *****************************************************/ private void touchWater(int x, int y, int stonesize, int stoneweight) { // 判斷坐標是否在屏幕范圍內 if (x stonesize > backWidth) { return; } if (y stonesize > backHeight) { return; } if (x - stonesize < 0) { return; } if (y - stonesize < 0) { return; } // 產生波源,填充前導波能緩沖池 int endStoneX = x stonesize; int endStoneY = y stonesize; int squaSize = stonesize * stonesize; int posy = y - stonesize; int posx = x - stonesize; for (posy = y - stonesize; posy < endStoneY; posy) { for (posx = x - stonesize; posx < endStoneX; posx) { if ((posx - x) * (posx - x) (posy - y) * (posy - y) < squaSize) { buf1[backWidth * posy posx] = (short) -stoneweight; } } } } /***************************************************** * 增加波源 x坐標 y坐標 波源半徑 波源能量 *****************************************************/ private void trickWater(int x, int y, int stonesize, int stoneweight) { // 判斷坐標是否在屏幕范圍內 if (x stonesize > backWidth) { return; } if (y stonesize > backHeight) { return; } if (x - stonesize < 0) { return; } if (y - stonesize < 0) { return; } // 產生波源,填充波能緩沖池 int endStoneX = x stonesize; int endStoneY = y stonesize; int posy = y - stonesize; int posx = x - stonesize; for (posy = y - stonesize; posy < endStoneY; posy) { for (posx = x - stonesize; posx < endStoneX; posx) { if (posy >= 0 && posy < backHeight && posx >= 0 && posx < backWidth) { buf1[backWidth * posy posx] = (short) -stoneweight; } } } } @Override public boolean onTouchEvent(MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN) { // 設置波源半徑和波源能量 touchWater((int) event.getX(), (int) event.getY(), 200, 300); } else if (event.getAction() == MotionEvent.ACTION_MOVE) { trickWater((int) event.getX(), (int) event.getY(), 200, 300); } return true; } protected void doDraw(Canvas canvas) { /** * Parameters: 1.colors 2.offset 3.stride 4.x 5. y 6.width 7.height * 8.hasAlpha 9. paint */ //繪制 canvas.drawBitmap(bitmap2, 0, backWidth, 0, 0, backWidth, backHeight, false, null); } @Override public void surfaceCreated(SurfaceHolder holder) { wavingThread.setRunning(true); wavingThread.start(); } @Override public void surfaceDestroyed(SurfaceHolder holder) { boolean retry = true; wavingThread.setRunning(false); // 非暴力關閉線程,直到此次該線程運行結束之前,主線程停止運行,以防止Surface被重新激活 while (retry) { try { wavingThread.join(); // 阻塞current // Thread(當前執行線程)直到被調用線程(thread)完成。 retry = false; } catch (InterruptedException e) { } } } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { // TODO Auto-generated method stub } }
waterWaveView = new WaterWaveView(this); setContentView(waterWaveView);
代碼片段和文件信息
/**
?*?Automatically?generated?file.?DO?NOT?MODIFY
?*/
package?com.casjs.waterwave.test;
public?final?class?BuildConfig?{
??public?static?final?boolean?DEBUG?=?Boolean.parseBoolean(“true“);
??public?static?final?String?APPLICATION_ID?=?“com.casjs.waterwave.test“;
??public?static?final?String?BUILD_TYPE?=?“debug“;
??public?static?final?String?FLAVOR?=?““;
??public?static?final?int?VERSION_CODE?=?1;
??public?static?final?String?VERSION_NAME?=?“1.0“;
}
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????目錄???????????0??2018-03-05?13:16??WaterWave\
?????文件?????????127??2018-03-05?13:16??WaterWave\.gitignore
?????目錄???????????0??2018-03-05?13:16??WaterWave\.gradle\
?????目錄???????????0??2018-03-05?13:35??WaterWave\.gradle\4.1\
?????目錄???????????0??2018-03-05?13:16??WaterWave\.gradle\4.1\fileChanges\
?????文件???????????1??2018-03-05?14:54??WaterWave\.gradle\4.1\fileChanges\last-build.bin
?????目錄???????????0??2018-03-05?13:35??WaterWave\.gradle\4.1\fileContent\
?????文件??????????17??2018-03-05?14:54??WaterWave\.gradle\4.1\fileContent\fileContent.lock
?????目錄???????????0??2018-03-05?13:16??WaterWave\.gradle\4.1\fileHashes\
?????文件??????266969??2018-03-05?14:54??WaterWave\.gradle\4.1\fileHashes\fileHashes.bin
?????文件??????????17??2018-03-05?14:54??WaterWave\.gradle\4.1\fileHashes\fileHashes.lock
?????文件???????19925??2018-03-05?13:36??WaterWave\.gradle\4.1\fileHashes\resourceHashesCache.bin
?????目錄???????????0??2018-03-05?13:35??WaterWave\.gradle\4.1\javaCompile\
?????文件??????775418??2018-03-05?13:56??WaterWave\.gradle\4.1\javaCompile\classAnalysis.bin
?????文件??????321993??2018-03-05?13:36??WaterWave\.gradle\4.1\javaCompile\jarAnalysis.bin
?????文件??????????17??2018-03-05?13:56??WaterWave\.gradle\4.1\javaCompile\javaCompile.lock
?????文件??????142201??2018-03-05?13:56??WaterWave\.gradle\4.1\javaCompile\taskHistory.bin
?????文件???????20786??2018-03-05?13:56??WaterWave\.gradle\4.1\javaCompile\taskJars.bin
?????目錄???????????0??2018-03-05?13:16??WaterWave\.gradle\4.1\taskHistory\
?????文件?????2343365??2018-03-05?14:53??WaterWave\.gradle\4.1\taskHistory\fileSnapshots.bin
?????文件???????78864??2018-03-05?14:53??WaterWave\.gradle\4.1\taskHistory\taskHistory.bin
?????文件??????????17??2018-03-05?14:54??WaterWave\.gradle\4.1\taskHistory\taskHistory.lock
?????目錄???????????0??2018-03-05?13:16??WaterWave\.gradle\buildOutputCleanup\
?????文件???????????0??2018-03-05?13:16??WaterWave\.gradle\buildOutputCleanup\built.bin
?????文件??????????51??2018-03-05?13:16??WaterWave\.gradle\buildOutputCleanup\cache.properties
?????文件???????????2??2018-03-05?14:54??WaterWave\.gradle\buildOutputCleanup\cache.properties.lock
?????目錄???????????0??2018-03-05?15:08??WaterWave\.idea\
?????文件?????????626??2018-03-05?13:16??WaterWave\.idea\gradle.xm
?????目錄???????????0??2018-03-05?13:22??WaterWave\.idea\libraries\
?????文件?????????533??2018-03-05?13:16??WaterWave\.idea\libraries\android_arch_core_common_1_0_0_jar.xm
?????文件?????????548??2018-03-05?13:16??WaterWave\.idea\libraries\android_arch_lifecycle_common_1_0_0_jar.xm
............此處省略2976個文件信息
- 上一篇:android 版本更新
- 下一篇:android+netty 入門級
評論
共有 條評論