仿照微信,朋友圈分享圖片功能 ??梢赃M(jìn)行圖片的多張選擇,拍照添加圖片,以及進(jìn)行圖片的預(yù)覽,預(yù)覽時可以進(jìn)行縮放,并且可以刪除選中狀態(tài)的圖片 。很不錯的源碼,大家有需要可以下載看看 。
微信
微信
微信
微信
下載地址 :?微信上傳圖片源碼
很多網(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
補充:
通過GridView仿微信動態(tài)添加本地圖片
此篇文章主要講述GridView控件實現(xiàn)添加本地圖片并顯示.主要是關(guān)于GridView控件的基本操作,通??梢酝ㄟ^自定義繼承BaseAdapter的適配器加載圖片,而下面講述的不是自定義的適配器,而是調(diào)用SimpleAdapter實現(xiàn)的.至于上傳發(fā)布與網(wǎng)絡(luò)交互此處不講述,后面文章會講!
一. 實現(xiàn)效果
? ??主要是通過點擊+從本地相冊中添加圖片,同時顯示圖片至GridView.點擊圖片可以進(jìn)行刪除操作,同時界面中的發(fā)布EditView控件也很好看,不足之處在于+好沒有移動至最后,但原理相同. ??????
二. 項目工程結(jié)構(gòu)
三. 界面布局詳細(xì)代碼
? ? 1.主界面activity_main.xml
? ??主要通過相對布局實現(xiàn),第一部分是底部的TextView,中間是EditView和GridView相對布局,下面是兩個按鈕.同時EditView調(diào)用res/drawable-hdpi中的editview_shape.xml,GridView顯示的每張圖片通過griditem_addpic.xml實現(xiàn).
[html]?view plaincopy
<RelativeLayout?xmlns:android="http://schemas.android.com/apk/res/android"?? ????xmlns:tools="http://schemas.android.com/tools"?? ????android:id="@+id/container"?? ????android:layout_width="match_parent"?? ????android:layout_height="match_parent"?? ????tools:context="com.example.suishoupaipublish.MainActivity"?? ????tools:ignore="MergeRootFrame"?>?? ?????? ??????? ????<RelativeLayout???? ????????android:id="@+id/Layout_top"???? ????????android:orientation="horizontal"????? ????????android:layout_width="fill_parent"???? ????????android:layout_height="40dp"???? ????????android:layout_marginTop="5dp"?? ????????android:layout_alignParentTop="true"???? ????????android:gravity="center">???? ????????<TextView???? ????????????android:layout_width="fill_parent"????? ????????????android:layout_height="wrap_content"?????? ????????????android:textSize="25sp"?? ????????????android:gravity="center"?? ????????????android:text="發(fā)布信息"?/>??? ????</RelativeLayout>???? ???????? ????<RelativeLayout???? ????????android:id="@+id/Layout_bottom"????? ????????android:layout_alignParentBottom="true"?? ????????android:layout_width="fill_parent"????? ????????android:layout_height="50dp"?? ????????android:gravity="center"?>???? ????????<Button???? ????????????android:id="@+id/button1"???? ????????????android:layout_width="wrap_content"???? ????????????android:layout_height="fill_parent"?? ????????????android:textSize="20sp"?? ????????????android:text="發(fā)布拍拍"?/>???? ????????<Button???? ????????????android:id="@+id/button2"???? ????????????android:layout_width="wrap_content"???? ????????????android:layout_height="fill_parent"?? ????????????android:layout_toRightOf="@+id/button1"?? ????????????android:textSize="20sp"?? ????????????android:text="取消發(fā)布"?/>?? ????</RelativeLayout>???? ???????? ????<RelativeLayout???? ????????android:id="@+id/Content_Layout"??????? ????????android:layout_width="fill_parent"????? ????????android:layout_height="fill_parent"???? ????????android:layout_above="@id/Layout_bottom"????? ????????android:layout_below="@id/Layout_top"?????? ????????android:gravity="center">??????? ????????<LinearLayout????? ????????????android:layout_width="match_parent"???? ????????????android:layout_height="match_parent"???? ????????????android:orientation="vertical"?? ????????????android:layout_alignParentBottom="true"?>??? ?????????????? ????????????<EditText??? ????????????????android:id="@+id/editText1"?? ????????????????android:layout_height="120dp"?? ????????????????android:layout_width="fill_parent"?? ????????????????android:textColor="#000000"?? ????????????????android:layout_margin="12dp"?? ????????????????android:textSize="20sp"?? ????????????????android:hint="隨手說出你此刻的心聲..."?? ????????????????android:maxLength="500"?? ????????????????android:singleLine="false"?? ????????????????android:background="@drawable/editview_shape"?/>?? ?????????????? ????????????<GridView?? ????????????????android:id="@+id/gridView1"?? ????????????????android:layout_width="fill_parent"?? ????????????????android:layout_height="200dp"?? ????????????????android:layout_margin="10dp"?? ????????????????android:background="#EFDFDF"?? ????????????????android:horizontalSpacing="5dp"?? ????????????????android:verticalSpacing="5dp"?? ????????????????android:numColumns="4"?? ????????????????android:columnWidth="90dp"?? ????????????????android:stretchMode="columnWidth"?? ????????????????android:gravity="center"?>?? ????????????</GridView>?? ????????????<TextView??? ????????????????android:layout_width="fill_parent"?? ????????????????android:layout_height="wrap_content"?? ????????????????android:text="(友情提示:只能添加9張圖片,長按圖片可以刪除已添加圖片)"?? ????????????????android:gravity="center"?/>?? ????????</LinearLayout>?? ????</RelativeLayout>?? ?????? </RelativeLayout>?? ? ? 2.顯示ImageView圖片布局griditem_addpic.xml [html]?view plaincopy
<?xml?version="1.0"?encoding="utf-8"?>?? <LinearLayout?xmlns:android="http://schemas.android.com/apk/res/android"?? ????android:layout_width="match_parent"?? ????android:layout_height="match_parent"?? ????android:gravity="center"?? ????android:descendantFocusability="blocksDescendants"?? ????android:orientation="vertical"?>?? ????<RelativeLayout?? ????????android:layout_gravity="center"?? ????????android:layout_width="80dp"?? ????????android:layout_height="80dp"?? ????????android:orientation="vertical"?>?? ????????<ImageView?? ????????????android:layout_marginTop="10dp"?? ????????????android:layout_marginRight="10dp"?? ????????????android:id="@+id/imageView1"?? ????????????android:layout_width="fill_parent"?? ????????????android:layout_height="fill_parent"?? ????????????android:scaleType="fitXY"?? ????????????android:src="@drawable/gridview_addpic"?/>?? ????</RelativeLayout>?? </LinearLayout>?? ? ? 3.設(shè)置EditView控件圓角和顏色 editview_shape.xml [html]?view plaincopy
<?xml?version="1.0"?encoding="utf-8"?>?? <shape?xmlns:android="http://schemas.android.com/apk/res/android"??? ????android:shape="rectangle"??? ????android:padding="10dp">?? ?????? ????<soild?android:color="#ffffff"/>?? ?????? ????<corners??? ????????android:radius="15dp"?? ????????android:bottomRightRadius="15dp"?? ????????android:bottomLeftRadius="15dp"?? ????????android:topLeftRadius="15dp"???? ????????android:topRightRadius="15dp"/>?? ????<stroke?? ????????android:color="#32CD32"???? ????????android:width="4px"?/>??? </shape>?? 四. 代碼詳解
? ??它主要是思想如下:
? ? 1.通過SimpleAdapter適配器實現(xiàn)實現(xiàn)加載圖片,在gridView1.setOnItemClickListener()點擊函數(shù)中響應(yīng)不同操作.
? ? 2.當(dāng)點擊加號圖片(+)時,調(diào)用本地相冊通過Intent實現(xiàn)獲取圖片路徑存于字符串pathImage.
? ? 3.獲取圖片路徑后在onResume中刷新圖片,通過GridView的setAdapter()和notifyDataSetChanged()()函數(shù)刷新加載圖片.
? ? 4.點擊圖片時會獲取其position,通過dialog()函數(shù)彈出對話框提示是否刪除,通過remove實現(xiàn)刪除.
? ??具體代碼如下所示: [java]?view plaincopy
public?class?MainActivity?extends?Activity?{?? ?? ????private?GridView?gridView1;???????????????? ????private?Button?buttonPublish;?????????????? ????private?final?int?IMAGE_OPEN?=?1;?????????? ????private?String?pathImage;?????????????????? ????private?Bitmap?bmp;???????????????????????? ????private?ArrayList<HashMap<String,?Object>>?imageItem;?? ????private?SimpleAdapter?simpleAdapter;??????? ?????? ????@Override?? ????protected?void?onCreate(Bundle?savedInstanceState)?{?? ????????super.onCreate(savedInstanceState);?? ????????setContentView(R.layout.activity_main);?? ????????? ? ? ? ?? ????????getWindow().setSoftInputMode(WindowManager.LayoutParams.?? ????????????????SOFT_INPUT_ADJUST_PAN);?? ?????????? ????????setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);?? ????????setContentView(R.layout.activity_main);?? ?????????? ????????gridView1?=?(GridView)?findViewById(R.id.gridView1);?? ?? ????????? ? ? ? ?? ?????????? ????????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()?{???? ????????????@Override???? ????????????public?boolean?setViewValue(View?view,?Object?data,???? ????????????????????String?textRepresentation)?{???? ?????????????????? ????????????????if(view?instanceof?ImageView?&&?data?instanceof?Bitmap){???? ????????????????????ImageView?i?=?(ImageView)view;???? ????????????????????i.setImageBitmap((Bitmap)?data);???? ????????????????????return?true;???? ????????????????}???? ????????????????return?false;???? ????????????}?? ????????});???? ????????gridView1.setAdapter(simpleAdapter);?? ?????????? ????????? ? ? ?? ????????gridView1.setOnItemClickListener(new?OnItemClickListener()?{?? ????????????@Override?? ????????????public?void?onItemClick(AdapterView<?>?parent,?View?v,?int?position,?long?id)?? ????????????{?? ????????????????if(?imageItem.size()?==?10)?{??? ????????????????????Toast.makeText(MainActivity.this,?"圖片數(shù)9張已滿",?Toast.LENGTH_SHORT).show();?? ????????????????}?? ????????????????else?if(position?==?0)?{??? ????????????????????Toast.makeText(MainActivity.this,?"添加圖片",?Toast.LENGTH_SHORT).show();?? ?????????????????????? ????????????????????Intent?intent?=?new?Intent(Intent.ACTION_PICK,????????? ????????????????????????????android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);???? ????????????????????startActivityForResult(intent,?IMAGE_OPEN);???? ?????????????????????? ????????????????}?? ????????????????else?{?? ????????????????????dialog(position);?? ?????????????????????? ?????????????????????? ????????????????}?? ????????????}?? ????????});???? ????}?? ?????? ?????? ????protected?void?onActivityResult(int?requestCode,?int?resultCode,?Intent?data)?{???? ????????super.onActivityResult(requestCode,?resultCode,?data);?????????? ?????????? ????????if(resultCode==RESULT_OK?&&?requestCode==IMAGE_OPEN)?{?????????? ????????????Uri?uri?=?data.getData();???? ????????????if?(!TextUtils.isEmpty(uri.getAuthority()))?{???? ?????????????????? ????????????????Cursor?cursor?=?getContentResolver().query(???? ????????????????????????uri,???? ????????????????????????new?String[]?{?MediaStore.Images.Media.DATA?},???? ????????????????????????null,????? ????????????????????????null,????? ????????????????????????null);???? ?????????????????? ????????????????if?(null?==?cursor)?{???? ????????????????????return;???? ????????????????}???? ?????????????????? ????????????????cursor.moveToFirst();???? ????????????????pathImage?=?cursor.getString(cursor???? ????????????????????????.getColumnIndex(MediaStore.Images.Media.DATA));???? ????????????}?? ????????}???? ????}?? ?????? ?????? ????@Override?? ????protected?void?onResume()?{?? ????????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()?{???? ????????????????@Override???? ????????????????public?boolean?setViewValue(View?view,?Object?data,???? ????????????????????????String?textRepresentation)?{???? ?????????????????????? ????????????????????if(view?instanceof?ImageView?&&?data?instanceof?Bitmap){???? ????????????????????????ImageView?i?=?(ImageView)view;???? ????????????????????????i.setImageBitmap((Bitmap)?data);???? ????????????????????????return?true;???? ????????????????????}???? ????????????????????return?false;???? ????????????????}?? ????????????});??? ????????????gridView1.setAdapter(simpleAdapter);?? ????????????simpleAdapter.notifyDataSetChanged();?? ?????????????? ????????????pathImage?=?null;?? ????????}?? ????}?? ?????? ????? ? ? ?? ????protected?void?dialog(final?int?position)?{?? ????????AlertDialog.Builder?builder?=?new?Builder(MainActivity.this);?? ????????builder.setMessage("確認(rèn)移除已添加圖片嗎?");?? ????????builder.setTitle("提示");?? ????????builder.setPositiveButton("確認(rèn)",?new?DialogInterface.OnClickListener()?{?? ????????????@Override?? ????????????public?void?onClick(DialogInterface?dialog,?int?which)?{?? ????????????????dialog.dismiss();?? ????????????????imageItem.remove(position);?? ????????????????simpleAdapter.notifyDataSetChanged();?? ????????????}?? ????????});?? ????????builder.setNegativeButton("取消",?new?DialogInterface.OnClickListener()?{?? ????????????@Override?? ????????????public?void?onClick(DialogInterface?dialog,?int?which)?{?? ????????????????dialog.dismiss();?? ????????????????}?? ????????????});?? ????????builder.create().show();?? ????}?? ?? }?? ? ? 同時需要在AndroidMainfest.xml中添加權(quán)限操作SD卡和網(wǎng)絡(luò)上傳至服務(wù)器. [html]?view plaincopy
?? <uses-permission?android:name="android.permission.INTERNET"?/>?? ???? <uses-permission?android:name="android.permission.WRITE_EXTERNAL_STORAGE"?/>?? 五. 總結(jié)
? ?? ? ??該文章需要注意一個地方:在使用SimpleAdapter適配器加載bmp圖片時,可能在GridView中不顯示.即HashMap中map.put("itemImage",bmp)不顯示圖片,而使用put裝入R.drawable.img卻能顯示.
? ? 這時有兩種解決方法,一種是自定義繼承BaseAdapter的適配器實現(xiàn);另一種方法則是如上所示通過ViewBinder()接口實現(xiàn),感謝博主dmin_提供的方法.
? ? 下載地址:http://download.csdn.net/detail/eastmount/8237429
下面再分享個圖片處理的博客。
?demo下載地址:?
? ? ? ??http://download.csdn.net/detail/eastmount/8432127
? ? ? ??http://pan.baidu.com/s/1c0kz3by
一. 項目結(jié)構(gòu)及界面
? ? ? ? 項目工程結(jié)構(gòu)如下圖所示:
??
? ? ? ?個人還是比較欣賞這個布局的,其中MainActivity.java是主界面,ProcessActivity.java是圖像處理界面,而剩余五個java對應(yīng)五個不同的圖像處理算法:EffectProcessImage(圖像特效)、FrameProcessImage(添加相框)、IncreaseProcessImage(圖像增強(qiáng))、PersonProcessImage(圖像交互)和WatchProcessImage(查看圖片).
? ? ? ? 同時Layout中有五個xml子布局,采用PopupWindow形式顯示五個不同的處理,同時該demo比較好移植,將文件依次復(fù)制過去并且MainActivity改成子活動,即可調(diào)用.
? ? ? ? 其中部分界面如下:
?????
MainActivity主界面? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
添加圖片選項? ? ? ? ? ? ? ? ? ? ? ? ?
圖像處理子界面(底部五個)?
二. 圖像查看功能
? ? ? ? 點擊主界面GridView中"+"添加圖片后,可以選擇從相冊添加或照相,加載圖片進(jìn)行到處理界面后,點擊底部"查看"按鈕它會有選中的效果(圖標(biāo)顏色變藍(lán)&背景顏色加深).同時PopupWindow彈出如下界面:
? ? ? ? 其中點擊"旋轉(zhuǎn)"后提交的動態(tài)圖如下所示:
? ??
? ? ? ? 參考以前我的博客: ? ? ? ? ? ??[Android] 拍照、截圖、保存并顯示在ImageView控件中? ? ? ??
? ? ? ? ? ??[Android] 使用Matrix矩陣類對圖像進(jìn)行縮放、旋轉(zhuǎn)、對比度、亮度處理
? ? ? ? ? ??[Android] 觸屏setOnTouchListener實現(xiàn)圖片縮放、移動、繪制和添加水印
? ? ? ? 其他效果如下,同時存在幾個問題:
? ? ? ? ? ? 1.圖像繪圖保存我沒有做
? ? ? ? ? ? 2.移動和縮放圖像,上傳的都是原圖大小
? ? ? ? ? ? 3.添加水印功能感覺簡單就沒實現(xiàn)
??
三. 圖像增強(qiáng)功能
? ? ? ? 圖像增強(qiáng)主要是通過3個進(jìn)度條SeekBar實現(xiàn),可以調(diào)節(jié)圖像的飽和度、亮度和色相.當(dāng)飽和度等于0時就是黑白二值圖像,三個滑動條可以相互調(diào)節(jié).如下圖所示:
? ? ? ? 參考我的以前博客:? ? ? ? ? ??[Android] 使用Matrix矩陣類對圖像進(jìn)行縮放、旋轉(zhuǎn)、對比度、亮度處理
? ? ? ? ? ??[Android] 圖像處理整合之處理ColorMatrix和Intend傳遞路徑顯示圖像
? ? ? ? ? ??[Android] 底部菜單布局+PopupWindows實現(xiàn)彈出菜單功能(初級篇)
? ? ? ? 同時需要注意一個問題: 設(shè)置滑動條時需要設(shè)置其區(qū)間,同時在彈出PopupWindow注意其寬度和不同手機(jī)的適屏處理.
? ? ? ? 該部分算法處理代碼如下,每部分算法調(diào)用后返回值都是bitmap,然后調(diào)用imageShow.setImageBitmap(mbmp);直接顯示.
四. 圖像特效功能
? ? ? ??PopupWindow彈出如下界面,主要包括:懷舊、浮雕、光照、素描和銳化處理.
? ? ? ? 其中特效效果和EffectProcessImage.java如下所示:
? ?? ? ? ? ? 參考我的博客:
? ? ? ? ? ??[Android] 通過Menu實現(xiàn)圖片懷舊、浮雕、模糊、光照和素描效果
? ? ? ? ? ??[Android] 圖像各種處理系列文章合集?(草稿 強(qiáng)推)
? ? ? ? 同時算法中存在一些問題,一個就是效率不高,有好友建議C寫算法來調(diào)用,但是該文章僅是課堂作業(yè),提供一種方法供大家參考.同時在圖像素描算法效果不好,銳化處理應(yīng)該也不對(可參考博客),光照效果是從中心向邊沿映射,用戶可自己設(shè)置光照直徑和方向.
? ? ? ? ? ??
五. 圖像相框添加
? ? ? ? 最后是圖像相框合成,如下圖所示.我采用的是照相后合成圖片:
? ??
? ? ? ? 添加相框功能主要是通過兩張圖片的合成,我也見到過四張圖片分別合成相框的效果.但我更喜歡這種兩張圖片合成的,在assets文件夾中加載透明圖片.詳見:
? ? ? ??[Android] 給圖像添加相框、圓形圓角顯示圖片、圖像合成知識
六. 總結(jié)及感想
? ? ? ? 該處理過程中的底部五個按鈕切換背景和顏色詳見代碼ProcessActivity.java,主要是通切換兩張圖片和背景實現(xiàn).如果每個界面顯示不同內(nèi)容,建議使用Fragment滑動實現(xiàn).參考:
? ? ? ??[Android] 使用Include布局+Fragment滑動切換屏幕
? ? ? ??[Android] 通過GridView仿微信動態(tài)添加本地圖片
? ? ? ? 隨手拍我還是比較滿意的,其中后臺數(shù)據(jù)庫我們使用的是新浪SAE做的,同時ListView刷新拍拍也非常不錯!效果如下:
????
? ? ? ? 上傳的demo我把發(fā)布功能刪除了,它是通過線程和Process進(jìn)度條來上傳多張圖片的.同時ListView可以刷新最近發(fā)布消息,點擊圖片可以查看大圖.可以對發(fā)布的拍拍進(jìn)行評論、關(guān)注、點贊等操作.
? ? ? ??但是由于整個項目是大家一起完成,包括網(wǎng)絡(luò)、數(shù)據(jù)庫(SAE)、ListView(引用開源),所以只能共享我做的那部分.抱歉~如果有時間可以寫些關(guān)于Android網(wǎng)絡(luò)方面的文章,包括如何上傳圖片(URL鏈接存儲在云盤中)、獲取數(shù)據(jù)庫內(nèi)容等操作.
? ? ? ? PS:最近其實挺煩躁的,一方面這學(xué)期確實忙成狗了,寒假也還有個作業(yè).但在火車上我還是挺平靜的——聽著調(diào)皮的鋼琴曲,看著窗外流逝的繁華,不知道從什么時候自己已經(jīng)喜歡上了這種26小時獨處的感覺.感受頗多啊!另一個挺令我心煩的就是回家后不久就去做了個手指的小手術(shù),今天寫完這篇文章,心情稍微好點!驀然回首,突然發(fā)現(xiàn)這輩子我最對不住的人居然是我自己,希望來年對自己有點,尤其是對自己的身體.同時有機(jī)會,找份實習(xí)吧!但幸運的是,每每分享一些博客、完成一些項目后都能給我?guī)硪环菘鞓?
? ? ? ? 希望文章對大家有所幫助~
? ? ? ? 最后用最近看的《老人與?!方Y(jié)束這篇文章:
? ? ? ??生活總是讓我們遍體鱗傷,但到后來,那些受傷的地方一定會變成我們最強(qiáng)壯的地方.
? ? ? (By:Eastmount 2015-2-7 夜11點 ??http://blog.csdn.net/eastmount/) 隨時拍圖像處理部分總結(jié)及源碼分享
總結(jié)
以上是生活随笔為你收集整理的Android仿微信图片上传,可以选择多张图片,缩放预览,拍照上传等的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。