因為一個Android項目的緣故要在軟件打開界面輪流顯示兩張照片,不想讓兩張圖片替換的太生硬,所以讓其中一張圖片漸隱,逐漸顯示第二張圖片。
方法有三種,
第一種:
將漸隱的圖片做好幾張,透明度從255----0.這樣輪流顯示不同透明度的圖片,出現漸隱效果。但是,這種方法浪費資源,舍棄。(在view中繪畫)
第二種:
只用一張圖片,將圖片的每一點的像素信息保存到數組中,每一點像素是ARGB的方式,正好32位,放到一個int類型的值中。然后改變int值的高八位的大小,實現對alpha值的改變。在將改變的數組信息創造一張新的圖片就可以了。
本文重點介紹這一種方法。(在view中繪畫)
第三種:
前兩種都是在view中實現,也可以再布局中實現,用imageswitcher和進出動畫來實現,這個方法在下一篇中介紹。
要實現的效果:
第一張圖片顯示1秒后,逐漸隱藏,第二張圖片出現。
效果很簡單就不貼圖了。總共兩個文件,一個activity一個view。
代碼呈上:
Activity:
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
|
package liu.com.kiexun; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Message; public class SimpleTestActivity extends Activity { /** Called when the activity is first created. */ SimpleFlash simpleFlash; boolean flag= true ; private Handler handler= new Handler() { public void handleMessage(Message msg) { switch (msg.what) { case 1 : if (flag) { try { Thread.sleep( 1000 ); //第一張圖片時間顯示為1秒 } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } flag= false ; } simpleFlash.invalidate(); break ; default : break ; } }; }; @Override public void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); //在這里才產生contex,才可以對view進行初始化 simpleFlash= new SimpleFlash( this ,handler); setContentView(simpleFlash); } } |
view:
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
|
package liu.com.kiexun; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Bitmap.Config; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.os.Handler; import android.os.Message; import android.view.MotionEvent; import android.view.View; public class SimpleFlash extends View { int index= 0 ; int size= 480 * 800 ; Bitmap firstBitmap,secondBitmap; Canvas canvas= null ; int pixels[]= new int [size]; Handler handler ; int changeArrary[]= { ( 1 << 31 )- 1 , ( 1 << 30 )- 1 , ( 1 << 29 )- 1 , ( 1 << 28 )- 1 , ( 1 << 27 )- 1 , ( 1 << 26 )- 1 , ( 1 << 25 )- 1 , ( 1 << 24 )- 1 }; int changeArrary2[]={ /* 11111110 11111100 11111000 11110000 11100000 11000000 10000000 01111111 00111111 00011111 00001111 00000111 00000011 00000001 00000000 1<<32 相當于沒有進行移位 >=32位的時候與移的為數是與32的余數 */ ( ( ( 1 << 31 )- 1 )+( 1 << 31 )-( 1 << 24 ) ), ( ( ( 1 << 31 )- 1 )+( 1 << 31 )-( 1 << 24 )-( 1 << 25 ) ), ( ( ( 1 << 31 )- 1 )+( 1 << 31 )-( 1 << 24 )-( 1 << 25 )-( 1 << 26 ) ), ( ( ( 1 << 31 )- 1 )+( 1 << 31 )- ( 1 << 24 )-( 1 << 25 )-( 1 << 26 )-( 1 << 27 )), ( ( ( 1 << 24 )- 1 )+( 1 << 31 )+( 1 << 30 )+( 1 << 29 )), ( ( ( 1 << 24 )- 1 )+( 1 << 31 )+( 1 << 30 )), ( ( ( 1 << 24 )- 1 )+( 1 << 31 )), ( 1 << 31 )- 1 , ( 1 << 30 )- 1 , ( 1 << 29 )- 1 , ( 1 << 28 )- 1 , ( 1 << 27 )- 1 , ( 1 << 26 )- 1 , ( 1 << 25 )- 1 , ( 1 << 24 )- 1 }; public SimpleFlash(Context context,Handler handler) { super (context); this .handler=handler; // TODO Auto-generated constructor stub firstBitmap=BitmapFactory.decodeResource(getResources(), R.drawable.about); secondBitmap=BitmapFactory.decodeResource(getResources(), R.drawable.help); firstBitmap.getPixels(pixels, 0 , 480 , 0 , 0 , 480 , 800 ); } /* * (non-Javadoc) * @see android.view.View#onDraw(android.graphics.Canvas) * draw函數執行完畢才能顯示出圖片,應該是執行完畢后才能提交繪畫消息 */ public void onDraw(Canvas canvas) { this .canvas=canvas; canvas.drawBitmap(secondBitmap, 0 , 0 , null ); /* * 不會先顯示第二個圖片,5秒后在顯示第一個圖片 */ firstBitmap=Bitmap.createBitmap(pixels, 480 , 800 ,Config.ARGB_8888); canvas.drawBitmap(firstBitmap, 0 , 0 , null ); changePixels(); try { Thread.sleep( 100 ); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public void changePixels() { if (index< 8 ) { for ( int i = 1 ; i < pixels.length; i++) { pixels[i]=pixels[i]&changeArrary[index]; } index++; Message changeMessage= new Message(); changeMessage.what= 1 ; handler.sendMessage(changeMessage); } } } |
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。
原文鏈接:https://blog.csdn.net/hadahuluwa/article/details/7423800