Android仿微信图片上传,可以选择多张图片,缩放预览,拍照上传等
仿照微信,朋友圈分享圖片功能 。可以進(jìn)行圖片的多張選擇,拍照添加圖片,以及進(jìn)行圖片的預(yù)覽,預(yù)覽時(shí)可以進(jìn)行縮放,并且可以刪除選中狀態(tài)的圖片 。很不錯(cuò)的源碼,大家有需要可以下載看看 。
微信
微信
微信
微信
下載地址 :?微信上傳圖片源碼
很多網(wǎng)友不知道怎么獲取圖片路徑,這里貼出來:
String path = Bimp.tempSelectBitmap.get(position).getImagePath();
//部分代碼如下
package com.king.photo.activity;import android.annotation.SuppressLint; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Color; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.ColorDrawable; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.provider.MediaStore; import android.util.Log; import android.view.Gravity; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.view.ViewGroup.LayoutParams; import android.view.animation.AnimationUtils; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.BaseAdapter; import android.widget.Button; import android.widget.GridView; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.PopupWindow; import android.widget.RelativeLayout;import com.king.photo.R; import com.king.photo.util.Bimp; import com.king.photo.util.FileUtils; import com.king.photo.util.ImageItem; import com.king.photo.util.PublicWay; import com.king.photo.util.Res;//首頁面activitypublic class MainActivity extends Activity {private GridView noScrollgridview;private GridAdapter adapter;private View parentView;private PopupWindow pop = null;private LinearLayout ll_popup;public static Bitmap bimap ;protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);Res.init(this);bimap = BitmapFactory.decodeResource(getResources(),R.drawable.icon_addpic_unfocused);PublicWay.activityList.add(this);parentView = getLayoutInflater().inflate(R.layout.activity_selectimg, null);setContentView(parentView);Init();}public void Init() {pop = new PopupWindow(MainActivity.this);View view = getLayoutInflater().inflate(R.layout.item_popupwindows, null);ll_popup = (LinearLayout) view.findViewById(R.id.ll_popup);pop.setWidth(LayoutParams.MATCH_PARENT);pop.setHeight(LayoutParams.WRAP_CONTENT);pop.setBackgroundDrawable(new BitmapDrawable());pop.setFocusable(true);pop.setOutsideTouchable(true);pop.setContentView(view);RelativeLayout parent = (RelativeLayout) view.findViewById(R.id.parent);Button bt1 = (Button) view.findViewById(R.id.item_popupwindows_camera);Button bt2 = (Button) view.findViewById(R.id.item_popupwindows_Photo);Button bt3 = (Button) view.findViewById(R.id.item_popupwindows_cancel);parent.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubpop.dismiss();ll_popup.clearAnimation();}});bt1.setOnClickListener(new OnClickListener() {public void onClick(View v) {photo();pop.dismiss();ll_popup.clearAnimation();}});bt2.setOnClickListener(new OnClickListener() {public void onClick(View v) {Intent intent = new Intent(MainActivity.this,AlbumActivity.class);startActivity(intent);overridePendingTransition(R.anim.activity_translate_in, R.anim.activity_translate_out);pop.dismiss();ll_popup.clearAnimation();}});bt3.setOnClickListener(new OnClickListener() {public void onClick(View v) {pop.dismiss();ll_popup.clearAnimation();}});noScrollgridview = (GridView) findViewById(R.id.noScrollgridview); noScrollgridview.setSelector(new ColorDrawable(Color.TRANSPARENT));adapter = new GridAdapter(this);adapter.update();noScrollgridview.setAdapter(adapter);noScrollgridview.setOnItemClickListener(new OnItemClickListener() {public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,long arg3) {if (arg2 == Bimp.tempSelectBitmap.size()) {Log.i("ddddddd", "----------");ll_popup.startAnimation(AnimationUtils.loadAnimation(MainActivity.this,R.anim.activity_translate_in));pop.showAtLocation(parentView, Gravity.BOTTOM, 0, 0);} else {Intent intent = new Intent(MainActivity.this,GalleryActivity.class);intent.putExtra("position", "1");intent.putExtra("ID", arg2);startActivity(intent);}}});}@SuppressLint("HandlerLeak")public class GridAdapter extends BaseAdapter {private LayoutInflater inflater;private int selectedPosition = -1;private boolean shape;public boolean isShape() {return shape;}public void setShape(boolean shape) {this.shape = shape;}public GridAdapter(Context context) {inflater = LayoutInflater.from(context);}public void update() {loading();}public int getCount() {if(Bimp.tempSelectBitmap.size() == 9){return 9;}return (Bimp.tempSelectBitmap.size() + 1);}public Object getItem(int arg0) {return null;}public long getItemId(int arg0) {return 0;}public void setSelectedPosition(int position) {selectedPosition = position;}public int getSelectedPosition() {return selectedPosition;}public View getView(int position, View convertView, ViewGroup parent) {ViewHolder holder = null;if (convertView == null) {convertView = inflater.inflate(R.layout.item_published_grida,parent, false);holder = new ViewHolder();holder.image = (ImageView) convertView.findViewById(R.id.item_grida_image);convertView.setTag(holder);} else {holder = (ViewHolder) convertView.getTag();}if (position ==Bimp.tempSelectBitmap.size()) {holder.image.setImageBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.icon_addpic_unfocused));if (position == 9) {holder.image.setVisibility(View.GONE);}} else {holder.image.setImageBitmap(Bimp.tempSelectBitmap.get(position).getBitmap());}return convertView;}public class ViewHolder {public ImageView image;}Handler handler = new Handler() {public void handleMessage(Message msg) {switch (msg.what) {case 1:adapter.notifyDataSetChanged();break;}super.handleMessage(msg);}};public void loading() {new Thread(new Runnable() {public void run() {while (true) {if (Bimp.max == Bimp.tempSelectBitmap.size()) {Message message = new Message();message.what = 1;handler.sendMessage(message);break;} else {Bimp.max += 1;Message message = new Message();message.what = 1;handler.sendMessage(message);}}}}).start();}}public String getString(String s) {String path = null;if (s == null)return "";for (int i = s.length() - 1; i > 0; i++) {s.charAt(i);}return path;}protected void onRestart() {adapter.update();super.onRestart();}private static final int TAKE_PICTURE = 0x000001;public void photo() {Intent openCameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);startActivityForResult(openCameraIntent, TAKE_PICTURE);}protected void onActivityResult(int requestCode, int resultCode, Intent data) {switch (requestCode) {case TAKE_PICTURE:if (Bimp.tempSelectBitmap.size() < 9 && resultCode == RESULT_OK) {String fileName = String.valueOf(System.currentTimeMillis());Bitmap bm = (Bitmap) data.getExtras().get("data");FileUtils.saveBitmap(bm, fileName);ImageItem takePhoto = new ImageItem();takePhoto.setBitmap(bm);Bimp.tempSelectBitmap.add(takePhoto);}break;}}public boolean onKeyDown(int keyCode, KeyEvent event) {if (keyCode == KeyEvent.KEYCODE_BACK) {for(int i=0;i<PublicWay.activityList.size();i++){if (null != PublicWay.activityList.get(i)) {PublicWay.activityList.get(i).finish();}}System.exit(0);}return true;}}
下載地址 :?微信上傳圖片源碼
備份下載地址:http://download.csdn.net/detail/jdsjlzx/8486449
補(bǔ)充:
通過GridView仿微信動態(tài)添加本地圖片
此篇文章主要講述GridView控件實(shí)現(xiàn)添加本地圖片并顯示.主要是關(guān)于GridView控件的基本操作,通常可以通過自定義繼承BaseAdapter的適配器加載圖片,而下面講述的不是自定義的適配器,而是調(diào)用SimpleAdapter實(shí)現(xiàn)的.至于上傳發(fā)布與網(wǎng)絡(luò)交互此處不講述,后面文章會講!
一. 實(shí)現(xiàn)效果
? ??主要是通過點(diǎn)擊+從本地相冊中添加圖片,同時(shí)顯示圖片至GridView.點(diǎn)擊圖片可以進(jìn)行刪除操作,同時(shí)界面中的發(fā)布EditView控件也很好看,不足之處在于+好沒有移動至最后,但原理相同. ??????二. 項(xiàng)目工程結(jié)構(gòu)
三. 界面布局詳細(xì)代碼
? ? 1.主界面activity_main.xml
? ??主要通過相對布局實(shí)現(xiàn),第一部分是底部的TextView,中間是EditView和GridView相對布局,下面是兩個(gè)按鈕.同時(shí)EditView調(diào)用res/drawable-hdpi中的editview_shape.xml,GridView顯示的每張圖片通過griditem_addpic.xml實(shí)現(xiàn).
四. 代碼詳解
? ??它主要是思想如下:
? ? 1.通過SimpleAdapter適配器實(shí)現(xiàn)實(shí)現(xiàn)加載圖片,在gridView1.setOnItemClickListener()點(diǎn)擊函數(shù)中響應(yīng)不同操作.
? ? 2.當(dāng)點(diǎn)擊加號圖片(+)時(shí),調(diào)用本地相冊通過Intent實(shí)現(xiàn)獲取圖片路徑存于字符串pathImage.
? ? 3.獲取圖片路徑后在onResume中刷新圖片,通過GridView的setAdapter()和notifyDataSetChanged()()函數(shù)刷新加載圖片.
? ? 4.點(diǎn)擊圖片時(shí)會獲取其position,通過dialog()函數(shù)彈出對話框提示是否刪除,通過remove實(shí)現(xiàn)刪除.
? ??具體代碼如下所示: [java]?view plaincopy
五. 總結(jié)
? ?? ? ??該文章需要注意一個(gè)地方:在使用SimpleAdapter適配器加載bmp圖片時(shí),可能在GridView中不顯示.即HashMap中map.put("itemImage",bmp)不顯示圖片,而使用put裝入R.drawable.img卻能顯示.? ? 這時(shí)有兩種解決方法,一種是自定義繼承BaseAdapter的適配器實(shí)現(xiàn);另一種方法則是如上所示通過ViewBinder()接口實(shí)現(xiàn),感謝博主dmin_提供的方法.
? ? 下載地址:http://download.csdn.net/detail/eastmount/8237429
下面再分享個(gè)圖片處理的博客。
?demo下載地址:?
? ? ? ??http://download.csdn.net/detail/eastmount/8432127
? ? ? ??http://pan.baidu.com/s/1c0kz3by
一. 項(xiàng)目結(jié)構(gòu)及界面
? ? ? ? 項(xiàng)目工程結(jié)構(gòu)如下圖所示:
? ? ? ? 同時(shí)Layout中有五個(gè)xml子布局,采用PopupWindow形式顯示五個(gè)不同的處理,同時(shí)該demo比較好移植,將文件依次復(fù)制過去并且MainActivity改成子活動,即可調(diào)用.
? ? ? ? 其中部分界面如下:
?????
MainActivity主界面? ? ? ? ? ? ? ? ? ? ? ? ? ? ?添加圖片選項(xiàng)? ? ? ? ? ? ? ? ? ? ? ? ?圖像處理子界面(底部五個(gè))?
二. 圖像查看功能
? ? ? ? 點(diǎn)擊主界面GridView中"+"添加圖片后,可以選擇從相冊添加或照相,加載圖片進(jìn)行到處理界面后,點(diǎn)擊底部"查看"按鈕它會有選中的效果(圖標(biāo)顏色變藍(lán)&背景顏色加深).同時(shí)PopupWindow彈出如下界面:
? ? ? ? 其中點(diǎn)擊"旋轉(zhuǎn)"后提交的動態(tài)圖如下所示:
? ??
? ? ? ? 參考以前我的博客: ? ? ? ? ? ??[Android] 拍照、截圖、保存并顯示在ImageView控件中? ? ? ??
? ? ? ? ? ??[Android] 使用Matrix矩陣類對圖像進(jìn)行縮放、旋轉(zhuǎn)、對比度、亮度處理
? ? ? ? ? ??[Android] 觸屏setOnTouchListener實(shí)現(xiàn)圖片縮放、移動、繪制和添加水印
? ? ? ? 其他效果如下,同時(shí)存在幾個(gè)問題:
? ? ? ? ? ? 1.圖像繪圖保存我沒有做
? ? ? ? ? ? 2.移動和縮放圖像,上傳的都是原圖大小
? ? ? ? ? ? 3.添加水印功能感覺簡單就沒實(shí)現(xiàn)
??
三. 圖像增強(qiáng)功能
? ? ? ? 圖像增強(qiáng)主要是通過3個(gè)進(jìn)度條SeekBar實(shí)現(xiàn),可以調(diào)節(jié)圖像的飽和度、亮度和色相.當(dāng)飽和度等于0時(shí)就是黑白二值圖像,三個(gè)滑動條可以相互調(diào)節(jié).如下圖所示:
? ? ? ? 參考我的以前博客:
? ? ? ? ? ??[Android] 使用Matrix矩陣類對圖像進(jìn)行縮放、旋轉(zhuǎn)、對比度、亮度處理
? ? ? ? ? ??[Android] 圖像處理整合之處理ColorMatrix和Intend傳遞路徑顯示圖像
? ? ? ? ? ??[Android] 底部菜單布局+PopupWindows實(shí)現(xiàn)彈出菜單功能(初級篇)
? ? ? ? 同時(shí)需要注意一個(gè)問題: 設(shè)置滑動條時(shí)需要設(shè)置其區(qū)間,同時(shí)在彈出PopupWindow注意其寬度和不同手機(jī)的適屏處理.
? ? ? ? 該部分算法處理代碼如下,每部分算法調(diào)用后返回值都是bitmap,然后調(diào)用imageShow.setImageBitmap(mbmp);直接顯示.
四. 圖像特效功能
? ? ? ??PopupWindow彈出如下界面,主要包括:懷舊、浮雕、光照、素描和銳化處理.
? ??
? ? ? ? 參考我的博客:
? ? ? ? ? ??[Android] 通過Menu實(shí)現(xiàn)圖片懷舊、浮雕、模糊、光照和素描效果
? ? ? ? ? ??[Android] 圖像各種處理系列文章合集?(草稿 強(qiáng)推)
? ? ? ? 同時(shí)算法中存在一些問題,一個(gè)就是效率不高,有好友建議C寫算法來調(diào)用,但是該文章僅是課堂作業(yè),提供一種方法供大家參考.同時(shí)在圖像素描算法效果不好,銳化處理應(yīng)該也不對(可參考博客),光照效果是從中心向邊沿映射,用戶可自己設(shè)置光照直徑和方向.
? ? ? ? ? ??
五. 圖像相框添加
? ? ? ? 最后是圖像相框合成,如下圖所示.我采用的是照相后合成圖片:
? ? ? ? 添加相框功能主要是通過兩張圖片的合成,我也見到過四張圖片分別合成相框的效果.但我更喜歡這種兩張圖片合成的,在assets文件夾中加載透明圖片.詳見:
? ? ? ??[Android] 給圖像添加相框、圓形圓角顯示圖片、圖像合成知識
六. 總結(jié)及感想
? ? ? ? 該處理過程中的底部五個(gè)按鈕切換背景和顏色詳見代碼ProcessActivity.java,主要是通切換兩張圖片和背景實(shí)現(xiàn).如果每個(gè)界面顯示不同內(nèi)容,建議使用Fragment滑動實(shí)現(xiàn).參考:
? ? ? ??[Android] 使用Include布局+Fragment滑動切換屏幕
? ? ? ??[Android] 通過GridView仿微信動態(tài)添加本地圖片
? ? ? ? 隨手拍我還是比較滿意的,其中后臺數(shù)據(jù)庫我們使用的是新浪SAE做的,同時(shí)ListView刷新拍拍也非常不錯(cuò)!效果如下:
? ? ? ? 上傳的demo我把發(fā)布功能刪除了,它是通過線程和Process進(jìn)度條來上傳多張圖片的.同時(shí)ListView可以刷新最近發(fā)布消息,點(diǎn)擊圖片可以查看大圖.可以對發(fā)布的拍拍進(jìn)行評論、關(guān)注、點(diǎn)贊等操作.
? ? ? ??但是由于整個(gè)項(xiàng)目是大家一起完成,包括網(wǎng)絡(luò)、數(shù)據(jù)庫(SAE)、ListView(引用開源),所以只能共享我做的那部分.抱歉~如果有時(shí)間可以寫些關(guān)于Android網(wǎng)絡(luò)方面的文章,包括如何上傳圖片(URL鏈接存儲在云盤中)、獲取數(shù)據(jù)庫內(nèi)容等操作.
? ? ? ? PS:最近其實(shí)挺煩躁的,一方面這學(xué)期確實(shí)忙成狗了,寒假也還有個(gè)作業(yè).但在火車上我還是挺平靜的——聽著調(diào)皮的鋼琴曲,看著窗外流逝的繁華,不知道從什么時(shí)候自己已經(jīng)喜歡上了這種26小時(shí)獨(dú)處的感覺.感受頗多啊!另一個(gè)挺令我心煩的就是回家后不久就去做了個(gè)手指的小手術(shù),今天寫完這篇文章,心情稍微好點(diǎn)!驀然回首,突然發(fā)現(xiàn)這輩子我最對不住的人居然是我自己,希望來年對自己有點(diǎn),尤其是對自己的身體.同時(shí)有機(jī)會,找份實(shí)習(xí)吧!但幸運(yùn)的是,每每分享一些博客、完成一些項(xiàng)目后都能給我?guī)硪环菘鞓?
? ? ? ? 希望文章對大家有所幫助~
? ? ? ? 最后用最近看的《老人與海》結(jié)束這篇文章:
? ? ? ??生活總是讓我們遍體鱗傷,但到后來,那些受傷的地方一定會變成我們最強(qiáng)壯的地方.
? ? ? (By:Eastmount 2015-2-7 夜11點(diǎn) ??http://blog.csdn.net/eastmount/)
隨時(shí)拍圖像處理部分總結(jié)及源碼分享
總結(jié)
以上是生活随笔為你收集整理的Android仿微信图片上传,可以选择多张图片,缩放预览,拍照上传等的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Func环境部署
- 下一篇: Android非UI线程更新UI的几种方