在平時(shí)的開(kāi)發(fā)中,我們會(huì)看到不管是微信發(fā)朋友圈照片還是微博發(fā)布新鮮事,添加圖片的時(shí)候都是選完后面還有個(gè)+號(hào)再去選擇圖片,這樣的話比較方便用戶去添加圖片,有的右上角還有個(gè)-號(hào)方便用戶去刪除圖片,而一般用戶選擇的圖片多少都是不定的,我們只限制最大張數(shù),我們用gridview去實(shí)現(xiàn),代碼可能比較簡(jiǎn)單,高手請(qǐng)略過(guò)。
0.效果圖
1.準(zhǔn)備資源圖片
添加圖片的+號(hào)圖片
刪除圖片的圖片
2.可設(shè)置限制用戶選擇最大張數(shù)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
/** * 可以動(dòng)態(tài)設(shè)置最多上傳幾張,之后就不顯示+號(hào)了,用戶也無(wú)法上傳了 * 默認(rèn)9張 */ private int maxImages = 9 ; /** * 獲取最大上傳張數(shù) * * @return */ public int getMaxImages() { return maxImages; } /** * 設(shè)置最大上傳張數(shù) * * @param maxImages */ public void setMaxImages( int maxImages) { this .maxImages = maxImages; } |
3.設(shè)置GridView的總數(shù)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
/** * 讓GridView中的數(shù)據(jù)數(shù)目加1最后一個(gè)顯示+號(hào) * 當(dāng)?shù)竭_(dá)最大張數(shù)時(shí)不再顯示+號(hào) * @return 返回GridView中的數(shù)量 */ @Override public int getCount() { int count = datas == null ? 1 : datas.size() + 1 ; if (count >= maxImages) { return datas.size(); } else { return count; } } |
4.getView()中根據(jù)position判斷+號(hào)的顯示
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
|
@Override public View getView( final int position, View convertView, ViewGroup parent) { ViewHolder viewHolder = null ; if (convertView == null ) { convertView = inflater.inflate(R.layout.item_published_grida, parent, false ); viewHolder = new ViewHolder(convertView); convertView.setTag(viewHolder); } else { viewHolder = (ViewHolder) convertView.getTag(); } /**代表+號(hào)之前的需要正常顯示圖片**/ if (datas != null && position < datas.size()) { final File file = new File(datas.get(position).get( "path" ).toString()); Glide.with(context) .load(file) .priority(Priority.HIGH) .into(viewHolder.ivimage); viewHolder.btdel.setVisibility(View.VISIBLE); viewHolder.btdel.setOnClickListener( new View.OnClickListener() { @Override public void onClick(View v) { if (file.exists()) { file.delete(); } datas.remove(position); notifyDataSetChanged(); } }); } else { /**代表+號(hào)的需要+號(hào)圖片顯示圖片**/ Glide.with(context) .load(R.mipmap.image_add) .priority(Priority.HIGH) .centerCrop() .into(viewHolder.ivimage); viewHolder.ivimage.setScaleType(ImageView.ScaleType.FIT_XY); viewHolder.btdel.setVisibility(View.GONE); } return convertView; } |
5.GridView的完整代碼
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
|
package cn.bluemobi.dylan.gridviewaddimage; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.Button; import android.widget.ImageView; import com.bumptech.glide.Glide; import com.bumptech.glide.Priority; import java.io.File; import java.util.ArrayList; import java.util.List; import java.util.Map; /** * com.bm.falvzixun.adapter.GridViewAddImgAdpter * * @author yuandl on 2015/12/24. * 添加上傳圖片適配器 */ public class GridViewAddImgesAdpter extends BaseAdapter { private List<Map<String, Object>> datas; private Context context; private LayoutInflater inflater; /** * 可以動(dòng)態(tài)設(shè)置最多上傳幾張,之后就不顯示+號(hào)了,用戶也無(wú)法上傳了 * 默認(rèn)9張 */ private int maxImages = 9 ; public GridViewAddImgesAdpter(List<Map<String, Object>> datas, Context context) { this .datas = datas; this .context = context; inflater = LayoutInflater.from(context); } /** * 獲取最大上傳張數(shù) * * @return */ public int getMaxImages() { return maxImages; } /** * 設(shè)置最大上傳張數(shù) * * @param maxImages */ public void setMaxImages( int maxImages) { this .maxImages = maxImages; } /** * 讓GridView中的數(shù)據(jù)數(shù)目加1最后一個(gè)顯示+號(hào) * 當(dāng)?shù)竭_(dá)最大張數(shù)時(shí)不再顯示+號(hào) * @return 返回GridView中的數(shù)量 */ @Override public int getCount() { int count = datas == null ? 1 : datas.size() + 1 ; if (count >= maxImages) { return datas.size(); } else { return count; } } @Override public Object getItem( int position) { return null ; } @Override public long getItemId( int position) { return 0 ; } public void notifyDataSetChanged(List<Map<String, Object>> datas) { this .datas = datas; this .notifyDataSetChanged(); } @Override public View getView( final int position, View convertView, ViewGroup parent) { ViewHolder viewHolder = null ; if (convertView == null ) { convertView = inflater.inflate(R.layout.item_published_grida, parent, false ); viewHolder = new ViewHolder(convertView); convertView.setTag(viewHolder); } else { viewHolder = (ViewHolder) convertView.getTag(); } /**代表+號(hào)之前的需要正常顯示圖片**/ if (datas != null && position < datas.size()) { final File file = new File(datas.get(position).get( "path" ).toString()); Glide.with(context) .load(file) .priority(Priority.HIGH) .into(viewHolder.ivimage); viewHolder.btdel.setVisibility(View.VISIBLE); viewHolder.btdel.setOnClickListener( new View.OnClickListener() { @Override public void onClick(View v) { if (file.exists()) { file.delete(); } datas.remove(position); notifyDataSetChanged(); } }); } else { /**代表+號(hào)的需要+號(hào)圖片顯示圖片**/ Glide.with(context) .load(R.mipmap.image_add) .priority(Priority.HIGH) .centerCrop() .into(viewHolder.ivimage); viewHolder.ivimage.setScaleType(ImageView.ScaleType.FIT_XY); viewHolder.btdel.setVisibility(View.GONE); } return convertView; } public class ViewHolder { public final ImageView ivimage; public final Button btdel; public final View root; public ViewHolder(View root) { ivimage = (ImageView) root.findViewById(R.id.iv_image); btdel = (Button) root.findViewById(R.id.bt_del); this .root = root; } } } |
6.用法
主布局文件activity_main.xml
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
|
<? xml version = "1.0" encoding = "utf-8" ?> < LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android" xmlns:tools = "http://schemas.android.com/tools" android:id = "@+id/activity_main" android:layout_width = "match_parent" android:layout_height = "match_parent" android:background = "#FFFFFF" android:orientation = "vertical" android:paddingBottom = "@dimen/activity_vertical_margin" android:paddingLeft = "@dimen/activity_horizontal_margin" android:paddingRight = "@dimen/activity_horizontal_margin" android:paddingTop = "@dimen/activity_vertical_margin" tools:context = "cn.bluemobi.dylan.gridviewaddimage.MainActivity" > < EditText android:layout_width = "match_parent" android:layout_height = "wrap_content" android:text = "說(shuō)點(diǎn)什么" android:textColor = "#000000" /> < GridView android:layout_marginTop = "10dp" android:id = "@+id/gw" android:numColumns = "5" android:horizontalSpacing = "6dp" android:columnWidth = "60dp" android:layout_width = "match_parent" android:layout_height = "match_parent" /> </ LinearLayout > |
gridview的item布局文件item_published_grida.xml
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
|
<? xml version = "1.0" encoding = "utf-8" ?> < RelativeLayout xmlns:android = "http://schemas.android.com/apk/res/android" android:layout_width = "66dp" android:layout_height = "66dp" > < RelativeLayout android:layout_width = "match_parent" android:layout_height = "match_parent" > < ImageView android:id = "@+id/iv_image" android:layout_width = "match_parent" android:gravity = "center" android:layout_height = "match_parent" android:scaleType = "centerCrop" /> < Button android:id = "@+id/bt_del" android:layout_width = "20dp" android:layout_height = "20dp" android:layout_alignParentRight = "true" android:background = "@drawable/bt_dynamic_del" /> </ RelativeLayout > </ RelativeLayout > |
彈出拍照和從相冊(cè)選擇的對(duì)話框布局文件dialog_add_picture.xml
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
|
<? xml version = "1.0" encoding = "utf-8" ?> < LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android" android:layout_width = "fill_parent" android:layout_height = "wrap_content" android:layout_marginLeft = "5.0dip" android:layout_marginRight = "5.0dip" android:background = "@android:color/transparent" android:orientation = "vertical" > < LinearLayout android:layout_width = "fill_parent" android:layout_height = "wrap_content" android:layout_margin = "30px" android:orientation = "vertical" > < TextView android:id = "@+id/tv_camera" android:layout_width = "wrap_content" android:layout_height = "144px" android:background = "@mipmap/btn_top_arc" android:gravity = "center" android:text = "拍照" android:textColor = "#666666" android:textSize = "48px" /> < ImageView android:layout_width = "1022px" android:layout_height = "4px" android:background = "#666666" /> < TextView android:id = "@+id/tv_gallery" android:layout_width = "wrap_content" android:layout_height = "144px" android:gravity = "center" android:background = "@mipmap/btn_bottom_arc" android:text = "從手機(jī)相冊(cè)選擇" android:textColor = "#666666" android:textSize = "48px" /> </ LinearLayout > < TextView android:id = "@+id/tv_cancel" android:layout_width = "wrap_content" android:layout_height = "144px" android:layout_marginTop = "20px" android:layout_marginLeft = "30px" android:layout_marginRight = "30px" android:layout_gravity = "center_horizontal" android:background = "@mipmap/btn_top_arc" android:gravity = "center" android:text = "取消" android:textColor = "#666666" android:textSize = "48px" /> </ LinearLayout > |
MainActivity
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
|
package cn.bluemobi.dylan.gridviewaddimage; import android.app.Dialog; import android.content.Intent; import android.database.Cursor; import android.net.Uri; import android.os.Bundle; import android.os.Environment; import android.os.Handler; import android.os.Message; import android.provider.MediaStore; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.Display; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.view.WindowManager; import android.widget.AdapterView; import android.widget.GridView; import android.widget.TextView; import android.widget.Toast; import net.bither.util.NativeUtil; import java.io.File; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class MainActivity extends AppCompatActivity { private GridView gw; private List<Map<String, Object>> datas; private GridViewAddImgesAdpter gridViewAddImgesAdpter; private Dialog dialog; private final int PHOTO_REQUEST_CAREMA = 1 ; // 拍照 private final int PHOTO_REQUEST_GALLERY = 2 ; // 從相冊(cè)中選擇private static final String PHOTO_FILE_NAME = "temp_photo.jpg"; private File tempFile; private final String IMAGE_DIR = Environment.getExternalStorageDirectory() + "/gridview/" ; /* 頭像名稱 */ private final String PHOTO_FILE_NAME = "temp_photo.jpg" ; @Override protected void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.activity_main); gw = (GridView) findViewById(R.id.gw); datas = new ArrayList<>(); gridViewAddImgesAdpter = new GridViewAddImgesAdpter(datas, this ); gw.setAdapter(gridViewAddImgesAdpter); gw.setOnItemClickListener( new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) { showdialog(); } }); } /** * 選擇圖片對(duì)話框 */ public void showdialog() { View localView = LayoutInflater.from( this ).inflate( R.layout.dialog_add_picture, null ); TextView tv_camera = (TextView) localView.findViewById(R.id.tv_camera); TextView tv_gallery = (TextView) localView.findViewById(R.id.tv_gallery); TextView tv_cancel = (TextView) localView.findViewById(R.id.tv_cancel); dialog = new Dialog( this , R.style.custom_dialog); dialog.setContentView(localView); dialog.getWindow().setGravity(Gravity.BOTTOM); // 設(shè)置全屏 WindowManager windowManager = getWindowManager(); Display display = windowManager.getDefaultDisplay(); WindowManager.LayoutParams lp = dialog.getWindow().getAttributes(); lp.width = display.getWidth(); // 設(shè)置寬度 dialog.getWindow().setAttributes(lp); dialog.show(); tv_cancel.setOnClickListener( new View.OnClickListener() { @Override public void onClick(View arg0) { dialog.dismiss(); } }); tv_camera.setOnClickListener( new View.OnClickListener() { @Override public void onClick(View v) { dialog.dismiss(); // 拍照 camera(); } }); tv_gallery.setOnClickListener( new View.OnClickListener() { @Override public void onClick(View v) { dialog.dismiss(); // 從系統(tǒng)相冊(cè)選取照片 gallery(); } }); } /** * 拍照 */ public void camera() { // 判斷存儲(chǔ)卡是否可以用,可用進(jìn)行存儲(chǔ) if (hasSdcard()) { File dir = new File(IMAGE_DIR); if (!dir.exists()) { dir.mkdir(); } tempFile = new File(dir, System.currentTimeMillis() + "_" + PHOTO_FILE_NAME); //從文件中創(chuàng)建uri Uri uri = Uri.fromFile(tempFile); Intent intent = new Intent(); intent.putExtra(MediaStore.EXTRA_OUTPUT, uri); intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE); intent.addCategory(intent.CATEGORY_DEFAULT); // 開(kāi)啟一個(gè)帶有返回值的Activity,請(qǐng)求碼為PHOTO_REQUEST_CAREMA startActivityForResult(intent, PHOTO_REQUEST_CAREMA); } else { Toast.makeText( this , "未找到存儲(chǔ)卡,無(wú)法拍照!" , Toast.LENGTH_SHORT).show(); } } /** * 判斷sdcard是否被掛載 */ public boolean hasSdcard() { return Environment.getExternalStorageState().equals( Environment.MEDIA_MOUNTED); } /** * 從相冊(cè)獲取2 */ public void gallery() { Intent intent = new Intent( Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); startActivityForResult(intent, PHOTO_REQUEST_GALLERY); } @Override protected void onActivityResult( int requestCode, int resultCode, Intent data) { super .onActivityResult(requestCode, resultCode, data); if (resultCode == RESULT_OK) { if (requestCode == PHOTO_REQUEST_GALLERY) { // 從相冊(cè)返回的數(shù)據(jù) if (data != null ) { // 得到圖片的全路徑 Uri uri = data.getData(); String[] proj = {MediaStore.Images.Media.DATA}; //好像是android多媒體數(shù)據(jù)庫(kù)的封裝接口,具體的看Android文檔 Cursor cursor = managedQuery(uri, proj, null , null , null ); //按我個(gè)人理解 這個(gè)是獲得用戶選擇的圖片的索引值 int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); //將光標(biāo)移至開(kāi)頭 ,這個(gè)很重要,不小心很容易引起越界 cursor.moveToFirst(); //最后根據(jù)索引值獲取圖片路徑 String path = cursor.getString(column_index); uploadImage(path); } } else if (requestCode == PHOTO_REQUEST_CAREMA) { if (resultCode != RESULT_CANCELED) { // 從相機(jī)返回的數(shù)據(jù) if (hasSdcard()) { if (tempFile != null ) { uploadImage(tempFile.getPath()); } else { Toast.makeText( this , "相機(jī)異常請(qǐng)稍后再試!" , Toast.LENGTH_SHORT).show(); } Log.i( "images" , "拿到照片path=" + tempFile.getPath()); } else { Toast.makeText( this , "未找到存儲(chǔ)卡,無(wú)法存儲(chǔ)照片!" , Toast.LENGTH_SHORT).show(); } } } } } Handler handler = new Handler() { @Override public void handleMessage(Message msg) { super .handleMessage(msg); if (msg.what == 0xAAAAAAAA ) { photoPath(msg.obj.toString()); } } }; /** * 上傳圖片 * * @param path */ private void uploadImage( final String path) { new Thread() { @Override public void run() { if ( new File(path).exists()) { Log.d( "images" , "源文件存在" + path); } else { Log.d( "images" , "源文件不存在" + path); } File dir = new File(IMAGE_DIR); if (!dir.exists()) { dir.mkdir(); } final File file = new File(dir + "/temp_photo" + System.currentTimeMillis() + ".jpg" ); NativeUtil.compressBitmap(path, file.getAbsolutePath(), 50 ); if (file.exists()) { Log.d( "images" , "壓縮后的文件存在" + file.getAbsolutePath()); } else { Log.d( "images" , "壓縮后的不存在" + file.getAbsolutePath()); } Message message = new Message(); message.what = 0xAAAAAAAA ; message.obj = file.getAbsolutePath(); handler.sendMessage(message); } }.start(); } public void photoPath(String path) { Map<String,Object> map= new HashMap<>(); map.put( "path" ,path); datas.add(map); gridViewAddImgesAdpter.notifyDataSetChanged(); } } |
7.GitHub源碼 :GridViewAddImage
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。
原文鏈接:https://blog.csdn.net/linglongxin24/article/details/53034123