日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

Android 使用GridView+仿微信图片上传功能(附源代码)

發布時間:2025/7/14 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android 使用GridView+仿微信图片上传功能(附源代码) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

由于工作要求最近在使用GridView完成圖片的批量上傳功能,我的例子當中包含仿微信圖片上傳、拍照、本地選擇、相片裁剪等功能,如果有需要的朋友可以看一下,希望我的實際經驗能對您有所幫助。

直接上圖,下面的圖片就是點擊“加號”后彈出的對話框,通過對話框可以根據自己需求進行相片選擇。

?

項目結構:

下面直接上代碼。

整體的布局文件activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@drawable/index"android:orientation="vertical" ><LinearLayoutandroid:layout_width="match_parent"android:layout_height="44dp"android:background="#24cf5f"android:orientation="horizontal" ><ImageViewandroid:id="@+id/back"android:layout_width="match_parent"android:layout_height="20dp"android:layout_gravity="center"android:layout_weight="5"android:src="@drawable/back" /><TextViewandroid:layout_width="fill_parent"android:layout_height="44dp"android:layout_weight="1"android:gravity="center"android:paddingRight="40dp"android:text="圖片上傳"android:textColor="#FFFFFF"android:textSize="30px" /></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="1dp"android:background="#000000" /><ScrollViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:layout_weight="1" ><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical" ><LinearLayoutandroid:layout_width="match_parent"android:layout_height="1dp"android:background="#000000" /><LinearLayoutandroid:layout_width="match_parent"android:layout_height="60dp"android:layout_weight="1"android:orientation="vertical" ><TextViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:layout_weight="1"android:gravity="center"android:text="請選擇上傳的圖片" /><TextViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:layout_weight="1"android:gravity="center"android:text="(友情提示:圖片最多可添加9張,點擊可刪除選擇的圖片)"android:textSize="18px" /></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="1dp"android:background="#000000" /><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:layout_weight="1" ><com.yihang.MyGridView.MyGridViewandroid:id="@+id/gridView"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_margin="5dp"android:layout_weight="111"android:columnWidth="90dp"android:gravity="center"android:horizontalSpacing="5dp"android:numColumns="4"android:stretchMode="columnWidth"android:verticalSpacing="5dp" /></LinearLayout></LinearLayout></ScrollView><Buttonandroid:id="@+id/bt_submit"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_gravity="bottom"android:layout_weight="5.2"android:background="#24cf5f"android:text="上傳"android:textColor="#FFFFFF"android:textSize="16sp" /></LinearLayout>

MainActivity

