android仿微信图片选择器

写一个关于

android仿微信图片选择器
选取多张照片然后处理这些照片,上传过服务端等!中间有一些定位获取当前地址的功能,小伙伴们应该可以看出来吧!不需要的,直接过滤掉就行了!获取到图片后,本文章对图片进行处理,因为服务器需要转成Base64,这个过程我就没贴出来,需要的小伙伴评论说出我给你贴出来喽,很简单,就一个方法!

进入相册选择图片以GridView显示在界面上

item_dynamic布局  这里我只取了GrideView,

1、布局layout中使用GridView

<GridView
    android:id="@+id/gridView1"
    android:layout_width="fill_parent"
    android:layout_height="100dp"
    android:background="#FFFFFF"
    android:columnWidth="90dp"
    android:gravity="center"
    android:horizontalSpacing="5dp"
    android:numColumns="4"
    android:padding="8dp"
    android:stretchMode="columnWidth"
    android:verticalSpacing="5dp" 
>
</GridView>

 

2、Activity界面代码


import android.Manifest;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.CursorLoader;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.media.MediaMetadataRetriever;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.provider.MediaStore;
import android.support.annotation.Nullable;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.EditText;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
import list.test.wwy.com.myapplication.R;
import list.test.wwy.com.myapplication.adapter.SubmitAdapter;
import list.test.wwy.com.myapplication.util.Util;


/**
 * Created by wwy on 2017/9/14.
 */

public class InDynamicActivity  extends BaseActivity  implements View.OnClickListener, RequestUtilPargnacyRecord.DataInfoListener {
private List<Bitmap> data = new ArrayList<Bitmap>();
private GridView mGridView;
private SubmitAdapter adapter;
private String photoPath;
private List<String> imgList = new ArrayList<>();
private static final int REQUEST_PICK = 101; // 需要



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.item_dynamic);
        

// 设置默认图片为加号,即点击此图片可以进入相册  add_photo 为默认的一个图片添加的图
Bitmap bp = BitmapFactory.decodeResource(getResources(), R.mipmap.add_photo);
data.add(bp);
// ID
mGridView = (GridView) findViewById(R.id.gridview);
initOclick();
// 绑定Adapter adapter = new SubmitAdapter(getApplicationContext(), data, mGridView, 4); mGridView.setAdapter( adapter);
    }
private void initOclick() {
        // 设置点击监听事件
        mGridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                if (data.size() == 5) {
                    Toast.makeText(this, "图片已满4张", Toast.LENGTH_SHORT).show();
                } else {
                    if (position == data.size() - 1) {
                        // 选择图片
                        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
                            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},1);
                        }

                        Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                        startActivityForResult(Intent.createChooser(intent, "请选择图片"), REQUEST_PICK);
                    } else {
//                        Toast.makeText(InDynamicActivity.this, "点击第" + (position + 1) + " 号图片", Toast.LENGTH_SHORT).show();
                    }
                }
            }
        });
        // 设置长按事件
        mGridView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {

            @Override
            public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
                if (position != data.size()-1){
                    dialog(position);
                }

                return true;
            }
        });
    }



  
/*
 * Dialog对话框提示用户删除操作 position为删除图片位置
 */
protected void dialog(final int position) {
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setMessage("确认移除已添加图片吗?");
    builder.setTitle("提示");
    builder.setPositiveButton("确认", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            dialog.dismiss();
            data.remove(position);
            adapter.notifyDataSetChanged();
        }
    });
    builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            dialog.dismiss();
        }
    });
    builder.create().show();
}

