標籤:android 影像處理 技術 設計 效果
好吧,關於Android中影像處理的最後一個微博,保證是最後一個了,希望泥萌不要罵我。。。
今天想實現的效果是:終極大招:利用BitmapMesh來實現一些特效。
當然,BitmapMesh功能十分強大,開啟大家的腦洞,相信大家會設計出更炫麗的特效:
和往常一樣,首先,上,賣個萌:
怎麼樣,普通的一張圖按正弦曲線跳起舞來了。。。
然後,開始吧:
首先,自訂View:BitmapMeshView:
public class BitmapMeshView extends View { //後面跳舞的那張圖片 private Bitmap mBitmap; //每個格子的寬度 private int WIDTH = 200; //每個格子的高度 private int HEIGHT = 200; //交點的總個數,比如說一個三行三列的表格,共有4*4=16個節點,不信自己數數看 private int COUNT = (WIDTH + 1) * (HEIGHT + 1); //用來存放更改後的每個點的座標:說明一點,這裡我們用連續的兩個點表示一個座標: //比如說verts[0]和verts[1]聯合表示第一個節點座標,verts[2]和verts[3]聯合表示第二個節點座標,以此類推 private float verts[] = new float[COUNT * 2]; private float origs[] = new float[COUNT * 2]; //更改前每個點的座標 private float k = 0; //第幾個點 private int index=0; //不說了。。 public BitmapMeshView(Context context, AttributeSet attrs) { super(context, attrs); initView(); } private void initView() { //從資源中載入一張圖片 mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.a); //得到圖片的寬和高 float bmWidth = mBitmap.getWidth(); float bmHeight = mBitmap.getHeight(); //遍曆所有節點,記錄所有點的座標: for (int i = 0; i < HEIGHT + 1; i++) { //得到當前節點的Y軸座標:Y軸座標就是噹噹前行中所佔的比例,好好想想,不難 float fy = bmHeight * i / HEIGHT; for (int j = 0; j < WIDTH + 1; j++) { //得到當前節點的X軸座標:X軸座標就是噹噹前行中所佔的比例, float fx=bmWidth*j/WIDTH; //獲得原始座標,想想就知道了 origs[index*2+0]=verts[index*2+0]=fx; //提一下:這裡fy+50是讓圖片往下平移一段距離,讓圖片在跳舞時不至於跳出螢幕外邊去 origs[index*2+1]=verts[index*2+1]=fy+50; index++; } } } @Override protected void onDraw(Canvas canvas) { //這個雙層迴圈是從上面直接複製過來的,改一下中間的內容就行了 for (int i = 0; i < HEIGHT + 1; i++) { for (int j = 0; j < WIDTH + 1; j++) { //我們想實現的效果的本質是:x軸座標不動,y軸座標按正弦規律變化,所以我們只需要計算Y軸位移量 //下面這個位移量看似很複雜,其實很簡單: /** * 解釋一下offset: 這其實是個標準的正弦運算式: Y=A*sin(w*x+&)+h; * 是不是很熟悉(有兩個符號不好打,直接用其他符號代替的,,,總之這不重要) * 我們來對號入座: * A=20 * &=k; * h=0; * w=1/WIDTH*2*Math.PI * x=j * 然後想一下w為啥是1/WIDTH*2*Math.PI,這個不難吧 */ float offSet=(float)Math.sin((float)j/WIDTH*2*Math.PI+k)*20; //更改Y座標:在原來的基礎上加上一個offSet; verts[(i*(WIDTH+1)+j)*2+1]=origs[(i*(WIDTH+1)+j)*2+1]+offSet; } } //讓相位K遞增 k+=0.2F; //繪圖 canvas.drawBitmapMesh(mBitmap, WIDTH, HEIGHT, verts, 0, null, 0, null); //再次調用onDraw()方法,更新Y座標 invalidate(); }}
花了好長時間注釋,應該是講明白了,不明白的請留言,我會及時回複的。
當然,我們實現的效果知識一個小例子,希望本部落格能夠拋磚引玉,或者能給你些許啟發,相信加上你聰慧的大腦,肯定能編寫出更加絢麗的效果。
技術是死的,人是活的。。
好了,終於要結束了,希望能給各位朋友一些啟發,那我就非常高興了。
最後,Demo地址:http://download.csdn.net/detail/nsgsbs/8540553
Android影像處理技術(實現Android中的PS)(六)