Android仿微信朋友圈上传图片
16lz
2021-01-24
先看效果图:
android 仿微信朋友圈上传图片,相册选择拍照上传,裁剪编辑等,没什么技术点,直接上代码 如下
1. MainActivity 主类 界面操作类
package com.dynamic;import java.io.File;import java.io.IOException;import java.text.SimpleDateFormat;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.Timer;import java.util.TimerTask;import android.app.Activity;import android.app.Dialog;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.content.IntentFilter;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Color;import android.graphics.Rect;import android.graphics.drawable.BitmapDrawable;import android.graphics.drawable.ColorDrawable;import android.net.Uri;import android.os.Bundle;import android.os.Environment;import android.provider.MediaStore;import android.text.Editable;import android.text.Selection;import android.text.Spannable;import android.text.TextWatcher;import android.view.Gravity;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.ViewTreeObserver.OnGlobalLayoutListener;import android.view.ViewTreeObserver.OnPreDrawListener;import android.view.WindowManager;import android.view.animation.AnimationUtils;import android.view.inputmethod.InputMethodManager;import android.widget.AdapterView;import android.widget.AdapterView.OnItemClickListener;import android.widget.BaseAdapter;import android.widget.Button;import android.widget.EditText;import android.widget.GridView;import android.widget.HorizontalScrollView;import android.widget.ImageView;import android.widget.LinearLayout;import android.widget.ListView;import android.widget.PopupWindow;import android.widget.ScrollView;import android.widget.SimpleAdapter;import android.widget.TextView;import android.widget.Toast;public class MainActivity extends Activity implements OnItemClickListener { private GridView gridview; private GridAdapter adapter; private TextView activity_selectimg_send; private ImageView back; private EditText comment_content; private String temp; private Button selectimg_bt_content_type, selectimg_bt_search; private LinearLayout selectimg_relativeLayout_below; private ScrollView activity_selectimg_scrollView; private HorizontalScrollView selectimg_horizontalScrollView; private List categoryList; private float dp; public List bmp = new ArrayList(); public List drr = new ArrayList(); protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_selectimg); Init(); } List urList = new ArrayList(); public void Init() { dp = getResources().getDimension(R.dimen.dp); comment_content = (EditText) findViewById(R.id.comment_content); comment_content.setFocusable(true); comment_content.setFocusableInTouchMode(true); back = (ImageView) findViewById(R.id.back); back.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub MainActivity.this.finish(); } }); selectimg_horizontalScrollView = (HorizontalScrollView) findViewById(R.id.selectimg_horizontalScrollView); gridview = (GridView) findViewById(R.id.noScrollgridview); gridview.setSelector(new ColorDrawable(Color.TRANSPARENT)); gridviewInit(); comment_content.addTextChangedListener(new TextWatcher() { @Override public void onTextChanged(CharSequence s, int start, int before, int count) { // TODO Auto-generated method stub temp = s.toString(); } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { // TODO Auto-generated method stub } @Override public void afterTextChanged(Editable s) { // TODO Auto-generated method stub } }); activity_selectimg_send = (TextView) findViewById(R.id.activity_selectimg_send); activity_selectimg_send.setOnClickListener(new OnClickListener() { public void onClick(View v) { if (bmp.size() < 1) { Toast.makeText(getApplicationContext(), "至少需要一张图片", Toast.LENGTH_SHORT).show(); return; } ((InputMethodManager) getSystemService(INPUT_METHOD_SERVICE)) .hideSoftInputFromWindow(MainActivity.this .getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); String content = comment_content.getText().toString().trim(); if (content.equals("")) { Toast.makeText(getApplicationContext(), "发布的内容不能为空", Toast.LENGTH_SHORT).show(); return; } for (int i = 0; i < drr.size(); i++) { urList.add(drr.get(i)); } activity_selectimg_send.setEnabled(false); // 图片地址 urList; } }); selectimg_relativeLayout_below = (LinearLayout) findViewById(R.id.selectimg_relativeLayout_below); activity_selectimg_scrollView = (ScrollView) findViewById(R.id.activity_selectimg_scrollView); activity_selectimg_scrollView.setVerticalScrollBarEnabled(false); final View decorView = getWindow().getDecorView(); final WindowManager wm = this.getWindowManager(); decorView.getViewTreeObserver().addOnGlobalLayoutListener( new OnGlobalLayoutListener() { @Override public void onGlobalLayout() { @SuppressWarnings("deprecation") int displayheight = wm.getDefaultDisplay().getHeight(); Rect rect = new Rect(); decorView.getWindowVisibleDisplayFrame(rect); int dynamicHight = rect.bottom - rect.top; float ratio = (float) dynamicHight / (float) displayheight; if (ratio > 0.2f && ratio < 0.6f) { selectimg_relativeLayout_below .setVisibility(View.VISIBLE); activity_selectimg_scrollView.scrollBy(0, activity_selectimg_scrollView.getHeight()); } else { selectimg_relativeLayout_below .setVisibility(View.GONE); } } }); } public void gridviewInit() { adapter = new GridAdapter(this); adapter.setSelectedPosition(0); int size = 0; if (bmp.size() < 6) { size = bmp.size() + 1; } else { size = bmp.size(); } LayoutParams params = gridview.getLayoutParams(); final int width = size * (int) (dp * 9.4f); params.width = width; gridview.setLayoutParams(params); gridview.setColumnWidth((int) (dp * 9.4f)); gridview.setStretchMode(GridView.NO_STRETCH); gridview.setNumColumns(size); gridview.setAdapter(adapter); gridview.setOnItemClickListener(this); selectimg_horizontalScrollView.getViewTreeObserver() .addOnPreDrawListener(// 绘制完毕 new OnPreDrawListener() { public boolean onPreDraw() { selectimg_horizontalScrollView.scrollTo(width, 0); selectimg_horizontalScrollView .getViewTreeObserver() .removeOnPreDrawListener(this); return false; } }); } protected void onPause() { // TODO Auto-generated method stub // temp=comment_content.getText().toString().trim(); super.onPause(); } public class GridAdapter extends BaseAdapter { private LayoutInflater listContainer; private int selectedPosition = -1; private boolean shape; public boolean isShape() { return shape; } public void setShape(boolean shape) { this.shape = shape; } public class ViewHolder { public ImageView image; public Button bt; } public GridAdapter(Context context) { listContainer = LayoutInflater.from(context); } public int getCount() { if (bmp.size() < 6) { return bmp.size() + 1; } else { return bmp.size(); } } 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; } /** * ListView Item设置 */ public View getView(int position, View convertView, ViewGroup parent) { final int sign = position; // 自定义视图 ViewHolder holder = null; if (convertView == null) { holder = new ViewHolder(); // 获取list_item布局文件的视图 convertView = listContainer.inflate( R.layout.item_published_grida, null); // 获取控件对象 holder.image = (ImageView) convertView .findViewById(R.id.item_grida_image); holder.bt = (Button) convertView .findViewById(R.id.item_grida_bt); // 设置控件集到convertView convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } if (position == bmp.size()) { holder.image.setImageBitmap(BitmapFactory.decodeResource( getResources(), R.drawable.icon_addpic_unfocused)); holder.bt.setVisibility(View.GONE); if (position == 6) { holder.image.setVisibility(View.GONE); } } else { holder.image.setImageBitmap(bmp.get(position)); holder.bt.setOnClickListener(new OnClickListener() { public void onClick(View v) { PhotoActivity.bitmap.remove(sign); bmp.get(sign).recycle(); bmp.remove(sign); drr.remove(sign); gridviewInit(); } }); } return convertView; } } public class PopupWindows extends PopupWindow { public PopupWindows(Context mContext, View parent) { View view = View .inflate(mContext, R.layout.item_popupwindows, null); view.startAnimation(AnimationUtils.loadAnimation(mContext, R.anim.fade_ins)); LinearLayout ll_popup = (LinearLayout) view .findViewById(R.id.ll_popup); // ll_popup.startAnimation(AnimationUtils.loadAnimation(mContext, // R.anim.push_bottom_in_2)); setWidth(LayoutParams.FILL_PARENT); setHeight(LayoutParams.FILL_PARENT); setBackgroundDrawable(new BitmapDrawable()); setFocusable(true); setOutsideTouchable(true); setContentView(view); showAtLocation(parent, Gravity.BOTTOM, 0, 0); update(); 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); bt1.setOnClickListener(new OnClickListener() { public void onClick(View v) { photo(); dismiss(); } }); bt2.setOnClickListener(new OnClickListener() { public void onClick(View v) { Intent i = new Intent( // 相册 Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); startActivityForResult(i, RESULT_LOAD_IMAGE); dismiss(); } }); bt3.setOnClickListener(new OnClickListener() { public void onClick(View v) { dismiss(); } }); } } private static final int TAKE_PICTURE = 0; private static final int RESULT_LOAD_IMAGE = 1; private static final int CUT_PHOTO_REQUEST_CODE = 2; private static final int SELECTIMG_SEARCH = 3; private String path = ""; private Uri photoUri; public void photo() { try { Intent openCameraIntent = new Intent( MediaStore.ACTION_IMAGE_CAPTURE); String sdcardState = Environment.getExternalStorageState(); String sdcardPathDir = android.os.Environment .getExternalStorageDirectory().getPath() + "/tempImage/"; File file = null; if (Environment.MEDIA_MOUNTED.equals(sdcardState)) { // 有sd卡,是否有myImage文件夹 File fileDir = new File(sdcardPathDir); if (!fileDir.exists()) { fileDir.mkdirs(); } // 是否有headImg文件 file = new File(sdcardPathDir + System.currentTimeMillis() + ".JPEG"); } if (file != null) { path = file.getPath(); photoUri = Uri.fromFile(file); openCameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri); startActivityForResult(openCameraIntent, TAKE_PICTURE); } } catch (Exception e) { e.printStackTrace(); } } protected void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { case TAKE_PICTURE: if (drr.size() < 6 && resultCode == -1) {// 拍照 startPhotoZoom(photoUri); } break; case RESULT_LOAD_IMAGE: if (drr.size() < 6 && resultCode == RESULT_OK && null != data) {// 相册返回 Uri uri = data.getData(); if (uri != null) { startPhotoZoom(uri); } } break; case CUT_PHOTO_REQUEST_CODE: if (resultCode == RESULT_OK && null != data) {// 裁剪返回 Bitmap bitmap = Bimp.getLoacalBitmap(drr.get(drr.size() - 1)); PhotoActivity.bitmap.add(bitmap); bitmap = Bimp.createFramedPhoto(480, 480, bitmap, (int) (dp * 1.6f)); bmp.add(bitmap); gridviewInit(); } break; case SELECTIMG_SEARCH: if (resultCode == RESULT_OK && null != data) { String text = "#" + data.getStringExtra("topic") + "#"; text = comment_content.getText().toString() + text; comment_content.setText(text); comment_content.getViewTreeObserver().addOnPreDrawListener( new OnPreDrawListener() { public boolean onPreDraw() { comment_content.setEnabled(true); // 设置光标为末尾 CharSequence cs = comment_content.getText(); if (cs instanceof Spannable) { Spannable spanText = (Spannable) cs; Selection.setSelection(spanText, cs.length()); } comment_content.getViewTreeObserver() .removeOnPreDrawListener(this); return false; } }); } break; } } private void startPhotoZoom(Uri uri) { try { // 获取系统时间 然后将裁剪后的图片保存至指定的文件夹 SimpleDateFormat sDateFormat = new SimpleDateFormat( "yyyyMMddhhmmss"); String address = sDateFormat.format(new java.util.Date()); if (!FileUtils.isFileExist("")) { FileUtils.createSDDir(""); } drr.add(FileUtils.SDPATH + address + ".JPEG"); Uri imageUri = Uri.parse("file:///sdcard/formats/" + address + ".JPEG"); final Intent intent = new Intent("com.android.camera.action.CROP"); // 照片URL地址 intent.setDataAndType(uri, "image/*"); intent.putExtra("crop", "true"); intent.putExtra("aspectX", 1); intent.putExtra("aspectY", 1); intent.putExtra("outputX", 480); intent.putExtra("outputY", 480); // 输出路径 intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri); // 输出格式 intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString()); // 不启用人脸识别 intent.putExtra("noFaceDetection", false); intent.putExtra("return-data", false); startActivityForResult(intent, CUT_PHOTO_REQUEST_CODE); } catch (IOException e) { e.printStackTrace(); } } protected void onDestroy() { FileUtils.deleteDir(FileUtils.SDPATH); FileUtils.deleteDir(FileUtils.SDPATH1); // 清理图片缓存 for (int i = 0; i < bmp.size(); i++) { bmp.get(i).recycle(); } for (int i = 0; i < PhotoActivity.bitmap.size(); i++) { PhotoActivity.bitmap.get(i).recycle(); } PhotoActivity.bitmap.clear(); bmp.clear(); drr.clear(); super.onDestroy(); } public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { ((InputMethodManager) getSystemService(INPUT_METHOD_SERVICE)) .hideSoftInputFromWindow(MainActivity.this .getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); if (arg2 == bmp.size()) { String sdcardState = Environment.getExternalStorageState(); if (Environment.MEDIA_MOUNTED.equals(sdcardState)) { new PopupWindows(MainActivity.this, gridview); } else { Toast.makeText(getApplicationContext(), "sdcard已拔出,不能选择照片", Toast.LENGTH_SHORT).show(); } } else { Intent intent = new Intent(MainActivity.this, PhotoActivity.class); intent.putExtra("ID", arg2); startActivity(intent); } }}
2. 图片压缩处理类Bimp
package com.dynamic;import java.io.BufferedInputStream;import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;import java.util.ArrayList;import java.util.List;import android.app.Activity;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.PorterDuff;import android.graphics.PorterDuffXfermode;import android.graphics.RectF;import android.graphics.drawable.BitmapDrawable;import android.graphics.drawable.Drawable;import android.provider.ContactsContract.Contacts.Photo;/** * 压缩图片 * * @author Administrator * */public class Bimp { public static int max = 0; public static boolean act_bool = true; public static List bmp = new ArrayList(); // 图片sd地址 上传服务器时把图片调用下面方法压缩后 保存到临时文件夹 图片压缩后小于100KB,失真度不明显 public static List drr = new ArrayList(); // TelephonyManager tm = (TelephonyManager) this // .getSystemService(Context.TELEPHONY_SERVICE); public static Bitmap revitionImageSize(String path) throws IOException { BufferedInputStream in = new BufferedInputStream(new FileInputStream( new File(path))); BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; // Bitmap btBitmap=BitmapFactory.decodeFile(path); // System.out.println("原尺寸高度:"+btBitmap.getHeight()); // System.out.println("原尺寸宽度:"+btBitmap.getWidth()); BitmapFactory.decodeStream(in, null, options); in.close(); int i = 0; Bitmap bitmap = null; while (true) { if ((options.outWidth >> i <= 800) && (options.outHeight >> i <= 800)) { in = new BufferedInputStream( new FileInputStream(new File(path))); options.inSampleSize = (int) Math.pow(2.0D, i); options.inJustDecodeBounds = false; bitmap = BitmapFactory.decodeStream(in, null, options); break; } i += 1; } // 当机型为三星时图片翻转// bitmap = Photo.photoAdapter(path, bitmap);// System.out.println("-----压缩后尺寸高度:" + bitmap.getHeight());// System.out.println("-----压缩后尺寸宽度度:" + bitmap.getWidth()); return bitmap; } public static Bitmap getLoacalBitmap(String url) { try { FileInputStream fis = new FileInputStream(url); return BitmapFactory.decodeStream(fis); // /把流转化为Bitmap图片 } catch (FileNotFoundException e) { e.printStackTrace(); return null; } } /** * * @param x * 图像的宽度 * @param y * 图像的高度 * @param image * 源图片 * @param outerRadiusRat * 圆角的大小 * @return 圆角图片 */ public static Bitmap createFramedPhoto(int x, int y, Bitmap image, float outerRadiusRat) { // 根据源文件新建一个darwable对象 Drawable imageDrawable = new BitmapDrawable(image); // 新建一个新的输出图片 Bitmap output = Bitmap.createBitmap(x, y, Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(output); // 新建一个矩形 RectF outerRect = new RectF(0, 0, x, y); // 产生一个红色的圆角矩形 Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); paint.setColor(Color.RED); canvas.drawRoundRect(outerRect, outerRadiusRat, outerRadiusRat, paint); // 将源图片绘制到这个圆角矩形上 paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); imageDrawable.setBounds(0, 0, x, y); canvas.saveLayer(outerRect, paint, Canvas.ALL_SAVE_FLAG); imageDrawable.draw(canvas); canvas.restore(); return output; }}
4. 文件处理类FileUtils
package com.dynamic;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import android.graphics.Bitmap;import android.os.Environment;import android.util.Log;public class FileUtils { public static String SDPATH = Environment.getExternalStorageDirectory() + "/formats/"; public static String SDPATH1 = Environment.getExternalStorageDirectory() + "/myimages/"; public static void saveBitmap(Bitmap bm, String picName) { Log.e("", "保存图片"); try { if (!isFileExist("")) { File tempf = createSDDir(""); } File f = new File(SDPATH, picName + ".JPEG"); if (f.exists()) { f.delete(); } FileOutputStream out = new FileOutputStream(f); bm.compress(Bitmap.CompressFormat.JPEG, 90, out); out.flush(); out.close(); Log.e("", "已经保存"); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } public static File createSDDir(String dirName) throws IOException { File dir = new File(SDPATH + dirName); if (Environment.getExternalStorageState().equals( Environment.MEDIA_MOUNTED)) { System.out.println("createSDDir:" + dir.getAbsolutePath()); System.out.println("createSDDir:" + dir.mkdir()); } return dir; } public static boolean isFileExist(String fileName) { File file = new File(SDPATH + fileName); file.isFile(); return file.exists(); } public static void delFile(String fileName){ File file = new File(SDPATH + fileName); if(file.isFile()){ file.delete(); } file.exists(); } public static void deleteDir(String path) { File dir = new File(path); if (dir == null || !dir.exists() || !dir.isDirectory()) return; for (File file : dir.listFiles()) { if (file.isFile()) file.delete(); // 删除所有文件 else if (file.isDirectory()) deleteDir(path); // 递规的方式删除文件夹 } dir.delete();// 删除目录本身 } public static boolean fileIsExists(String path) { try { File f = new File(path); if (!f.exists()) { return false; } } catch (Exception e) { return false; } return true; }}
4. 图片选择类PhotoActivity
package com.dynamic;import java.util.ArrayList;import java.util.List;import android.app.Activity;import android.content.Intent;import android.graphics.Bitmap;import android.os.Bundle;import android.support.v4.view.PagerAdapter;import android.support.v4.view.ViewPager;import android.support.v4.view.ViewPager.OnPageChangeListener;import android.view.View;import android.view.ViewGroup.LayoutParams;import android.widget.Button;import android.widget.ImageView;import android.widget.RelativeLayout;public class PhotoActivity extends Activity { private ArrayList listViews = null; private ViewPager pager; private MyPageAdapter adapter; public static List bitmap = new ArrayList(); public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_photo); pager = (ViewPager) findViewById(R.id.viewpager); pager.setOnPageChangeListener(pageChangeListener); for (int i = 0; i < bitmap.size(); i++) { initListViews(bitmap.get(i));// } adapter = new MyPageAdapter(listViews);// 构造adapter pager.setAdapter(adapter);// 设置适配器 Intent intent = getIntent(); int id = intent.getIntExtra("ID", 0); pager.setCurrentItem(id); } private void initListViews(Bitmap bm) { if (listViews == null) listViews = new ArrayList(); ImageView img = new ImageView(this);// 构造textView对象 img.setBackgroundColor(0xff000000); img.setImageBitmap(bm); img.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); listViews.add(img);// 添加view } private OnPageChangeListener pageChangeListener = new OnPageChangeListener() { public void onPageSelected(int arg0) {// 页面选择响应函数 // count = arg0; } public void onPageScrolled(int arg0, float arg1, int arg2) {// 滑动中。。。 } public void onPageScrollStateChanged(int arg0) {// 滑动状态改变 } }; class MyPageAdapter extends PagerAdapter { private ArrayList listViews;// content private int size;// 页数 public MyPageAdapter(ArrayList listViews) {// 构造函数 // 初始化viewpager的时候给的一个页面 this.listViews = listViews; size = listViews == null ? 0 : listViews.size(); } public void setListViews(ArrayList listViews) {// 自己写的一个方法用来添加数据 this.listViews = listViews; size = listViews == null ? 0 : listViews.size(); } public int getCount() {// 返回数量 return size; } public int getItemPosition(Object object) { return POSITION_NONE; } public void destroyItem(View arg0, int arg1, Object arg2) {// 销毁view对象 ((ViewPager) arg0).removeView(listViews.get(arg1 % size)); } public void finishUpdate(View arg0) { } public Object instantiateItem(View arg0, int arg1) {// 返回view对象 try { ((ViewPager) arg0).addView(listViews.get(arg1 % size), 0); } catch (Exception e) { } return listViews.get(arg1 % size); } public boolean isViewFromObject(View arg0, Object arg1) { return arg0 == arg1; } }}
代码下载
更多相关文章
- android asset中 zip包解压sdcard
- 新浪微博Oauth2.0授权认证及SDK、API的使用(Android)
- Android(安卓)APN的设置问题:默认“已起用数据”关闭
- android 连接webservice
- Android(安卓)JNI入门第三篇――jni头文件分析
- android源码编译出现No private recovery resources for TARGET_
- Android_查看linux内核版本和android文件系统版本
- android IApplicationToken分析
- android学习资料与资源记录