// 响应startActivityForResult,获取图片路径
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent datas) {
    if (requestCode == REQUEST_PICK && resultCode == RESULT_OK) {
        if (datas != null) {
            try {
                Uri uri = datas.getData();
                // 这里开始的第二部分,获取图片的路径:
                String[] proj = { MediaStore.Images.Media.DATA };
                Cursor cursor = null;
                if (Build.VERSION.SDK_INT < 11){
                    cursor = managedQuery(uri, proj, null, null, null);
                }else {
                    CursorLoader cursorLoader = new CursorLoader(this, uri, proj, null, null, null);
                    cursor = cursorLoader.loadInBackground();
                }
                // 这个是获得用户选择的图片的索引值
                int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
                cursor.moveToFirst();
                // 最后根据索引值获取图片路径
                photoPath = cursor.getString(column_index);
                if (!photoPath.equals("") || photoPath != null){
                    imgList.add(photoPath);
                }
                Log.i("photoPath","-----str--------->路径  " + photoPath);
                Log.i("photoPath","----uri---------->路径  " + Uri.parse(photoPath));
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

}

@Override
    protected void onResume() {
        super.onResume();
        Log.i("photoPath","-------------->  运行到这里");
        if (!TextUtils.isEmpty(photoPath)) {
            Bitmap newBp = Util.decodeSampledBitmapFromFd(photoPath, 300, 300);
            data.remove(data.size() - 1);
//            bg2.setImageBitmap(newBp);
            Bitmap bp = BitmapFactory.decodeResource(getResources(), R.mipmap.add_photo);
            data.add(newBp);
            data.add(bp);
            //将路径设置为空,防止在手机休眠后返回Activity调用此方法时添加照片
            photoPath = null;
            adapter.notifyDataSetChanged();
            if (data.size() == 5){
                data.remove(data.size() - 1);
            }
        }

    }


    }

    注:上面部分代码的封装方法:

 
decodeSampledBitmapFromFd(photoPath, 300, 300)
 
public static Bitmap decodeSampledBitmapFromFd(String pathName, int reqWidth, int reqHeight) {
    final BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;
    BitmapFactory.decodeFile(pathName, options);
    options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);
    options.inJustDecodeBounds = false;
    //避免出现内存溢出的情况,进行相应的属性设置。
    options.inPreferredConfig = Bitmap.Config.RGB_565;
    options.inDither = true;
    Bitmap src = BitmapFactory.decodeFile(pathName, options);
    return src;
}
calculateInSampleSize(options, reqWidth, reqHeight) 如下:
 
private static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) {
    final int height = options.outHeight;
    final int width = options.outWidth;
    int inSampleSize = 1;
    if (height > reqHeight || width > reqWidth) {
        final int halfHeight = height / 2;
        final int halfWidth = width / 2;
        while ((halfHeight / inSampleSize) > reqHeight && (halfWidth / inSampleSize) > reqWidth) {
            inSampleSize *= 2;
        }
    }
    return inSampleSize;
}

介绍:上面包括主要的显示照片列表的,还有其它的,如:定位当前位置的经纬度和详细地址,用不到的话直接去掉不影响其它的,

3、适配器Adapter


import java.util.List;
import android.content.Context;
import android.graphics.Bitmap;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.ImageView.ScaleType;
import android.widget.LinearLayout.LayoutParams;
import android.widget.RelativeLayout;
import com.health.gw.healthhandbook.R;

public class SubmitAdapter extends BaseAdapter {

private Context context;
private List<Bitmap> data;
private LayoutInflater inflater;
private GridView mGridView;
private int gridViewH;
private int imageViewH;
private int number;


    public SubmitAdapter(Context context, List<Bitmap> data, GridView mGridView) {
this.context = context;
this.data = data;
this.mGridView = mGridView;
this.number = number;
inflater = LayoutInflater.from(context);
LayoutParams params = (LayoutParams) mGridView.getLayoutParams();
gridViewH = params.height;
   }

   @Override
    public int getCount() {
       return data.size();
   }

   @Override
    public Object getItem( int position) {
       return data.get(position);
   }

   @Override
    public long getItemId( int position) {
       return position;
   }

   @Override
    public View getView( int position, View convertView, ViewGroup parent) {
      Holder holder;
       if (convertView ==  null) {
         convertView =  inflater.inflate(R.layout.griditem,  null);
         holder =  new Holder();
         holder. imageView = (ImageView) convertView.findViewById(R.id.imageView1);
         // 获取到ImageView的显示高度
         RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) holder. imageView
               
.getLayoutParams();
          imageViewH = params. height;
         convertView.setTag(holder);
      }  else {
         setGridView(); //  注意加上,此方法是让选择回来的图片按照正方形显示,一排显示4个
         holder = (Holder) convertView.getTag();
      }

      // 绑定图片原始尺寸,方便以后应用
      holder. imageView.setScaleType(ScaleType. CENTER_CROP);

int[] parameter = { 300, 300 };
holder.imageView.setTag(parameter);
holder.imageView.setImageBitmap(data.get(position));
return convertView;

   }

private void setGridView() {
    LayoutParams lp = (LayoutParams) mGridView.getLayoutParams();
    if (number == 4){
        if (data.size() < 4) {
            lp.height = gridViewH;
        }
    }
    if (number == 8){
        if (data.size() < 4) {
            lp.height = gridViewH;
        } else if (data.size() < number) {
            lp.height = gridViewH * 2 - (gridViewH - imageViewH) / 2;
        } else {
            lp.height = gridViewH * 3 - (gridViewH - imageViewH);
        }
    }

    mGridView.setLayoutParams(lp);
}


class Holder {
    private ImageView imageView;
}


}

上面的适配器全部都需要,

 

 

4、上面还需要一个子布局

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="80dp"
    android:layout_height="80dp"
    android:descendantFocusability="blocksDescendants"
    android:gravity="center" 
>

    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="80dp"
        android:layout_height="80dp"
        android:scaleType="centerCrop"
        android:src="@mipmap/newadd" 
/>

</RelativeLayout>

下面几张图片是我的运行图,上面代码我是把图片部分给抽离出来了,主要看效果就行了!

以上就是全部了!小伙伴们有哪里不明白的,可以留言哦!下面是我的样式,不过在上面代码中把除了图片部分其他的代码删除了,因为不是重点吗!!对吧,,哈哈哈哈,,,,今天就到这里了!!!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值