package com.yihang.activity;import java.io.ByteArrayOutputStream; import java.io.File; import java.util.ArrayList; import java.util.HashMap; import android.app.Activity; import android.app.AlertDialog; import android.app.AlertDialog.Builder; import android.content.DialogInterface; import android.content.Intent; import android.content.pm.ActivityInfo; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.net.Uri; import android.os.Bundle; import android.os.Environment; import android.provider.MediaStore; import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; import android.view.Window; import android.view.WindowManager; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.GridView; import android.widget.ImageView; import android.widget.SimpleAdapter; import android.widget.SimpleAdapter.ViewBinder; import android.widget.Toast;import com.yihang.dialog.MyDialog; import com.yihang.dialog.MyDialog.OnButtonClickListener; import com.yihang.photodemo.R;public class MainActivity extends Activity implements OnButtonClickListener, OnItemClickListener{private MyDialog dialog;// 圖片選擇對話框public static final int NONE = 0;public static final int PHOTOHRAPH = 1;// 拍照public static final int PHOTOZOOM = 2; // 縮放public static final int PHOTORESOULT = 3;// 結果public static final String IMAGE_UNSPECIFIED = "image/*";private GridView gridView; // 網格顯示縮略圖private final int IMAGE_OPEN = 4; // 打開圖片標記private String pathImage; // 選擇圖片路徑private Bitmap bmp; // 導入臨時圖片private ArrayList<HashMap<String, Object>> imageItem;private SimpleAdapter simpleAdapter; // 適配器 @Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);requestWindowFeature(Window.FEATURE_NO_TITLE);/** 防止鍵盤擋住輸入框 不希望遮擋設置activity屬性 android:windowSoftInputMode="adjustPan"* 希望動態調整高度 android:windowSoftInputMode="adjustResize"*/getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);// 鎖定屏幕 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);setContentView(R.layout.activity_main);init();initData();}private void init() {gridView = (GridView) findViewById(R.id.gridView);gridView.setOnItemClickListener(this);dialog = new MyDialog(this);dialog.setOnButtonClickListener(this);// activity中調用其他activity中組件的方法LayoutInflater layout = this.getLayoutInflater();View view = layout.inflate(R.layout.layout_select_photo, null);}private void initData() {/** 載入默認圖片添加圖片加號*/bmp = BitmapFactory.decodeResource(getResources(),R.drawable.gridview_addpic); // 加號imageItem = new ArrayList<HashMap<String, Object>>();HashMap<String, Object> map = new HashMap<String, Object>();map.put("itemImage", bmp);imageItem.add(map);simpleAdapter = new SimpleAdapter(this, imageItem,R.layout.griditem_addpic, new String[] { "itemImage" },new int[] { R.id.imageView1 });simpleAdapter.setViewBinder(new ViewBinder() {@Overridepublic boolean setViewValue(View view, Object data,String textRepresentation) {// TODO Auto-generated method stubif (view instanceof ImageView && data instanceof Bitmap) {ImageView i = (ImageView) view;i.setImageBitmap((Bitmap) data);return true;}return false;}});gridView.setAdapter(simpleAdapter);}@Overridepublic void camera() {// TODO Auto-generated method stubIntent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(Environment.getExternalStorageDirectory(), "temp.jpg")));startActivityForResult(intent, PHOTOHRAPH);}@Overridepublic void gallery() {// TODO Auto-generated method stubIntent intent = new Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);startActivityForResult(intent, IMAGE_OPEN);}@Overridepublic void cancel() {// TODO Auto-generated method stub dialog.cancel();}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {// TODO Auto-generated method stub super.onActivityResult(requestCode, resultCode, data);if (resultCode == NONE)return;// 拍照if (requestCode == PHOTOHRAPH) {// 設置文件保存路徑這里放在跟目錄下File picture = new File(Environment.getExternalStorageDirectory()+ "/temp.jpg");startPhotoZoom(Uri.fromFile(picture));}if (data == null)return;// 處理結果if (requestCode == PHOTORESOULT) {Bundle extras = data.getExtras();if (extras != null) {Bitmap photo = extras.getParcelable("data");ByteArrayOutputStream stream = new ByteArrayOutputStream();photo.compress(Bitmap.CompressFormat.JPEG, 75, stream);// (0-100)壓縮文件// 將圖片放入gridview中HashMap<String, Object> map = new HashMap<String, Object>();map.put("itemImage", photo);imageItem.add(map);simpleAdapter = new SimpleAdapter(this, imageItem,R.layout.griditem_addpic, new String[] { "itemImage" },new int[] { R.id.imageView1 });simpleAdapter.setViewBinder(new ViewBinder() {@Overridepublic boolean setViewValue(View view, Object data,String textRepresentation) {// TODO Auto-generated method stubif (view instanceof ImageView && data instanceof Bitmap) {ImageView i = (ImageView) view;i.setImageBitmap((Bitmap) data);return true;}return false;}});gridView.setAdapter(simpleAdapter);simpleAdapter.notifyDataSetChanged();dialog.dismiss();}}// 打開圖片if (resultCode == RESULT_OK && requestCode == IMAGE_OPEN) {startPhotoZoom(data.getData());}super.onActivityResult(requestCode, resultCode, data);}@Overrideprotected void onResume() {// TODO Auto-generated method stub super.onResume();if (!TextUtils.isEmpty(pathImage)) {Bitmap addbmp = BitmapFactory.decodeFile(pathImage);HashMap<String, Object> map = new HashMap<String, Object>();map.put("itemImage", addbmp);imageItem.add(map);simpleAdapter = new SimpleAdapter(this, imageItem,R.layout.griditem_addpic, new String[] { "itemImage" },new int[] { R.id.imageView1 });simpleAdapter.setViewBinder(new ViewBinder() {@Overridepublic boolean setViewValue(View view, Object data,String textRepresentation) {// TODO Auto-generated method stubif (view instanceof ImageView && data instanceof Bitmap) {ImageView i = (ImageView) view;i.setImageBitmap((Bitmap) data);return true;}return false;}});gridView.setAdapter(simpleAdapter);simpleAdapter.notifyDataSetChanged();// 刷新后釋放防止手機休眠后自動添加pathImage = null;dialog.dismiss();}}@Overridepublic void onItemClick(AdapterView<?> parent, View v, int position, long id) {// TODO Auto-generated method stubif (imageItem.size() == 10) { // 第一張為默認圖片Toast.makeText(MainActivity.this, "圖片數9張已滿",Toast.LENGTH_SHORT).show();} else if (position == 0) { // 點擊圖片位置為+ 0對應0張圖片// 選擇圖片 dialog.show();// 通過onResume()刷新數據} else {dialog(position);}}/** Dialog對話框提示用戶刪除操作 position為刪除圖片位置*/protected void dialog(final int position) {AlertDialog.Builder builder = new Builder(MainActivity.this);builder.setMessage("確認移除已添加圖片嗎?");builder.setTitle("提示");builder.setPositiveButton("確認", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {dialog.dismiss();imageItem.remove(position);simpleAdapter.notifyDataSetChanged();}});builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {dialog.dismiss();}});builder.create().show();}public void startPhotoZoom(Uri uri) {Intent intent = new Intent("com.android.camera.action.CROP");intent.setDataAndType(uri, IMAGE_UNSPECIFIED);intent.putExtra("crop", "true");// aspectX aspectY 是寬高的比例intent.putExtra("aspectX", 1);intent.putExtra("aspectY", 1);// outputX outputY 是裁剪圖片寬高intent.putExtra("outputX", 64);intent.putExtra("outputY", 64);intent.putExtra("return-data", true);startActivityForResult(intent, PHOTORESOULT);}}

彈出的對話框(仿照微信來完成):MyDialog

package com.yihang.dialog;import com.yihang.photodemo.R;import android.app.Dialog; import android.content.Context; import android.view.Gravity; import android.view.View; import android.view.ViewGroup; import android.view.Window; import android.view.View.OnClickListener; /*** 對話框實現類* @author admin**/ public class MyDialog extends Dialog implements OnClickListener {public MyDialog(Context context) {super(context,R.style.myDialog);//初始化布局 setContentView(R.layout.layout_select_photo);Window dialogWindow = getWindow();dialogWindow.setLayout(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);dialogWindow.setGravity(Gravity.BOTTOM);setCanceledOnTouchOutside(true);findViewById(R.id.btn_camera).setOnClickListener(this);findViewById(R.id.btn_gallery).setOnClickListener(this);findViewById(R.id.btn_cancel).setOnClickListener(this);}@Overridepublic void onClick(View v) {// TODO Auto-generated method stubswitch (v.getId()) {case R.id.btn_camera:onButtonClickListener.camera();break;case R.id.btn_gallery:onButtonClickListener.gallery();break;case R.id.btn_cancel:onButtonClickListener.cancel();break;default:break;}}/*** 按鈕的監聽器* @author Orathee* @date 2014年3月20日 下午4:28:39*/public interface OnButtonClickListener{void camera();void gallery();void cancel();}private OnButtonClickListener onButtonClickListener;public OnButtonClickListener getOnButtonClickListener() {return onButtonClickListener;}public void setOnButtonClickListener(OnButtonClickListener onButtonClickListener) {this.onButtonClickListener = onButtonClickListener;}}

對話框的布局文件:layout_select_photo.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent"android:layout_height="fill_parent"android:gravity="bottom"><LinearLayoutandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:orientation="vertical"android:background="@drawable/btn_style_alert_dialog_background"android:padding="20dp"><TextViewandroid:id="@+id/btn_camera"android:layout_width="fill_parent"android:layout_height="wrap_content"android:textSize="18sp"android:background="@drawable/btn_style_alert_dialog_button"android:textColor="#0f0f0f"android:text="拍照"android:shadowDx="0.5"android:shadowDy="0.5"android:shadowRadius="0.5"android:shadowColor="#ffffff"android:layout_marginBottom="10dp"android:padding="10dp"android:gravity="center"/><TextViewandroid:id="@+id/btn_gallery"android:layout_width="fill_parent"android:layout_height="wrap_content"android:textSize="18sp"android:background="@drawable/btn_style_alert_dialog_button"android:textColor="#0f0f0f"android:text="從相冊中選擇"android:shadowDx="0.5"android:shadowDy="0.5"android:shadowRadius="0.5"android:shadowColor="#ffffff"android:layout_marginBottom="10dp"android:padding="10dp"android:gravity="center"/><TextViewandroid:id="@+id/btn_cancel"android:layout_width="fill_parent"android:layout_height="wrap_content"android:background="@drawable/btn_style_alert_dialog_cancel"android:textColor="#ffffff"android:textSize="18sp"android:text="取消"android:shadowDx="0.5"android:shadowDy="0.5"android:shadowRadius="0.5"android:shadowColor="#000000"android:layout_marginTop="10dp"android:padding="10dp"android:gravity="center"/></LinearLayout> </LinearLayout>

自定義的GridView

package com.yihang.MyGridView;import android.content.Context; import android.util.AttributeSet; import android.widget.GridView;public class MyGridView extends GridView {public MyGridView(Context context, AttributeSet attrs) {super(context, attrs);// TODO Auto-generated constructor stub }public MyGridView(Context context) {super(context);}public MyGridView(Context context, AttributeSet attrs, int defStyle) {super(context);}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {// TODO Auto-generated method stubint expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,MeasureSpec.AT_MOST);super.onMeasure(widthMeasureSpec, expandSpec);} }

?源代碼下載地址:http://download.csdn.net/download/m0_38125535/9951649

轉載于:https://www.cnblogs.com/zhujiabin/p/8434198.html

總結

以上是生活随笔為你收集整理的Android 使用GridView+仿微信图片上传功能(附源代码)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产精品一区一区三区 | 国产无遮挡又黄又爽免费网站 | 欧美日韩一区二区三区在线视频 | 老司机av影院 | 黄色精品视频在线观看 | 日韩欧美午夜 | 北岛玲在线 | 国产又粗又猛又爽又黄的视频在线观看动漫 | 中文天堂在线资源 | 丁香综合激情 | 网站免费黄色 | 天堂精品 | 欧美激情三级 | 99re这里只有精品6 | 亚洲精品四区 | 国产一级α片 | 亚洲精品国产精品乱码不66 | 天天干天天弄 | 美妇湿透娇羞紧窄迎合 | 人妻一区二区三区在线 | 中国亚洲女人69内射少妇 | 韩国毛片网站 | 午夜精品一区二区三区在线播放 | 69日本xxxxxxxx96| 尤物视频免费观看 | 欧美精品三区 | 成熟女人毛片www免费版在线 | 亚洲av无码精品一区二区 | 久久伊人av | 日本成人一二三区 | 成人动漫视频在线观看 | 久久一本综合 | 欧美日韩久久久久 | 成人做爰9片免费视频 | 男人天堂va| 一区二区三区 日韩 | 毛片基地在线播放 | 爱情岛亚洲论坛入口 | 久久国产加勒比精品无码 | 涩涩涩在线视频 | 91精品国产99| 99久久久无码国产精品免费麻豆 | 日韩一区在线看 | 日本人添下边视频免费 | 国产动漫av | 国产精品自拍网 | 国产美女极度色诱视频www | 天堂а√在线中文在线新版 | jizz国产精品 | 精品一区二区中文字幕 | 五级 黄 色 片 | 国产精品一亚洲av日韩av欧 | 华丽的外出在线 | 超碰人人草人人干 | 国产不卡免费视频 | 成人午夜剧场视频网站 | 日韩成人中文字幕 | 久久精品久久久久久久 | 欧美三级韩国三级日本三斤在线观看 | 日本一区二区色 | av三级网 | 国产成年无码久久久久毛片 | 911久久| 中文字幕在线观看第二页 | 久久综合久久鬼色 | 亚洲美女福利视频 | 女同毛片一区二区三区 | 国产xxxx视频| 精品无码国产一区二区三区51安 | 国产男男gay体育生网站 | 一级在线免费视频 | 天天碰天天操 | 欧美极品少妇xxxxⅹ喷水 | 蜜臀av一区二区三区有限公司 | 91大片免费看 | 人人狠狠综合久久亚洲 | 永久免费视频网站直接看 | 日韩av一区二区三区在线观看 | 长腿校花无力呻吟娇喘的视频 | 国产成人精品av久久 | 男人舔女人下部高潮全视频 | 亚洲天堂中文字幕在线 | 麻豆日产六区 | 自拍偷拍亚洲精品 | 春色激情站 | 日韩日b视频 | 丰满少妇aaaaaa爰片毛片 | 亚洲成人91 | 午夜免费网站 | 日韩亚洲欧美精品 | 美景之屋电影免费高清完整韩剧 | 色就是色欧美 | 日韩视频在线免费播放 | 天天色小说 | 成人午夜精品一区二区三区 | 中文字幕一级二级三级 | 欧美久久激情 | 巨乳免费观看 | 欧美激情一二三区 |