200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > 安卓九宫格上传图片(微信朋友圈 QQ动态)小demo

安卓九宫格上传图片(微信朋友圈 QQ动态)小demo

时间:2021-04-25 10:05:55

相关推荐

安卓九宫格上传图片(微信朋友圈 QQ动态)小demo

文章目录

实现思路MainActivity.javaNineGridAdapter.java回调onAddPicturesListener.javaitem布局加号图标item显示图片

实现思路

实现起来其实非常简单

我利用recyclerview工具,多item布局,在layoutmanager中设置三个一行,利用回调方法监听添加图片的方法

并设置list的添加顺序使得加号始终处于最后一个。然后限制list最大长度为9,使得加载最多为9张图片

下面直接把代码放上

MainActivity.java

package com.example.ninegriddemo;import androidx.annotation.Nullable;import androidx.annotation.RequiresApi;import androidx.appcompat.app.AppCompatActivity;import androidx.loader.content.CursorLoader;import androidx.recyclerview.widget.GridLayoutManager;import androidx.recyclerview.widget.RecyclerView;import android.annotation.SuppressLint;import android.content.Context;import android.content.Intent;import android.content.SharedPreferences;import android.database.Cursor;import android.graphics.Bitmap;import .Uri;import android.os.Build;import android.os.Bundle;import android.os.Environment;import android.os.Looper;import android.os.StrictMode;import android.provider.DocumentsContract;import android.provider.MediaStore;import android.util.Log;import android.widget.Toast;import com.google.gson.Gson;import java.io.File;import java.io.FileNotFoundException;import java.io.IOException;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;public class MainActivity extends AppCompatActivity {private RecyclerView recyclerView;private NineGridAdapter nineGridAdapter;private Uri photoUri; //相机拍照返回图片路径private File outputImage;private static final int GET_BACKGROUND_FROM_CAPTURE_RESOULT = 1;private static final int RESULT_REQUEST_CODE = 2;private static final int TAKE_PHOTO = 3;final List<Map<String,Object>> list = new ArrayList<>();private void selectCamera() {//创建file对象,用于存储拍照后的图片,这也是拍照成功后的照片路径outputImage = new File(this.getExternalCacheDir(), "camera_photos.jpg");try {//判断文件是否存在,存在删除,不存在创建if (outputImage.exists()) {outputImage.delete();}outputImage.createNewFile();} catch (IOException e) {e.printStackTrace();}photoUri = Uri.fromFile(outputImage);Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);intent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);startActivityForResult(intent, TAKE_PHOTO);}public static final String STR_IMAGE = "image/*";//选择相册private void selectPhoto(){Intent intent = new Intent(Intent.ACTION_PICK, null);intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, STR_IMAGE);startActivityForResult(intent, GET_BACKGROUND_FROM_CAPTURE_RESOULT);}@Overrideprotected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {super.onActivityResult(requestCode, resultCode, data);if (resultCode != RESULT_OK) return;switch (requestCode) {case RESULT_REQUEST_CODE: //相册返回final String selectPhoto = getRealPathFromUri(this,cropImgUri);int size=list.size();list.remove(size-1);Map<String,Object> map=new HashMap<>();map.put("type",1);map.put("uri",photoUri);list.add(map);if(list.size()!=9) {Map<String, Object> map1 = new HashMap<>();map1.put("type", 1);list.add(map1);}nineGridAdapter.notifyDataSetChanged();break;case TAKE_PHOTO:// 拍照返回cropRawPhoto(photoUri);break;case GET_BACKGROUND_FROM_CAPTURE_RESOULT:photoUri = data.getData();cropRawPhoto(photoUri);}}private Uri cropImgUri;public void cropRawPhoto(Uri uri) {//创建file文件,用于存储剪裁后的照片File cropImage = new File(Environment.getExternalStorageDirectory(), "crop_image.jpg");String path = cropImage.getAbsolutePath();try {if (cropImage.exists()) {cropImage.delete();}cropImage.createNewFile();} catch (IOException e) {e.printStackTrace();}cropImgUri = Uri.fromFile(cropImage);Intent intent = new Intent("com.android.camera.action.CROP");//设置源地址uriintent.setDataAndType(photoUri, "image/*");intent.putExtra("crop", "true");intent.putExtra("aspectX", 200);intent.putExtra("aspectY", 200);intent.putExtra("outputX", 200);intent.putExtra("outputY", 200);intent.putExtra("scale", true);//设置目的地址uriintent.putExtra(MediaStore.EXTRA_OUTPUT, cropImgUri);//设置图片格式intent.putExtra("outputFormat", pressFormat.JPEG.toString());intent.putExtra("return-data", false);intent.putExtra("noFaceDetection", true); // no face detectionstartActivityForResult(intent, RESULT_REQUEST_CODE);}public static String getRealPathFromUri(Context context, Uri uri) {if(context == null || uri == null) {return null;}if("file".equalsIgnoreCase(uri.getScheme())) {return getRealPathFromUri_Byfile(context,uri);} else if("content".equalsIgnoreCase(uri.getScheme())) {return getRealPathFromUri_Api11To18(context,uri);}// int sdkVersion = Build.VERSION.SDK_INT;// if (sdkVersion < 11) {// // SDK < Api11// return getRealPathFromUri_BelowApi11(context, uri);// }// // SDK > 19return getRealPathFromUri_AboveApi19(context, uri);//没用到}private static String getRealPathFromUri_Byfile(Context context,Uri uri){String uri2Str = uri.toString();String filePath = uri2Str.substring(uri2Str.indexOf(":") + 3);return filePath;}@SuppressLint("NewApi")private static String getRealPathFromUri_AboveApi19(Context context, Uri uri) {String filePath = null;String wholeID = null;wholeID = DocumentsContract.getDocumentId(uri);// 使用':'分割String id = wholeID.split(":")[1];String[] projection = {MediaStore.Images.Media.DATA };String selection = MediaStore.Images.Media._ID + "=?";String[] selectionArgs = {id };Cursor cursor = context.getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, projection,selection, selectionArgs, null);int columnIndex = cursor.getColumnIndex(projection[0]);if (cursor.moveToFirst()) {filePath = cursor.getString(columnIndex);}cursor.close();return filePath;}/*** //适配api11-api18,根据uri获取图片的绝对路径。* 针对图片URI格式为Uri:: content://media/external/images/media/1028*/private static String getRealPathFromUri_Api11To18(Context context, Uri uri) {String filePath = null;String[] projection = {MediaStore.Images.Media.DATA };CursorLoader loader = new CursorLoader(context, uri, projection, null,null, null);Cursor cursor = loader.loadInBackground();if (cursor != null) {cursor.moveToFirst();filePath = cursor.getString(cursor.getColumnIndex(projection[0]));cursor.close();}return filePath;}/*** 适配api11以下(不包括api11),根据uri获取图片的绝对路径*/private static String getRealPathFromUri_BelowApi11(Context context, Uri uri) {String filePath = null;String[] projection = {MediaStore.Images.Media.DATA };Cursor cursor = context.getContentResolver().query(uri, projection,null, null, null);if (cursor != null) {cursor.moveToFirst();filePath = cursor.getString(cursor.getColumnIndex(projection[0]));cursor.close();}return filePath;}@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Map<String,Object> map=new HashMap<>();map.put("type",1);list.add(map);nineGridAdapter=new NineGridAdapter(MainActivity.this,list);recyclerView=findViewById(R.id.re1);StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();StrictMode.setVmPolicy(builder.build());builder.detectFileUriExposure();}@Overrideprotected void onStart() {super.onStart();recyclerView.setAdapter(nineGridAdapter);GridLayoutManager manager=new GridLayoutManager(this,3);recyclerView.setLayoutManager(manager);nineGridAdapter.setOnAddPicturesListener(new OnAddPicturesListener() {@Overridepublic void onAdd() {selectPhoto();}});}}

NineGridAdapter.java

package com.example.ninegriddemo;import android.annotation.SuppressLint;import android.content.Context;import android.content.Intent;import android.content.SharedPreferences;import android.database.Cursor;import android.graphics.Bitmap;import .Uri;import android.os.Environment;import android.os.Looper;import android.provider.DocumentsContract;import android.provider.MediaStore;import android.util.Log;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.ImageView;import android.widget.RelativeLayout;import android.widget.Toast;import androidx.annotation.NonNull;import androidx.annotation.Nullable;import androidx.loader.content.CursorLoader;import androidx.recyclerview.widget.RecyclerView;import com.bumptech.glide.Glide;import com.google.gson.Gson;import java.io.File;import java.io.FileNotFoundException;import java.io.IOException;import java.util.List;import java.util.Map;public class NineGridAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {OnAddPicturesListener listener;private MainActivity context;private List<Map<String,Object>> list;private View inflater;private static final int no = 0;private static final int yes = 1;public NineGridAdapter(MainActivity context, List<Map<String,Object>> list){this.context = context;this.list = list;}@Overridepublic int getItemViewType(int position) {int size=list.get(position).size();if(size==1){return no;}else{return yes;}}@NonNull@Overridepublic RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {if(viewType==no){inflater= LayoutInflater.from(context).inflate(R.layout.item_add,parent,false);RecyclerView.ViewHolder ViewHolder = new NineGridAdapter.ViewHolder(inflater);return ViewHolder;}else{inflater= LayoutInflater.from(context).inflate(R.layout.item_show,parent,false);RecyclerView.ViewHolder showHolder=new NineGridAdapter.showHolder(inflater);return showHolder;}}@Overridepublic void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {int viewType=getItemViewType(position);if(viewType==no){ViewHolder viewHolder = (ViewHolder) holder;viewHolder.add_Image.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {listener.onAdd();}});}else if(viewType==yes){showHolder showHolder=(NineGridAdapter.showHolder)holder;Glide.with(context).load(list.get(position).get("uri")).into(showHolder.show_image);}else{}}@Overridepublic int getItemCount() {return list.size();}class ViewHolder extends RecyclerView.ViewHolder {RelativeLayout add_Image;public ViewHolder(@NonNull View itemView) {super(itemView);add_Image=itemView.findViewById(R.id.add_newsImage);}}class showHolder extends RecyclerView.ViewHolder{ImageView show_image;public showHolder(@NonNull View itemView) {super(itemView);show_image=itemView.findViewById(R.id.show_newsImage);}}public void setOnAddPicturesListener(OnAddPicturesListener listener) {this.listener = listener;}private class PicturesClickListener implements View.OnClickListener {int position;public PicturesClickListener(int position) {this.position = position;}@Overridepublic void onClick(View view) {switch (view.getId()) {case R.id.add_newsImage://点击添加按钮if (listener != null)listener.onAdd();break;}}}}

回调onAddPicturesListener.java

package com.example.ninegriddemo;public interface OnAddPicturesListener {void onAdd();}

item布局加号图标

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="/apk/res/android"android:layout_width="match_parent"android:layout_height="100dp"><RelativeLayoutandroid:id="@+id/add_newsImage"android:layout_marginLeft="20dp"android:layout_marginRight="20dp"android:layout_marginTop="10dp"android:layout_width="100dp"android:layout_height="100dp"android:background="#F2F2F2"><ImageViewandroid:layout_width="70dp"android:layout_height="70dp"android:src="@drawable/nine"android:layout_centerInParent="true"></ImageView></RelativeLayout></LinearLayout>

item显示图片

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="/apk/res/android"android:layout_width="match_parent"android:layout_height="100dp"><ImageViewandroid:id="@+id/show_newsImage"android:layout_marginLeft="20dp"android:layout_marginRight="20dp"android:layout_marginTop="10dp"android:layout_width="100dp"android:layout_height="100dp"android:background="#F2F2F2"></ImageView></LinearLayout>

想要源码的可以私信我

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。