今天要實現的功能是實現專輯倒影效果,這個功能已經屬于圖像處理方面的了,對圖像處理我不怎么在行,等一下會介紹一個很實用的工具類,專門用來進行圖像處理的。這個工具類不是我寫的,我只是拿來用到自己的項目當中,這已經足夠了,我已經完美實現我想要的效果。
效果圖:
<
一個很有用的工具類
/simplebeautymusicplayer/src/com/wwj/sb/utils/imageutil.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
|
package com.wwj.sb.utils; import java.io.bytearrayoutputstream; import java.io.file; import java.io.filenotfoundexception; import java.io.fileoutputstream; import java.io.ioexception; import android.content.context; import android.graphics.bitmap; import android.graphics.bitmap.compressformat; import android.graphics.bitmap.config; import android.graphics.bitmapfactory; import android.graphics.canvas; import android.graphics.colormatrix; import android.graphics.colormatrixcolorfilter; import android.graphics.lineargradient; import android.graphics.matrix; import android.graphics.paint; import android.graphics.porterduff; import android.graphics.porterduff.mode; import android.graphics.porterduffxfermode; import android.graphics.rect; import android.graphics.rectf; import android.graphics.shader; import android.graphics.drawable.bitmapdrawable; import android.graphics.drawable.drawable; /** * 圖片工具類 * @author wwj * 2013/7/3 */ public class imageutil { /**圖片的八個位置**/ public static final int top = 0 ; //上 public static final int bottom = 1 ; //下 public static final int left = 2 ; //左 public static final int right = 3 ; //右 public static final int left_top = 4 ; //左上 public static final int left_bottom = 5 ; //左下 public static final int right_top = 6 ; //右上 public static final int right_bottom = 7 ; //右下 /** * 圖像的放大縮小方法 * @param src 源位圖對象 * @param scalex 寬度比例系數 * @param scaley 高度比例系數 * @return 返回位圖對象 */ public static bitmap zoombitmap(bitmap src, float scalex, float scaley) { matrix matrix = new matrix(); matrix.setscale(scalex, scaley); bitmap t_bitmap = bitmap.createbitmap(src, 0 , 0 , src.getwidth(), src.getheight(), matrix, true ); return t_bitmap; } /** * 圖像放大縮小--根據寬度和高度 * @param src * @param width * @param height * @return */ public static bitmap zoombimtap(bitmap src, int width, int height) { return bitmap.createscaledbitmap(src, width, height, true ); } /** * 將drawable轉為bitmap對象 * @param drawable * @return */ public static bitmap drawabletobitmap(drawable drawable) { return ((bitmapdrawable)drawable).getbitmap(); } /** * 將bitmap轉換為drawable對象 * @param bitmap * @return */ public static drawable bitmaptodrawable(bitmap bitmap) { drawable drawable = new bitmapdrawable(bitmap); return drawable; } /** * bitmap轉byte[] * @param bitmap * @return */ public static byte [] bitmaptobyte(bitmap bitmap) { bytearrayoutputstream out = new bytearrayoutputstream(); bitmap.compress(bitmap.compressformat.png, 100 , out); return out.tobytearray(); } /** * byte[]轉bitmap * @param data * @return */ public static bitmap bytetobitmap( byte [] data) { if (data.length != 0 ) { return bitmapfactory.decodebytearray(data, 0 , data.length); } return null ; } /** * 繪制帶圓角的圖像 * @param src * @param radius * @return */ public static bitmap createroundedcornerbitmap(bitmap src, int radius) { final int w = src.getwidth(); final int h = src.getheight(); // 高清量32位圖 bitmap bitmap = bitmap.createbitmap(w, h, config.argb_8888); paint paint = new paint(); canvas canvas = new canvas(bitmap); canvas.drawargb( 0 , 0 , 0 , 0 ); paint.setcolor( 0xff424242 ); // 防止邊緣的鋸齒 paint.setfilterbitmap( true ); rect rect = new rect( 0 , 0 , w, h); rectf rectf = new rectf(rect); // 繪制帶圓角的矩形 canvas.drawroundrect(rectf, radius, radius, paint); // 取兩層繪制交集,顯示上層 paint.setxfermode( new porterduffxfermode(porterduff.mode.src_in)); // 繪制圖像 canvas.drawbitmap(src, rect, rect, paint); return bitmap; } /** * 創建選中帶提示圖片 * @param context * @param srcid * @param tipid * @return */ public static drawable createselectedtip(context context, int srcid, int tipid) { bitmap src = bitmapfactory.decoderesource(context.getresources(), srcid); bitmap tip = bitmapfactory.decoderesource(context.getresources(), tipid); final int w = src.getwidth(); final int h = src.getheight(); bitmap bitmap = bitmap.createbitmap(w, h, config.argb_8888); paint paint = new paint(); canvas canvas = new canvas(bitmap); //繪制原圖 canvas.drawbitmap(src, 0 , 0 , paint); //繪制提示圖片 canvas.drawbitmap(tip, (w - tip.getwidth()), 0 , paint); return bitmaptodrawable(bitmap); } /** * 帶倒影的圖像 * @param src * @return */ public static bitmap createreflectionbitmap(bitmap src) { // 兩個圖像間的空隙 final int spacing = 4 ; final int w = src.getwidth(); final int h = src.getheight(); // 繪制高質量32位圖 bitmap bitmap = bitmap.createbitmap(w, h + h / 2 + spacing, config.argb_8888); // 創建燕x軸的倒影圖像 matrix m = new matrix(); m.setscale( 1 , - 1 ); bitmap t_bitmap = bitmap.createbitmap(src, 0 , h / 2 , w, h / 2 , m, true ); canvas canvas = new canvas(bitmap); paint paint = new paint(); // 繪制原圖像 canvas.drawbitmap(src, 0 , 0 , paint); // 繪制倒影圖像 canvas.drawbitmap(t_bitmap, 0 , h + spacing, paint); // 線性渲染-沿y軸高到低渲染 shader shader = new lineargradient( 0 , h + spacing, 0 , h + spacing + h / 2 , 0x70ffffff , 0x00ffffff , shader.tilemode.mirror); paint.setshader(shader); // 取兩層繪制交集,顯示下層。 paint.setxfermode( new porterduffxfermode(mode.dst_in)); // 繪制渲染倒影的矩形 canvas.drawrect( 0 , h + spacing, w, h + h / 2 + spacing, paint); return bitmap; } /** * 獨立的倒影圖像 * @param src * @return */ public static bitmap createreflectionbitmapforsingle(bitmap src) { final int w = src.getwidth(); final int h = src.getheight(); // 繪制高質量32位圖 bitmap bitmap = bitmap.createbitmap(w, h / 2 , config.argb_8888); // 創建沿x軸的倒影圖像 matrix m = new matrix(); m.setscale( 1 , - 1 ); bitmap t_bitmap = bitmap.createbitmap(src, 0 , h / 2 , w, h / 2 , m, true ); canvas canvas = new canvas(bitmap); paint paint = new paint(); // 繪制倒影圖像 canvas.drawbitmap(t_bitmap, 0 , 0 , paint); // 線性渲染-沿y軸高到低渲染 shader shader = new lineargradient( 0 , 0 , 0 , h / 2 , 0x70ffffff , 0x00ffffff , shader.tilemode.mirror); paint.setshader(shader); // 取兩層繪制交集。顯示下層。 paint.setxfermode( new porterduffxfermode(mode.dst_in)); // 繪制渲染倒影的矩形 canvas.drawrect( 0 , 0 , w, h / 2 , paint); return bitmap; } public static bitmap creategreybitmap(bitmap src) { final int w = src.getwidth(); final int h = src.getheight(); bitmap bitmap = bitmap.createbitmap(w, h, config.argb_8888); canvas canvas = new canvas(bitmap); paint paint = new paint(); // 顏色變換的矩陣 colormatrix matrix = new colormatrix(); // saturation 飽和度值,最小可設為0,此時對應的是灰度圖;為1表示飽和度不變,設置大于1,就顯示過飽和 matrix.setsaturation( 0 ); colormatrixcolorfilter filter = new colormatrixcolorfilter(matrix); paint.setcolorfilter(filter); canvas.drawbitmap(src, 0 , 0 , paint); return bitmap; } /** * 保存圖片 * @param src * @param filepath * @param format:[bitmap.compressformat.png,bitmap.compressformat.jpeg] * @return */ public static boolean saveimage(bitmap src, string filepath, compressformat format) { boolean rs = false ; file file = new file(filepath); try { fileoutputstream out = new fileoutputstream(file); if (src.compress(format, 100 , out)) { out.flush(); //寫入流 } out.close(); } catch (filenotfoundexception e) { e.printstacktrace(); } catch (ioexception e) { e.printstacktrace(); } return rs; } /** * 添加水印效果 * @param src 源位圖 * @param watermark 水印 * @param direction 方向 * @param spacing 間距 * @return */ public static bitmap createwatermark(bitmap src, bitmap watermark, int direction, int spacing) { final int w = src.getwidth(); final int h = src.getheight(); bitmap bitmap = bitmap.createbitmap(w, h, config.argb_8888); canvas canvas = new canvas(bitmap); canvas.drawbitmap(src, 0 , 0 , null ); if (direction == left_top) { canvas.drawbitmap(watermark, spacing, spacing, null ); } else if (direction == left_bottom){ canvas.drawbitmap(watermark, spacing, h - watermark.getheight() - spacing, null ); } else if (direction == right_top) { canvas.drawbitmap(watermark, w - watermark.getwidth() - spacing, spacing, null ); } else if (direction == right_bottom) { canvas.drawbitmap(watermark, w - watermark.getwidth() - spacing, h - watermark.getheight() - spacing, null ); } return bitmap; } /** * 合成圖像 * @param direction * @param bitmaps * @return */ public static bitmap composebitmap( int direction, bitmap... bitmaps) { if (bitmaps.length < 2 ) { return null ; } bitmap firstbitmap = bitmaps[ 0 ]; for ( int i = 0 ; i < bitmaps.length; i++) { firstbitmap = composebitmap(firstbitmap, bitmaps[i], direction); } return firstbitmap; } /** * 合成兩張圖像 * @param firstbitmap * @param secondbitmap * @param direction * @return */ private static bitmap composebitmap(bitmap firstbitmap, bitmap secondbitmap, int direction) { if (firstbitmap == null ) { return null ; } if (secondbitmap == null ) { return firstbitmap; } final int fw = firstbitmap.getwidth(); final int fh = firstbitmap.getheight(); final int sw = secondbitmap.getwidth(); final int sh = secondbitmap.getheight(); bitmap bitmap = null ; canvas canvas = null ; if (direction == top) { bitmap = bitmap.createbitmap(sw > fw ? sw : fw, fh + sh, config.argb_8888); canvas = new canvas(bitmap); canvas.drawbitmap(secondbitmap, 0 , 0 , null ); canvas.drawbitmap(firstbitmap, 0 , sh, null ); } else if (direction == bottom) { bitmap = bitmap.createbitmap(fw > sw ? fw : sw, fh + sh, config.argb_8888); canvas = new canvas(bitmap); canvas.drawbitmap(firstbitmap, 0 , 0 , null ); canvas.drawbitmap(secondbitmap, 0 , fh, null ); } else if (direction == left) { bitmap = bitmap.createbitmap(fw + sw, sh > fh ? sh : fh, config.argb_8888); canvas = new canvas(bitmap); canvas.drawbitmap(secondbitmap, 0 , 0 , null ); canvas.drawbitmap(firstbitmap, sw, 0 , null ); } else if (direction == right) { bitmap = bitmap.createbitmap(fw + sw, fh > sh ? fh : sh, config.argb_8888); canvas = new canvas(bitmap); canvas.drawbitmap(firstbitmap, 0 , 0 , null ); canvas.drawbitmap(secondbitmap, fw, 0 , null ); } return bitmap; } } |
在簡、大氣音樂播放器程序中的體現
我就定義了一個方法,就把專輯倒影的效果完美實現出來了。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
/** * 顯示專輯封面 */ private void showartwork(mp3info mp3info) { bitmap bm = mediautil.getartwork( this , mp3info.getid(), mp3info.getalbumid(), true , false ); //切換播放時候專輯圖片出現透明效果 animation albumanim = animationutils.loadanimation(playeractivity. this , r.anim.album_replace); //開始播放動畫效果 musicalbum.startanimation(albumanim); if (bm != null ) { musicalbum.setimagebitmap(bm); //顯示專輯封面圖片 musicablumreflection.setimagebitmap(imageutil.createreflectionbitmapforsingle(bm)); //顯示倒影 } else { bm = mediautil.getdefaultartwork( this , false ); musicalbum.setimagebitmap(bm); //顯示專輯封面圖片 musicablumreflection.setimagebitmap(imageutil.createreflectionbitmapforsingle(bm)); //顯示倒影 } } |
以上內容是android應用開發之簡單、大氣音樂播放器實現專輯倒影效果的全部教程,希望大家喜歡。