选择相册上传图片 展示图片(仿微信选择图片)

前言

之前也一直想整理一个关于相册的选择啊,图片的上传啊,展示啊,真好前段时间项目需要,于是整理了下(因为上一个项目写的比较匆忙,所以比较乱)项目刚上线就想着写个博客记录一下


先来几张效果图qaq

这里写图片描述

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

就是这几个界面了, 大致的思路就是获取手机的图片,选择 返回选择的路径(拍照

也差不多拿到路径就好)然后展示上传就好,下面贴一下主要代码。

开始选择的类,也就是上传的类

public class AttachFileNewActivity extends BaseHeaderActivity {

    @BindView(R.id.noScrollgridview)
    GridView noScrollgridview;
    ArrayList<String> arrayList;
    AttachFileNewAdapter fileNewAdapter;

    final String mKey = "mSelectedImage";
    final String mKeyReturn = "ViewBigImageActivity";
    final String mKeyFileis = "AttachFileActivityIs";
    final String mKeyFileNew = "AttachFileNewActivity";
    String RelationRecordCode;
    int isFile;

    @Override
    protected int getLayoutId() {
        return R.layout.activity_attachfilenew;
    }

    @Override
    protected void initView() {
        mTitle.setText(R.string.NewAccessoryManagement);
        mAction.setText(R.string.btn_Determine);
        arrayList = new ArrayList<>();
        if (getIntent().getStringExtra(mKeyFileNew) != null) {
            RelationRecordCode = getIntent().getStringExtra(mKeyFileNew);
            isFile = getIntent().getIntExtra(mKeyFileis, 0);
        }
        fileNewAdapter = new AttachFileNewAdapter(this, arrayList);
        noScrollgridview.setAdapter(fileNewAdapter);
    }

    @Override
    public void initListener() {
        noScrollgridview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int i, long id) {
                if (i == arrayList.size()) {
                    ActionSheetDialog();
                } else {
                    Bundle bundle = new Bundle();
                    bundle.putInt("selet", 2);// 2,大图显示当前页数,1,头像,不显示页数
                    bundle.putInt("code", i);//第几张
                    bundle.putSerializable("imageuri", arrayList);
                    bundle.putBoolean("isLocal", true);
                    Intent intent = new Intent(AttachFileNewActivity.this, ViewBigImageActivity.class);
                    intent.putExtras(bundle);
                    jumpToActivityForResult(intent, 13);
                }
            }
        });
        mAction.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (arrayList.size() != 0) initHttpPostFile();
                else APP.mToast(R.string.mustOne);
            }
        });
    }

    private void initHttpPostFile() {
        shouCustomProgressDialog("");
        File[] mFile = new File[arrayList.size()];
        String[] mS = new String[arrayList.size()];
        for (int i = 0; i < arrayList.size(); i++) {
            File f = new File(arrayList.get(i));
            mFile[i] = f;
            mS[i] = "file" + i;
        }
        String[] parameter = new String[1];
        switch (isFile) {
            case 1:
                parameter = new String[]{"AccountCode", "CustomerCode"};
                break;
            case 2:
                parameter = new String[]{"AccountCode", "RelationRecordCode"};
                break;
            case 3:
                parameter = new String[]{"AccountCode", "ContactCode"};
                break;
        }

        String[] content = new String[]{StringCrypto.EncodeString(APP.UserInfo.getAccountCode(), U.mKey), StringCrypto.EncodeString(RelationRecordCode, U.mKey)};
        HttpPost.LoginAddFile(U.uploadPhoto(isFile), mFile, mS, parameter, content, new OnLoginListener() {
            @Override
            public void loginSuccess(String response, int id) {
                boolean status = false;
                try {
                    JSONObject jsonob = new JSONObject(response);
                    status = jsonob.optBoolean("status");
                } catch (JSONException e) {
                    e.printStackTrace();
                    dissmisToast(UiUtils.getString(R.string.OkhttpDataError));
                    return;
                }
                if (status) {
                    dissmisToast(UiUtils.getString(R.string.uploadPhotoSuccess));
                    finish();
                } else {
                    dissmisToast(UiUtils.getString(R.string.uploadPhotoError));
                }
            }

            @Override
            public void loginError(Call call, Exception e, int id) {
                dissmisToast(UiUtils.getString(R.string.OkhttpError));
            }
        });
    }

    private void ActionSheetDialog() {
        new ActionSheetDialog(this)
                .builder()
                .setCancelable(false)
                .setCanceledOnTouchOutside(false)
                .addSheetItem("选择相册", SheetItemColor.Blue,
                        new OnSheetItemClickListener() {
                            @Override
                            public void onClick(int which) {
                                jumpToActivityForResult(AlbumActivity.class, 13);
                            }
                        })
                .addSheetItem("拍照", SheetItemColor.Blue,
                        new OnSheetItemClickListener() {
                            @Override
                            public void onClick(int which) {
                                takePhoto();
                            }
                        }).show();
    }

    private String path = "";

    /**
     * 拍照
     */
    public void takePhoto() {
        Intent openCameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        File vFile = new File(Environment.getExternalStorageDirectory()
                + "/顶易手机端/附件/", String.valueOf(System
                .currentTimeMillis()) + ".jpg");
        if (!vFile.exists()) {
            File vDirPath = vFile.getParentFile();
            vDirPath.mkdirs();
        } else {
            if (vFile.exists()) {
                vFile.delete();
            }
        }
        path = vFile.getPath();
        Uri cameraUri = Uri.fromFile(vFile);
        openCameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, cameraUri);
        startActivityForResult(openCameraIntent, 13);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == 13 && resultCode == 33) {
            List<String> array = data.getStringArrayListExtra(mKey);
            if (array != null) {
                arrayList.addAll(array);
                fileNewAdapter.setUpdate(arrayList);
            }
        } else if (requestCode == 13 && resultCode == 150) {
            ArrayList<String> array = data.getStringArrayListExtra(mKeyReturn);
            arrayList.clear();
            arrayList.addAll(array);
            fileNewAdapter.setUpdate(arrayList);
        } else if (requestCode == 13 && resultCode == -1 && !TextUtils.isEmpty(path)) {
            arrayList.add(path);// 在添加拍照的。一共显示的是选中加拍照的
            fileNewAdapter.setUpdate(arrayList);
        }
    }
}

由于我项目里有三个的附件管理,所以我上传的地方做了判断

下面是获取相册类,参照的是洪洋博客的

public class AlbumActivity extends BaseHeaderActivity implements ListImageDirPopupWindow.OnImageDirSelected{


    private ProgressDialog mProgressDialog;

    /**
     * 存储文件夹中的图片数量
     */
    private int mPicsSize;
    /**
     * 图片数量最多的文件夹
     */
    private File mImgDir;
    /**
     * 所有的图片
     */
    private List<String> mImgs;

    private GridView mGirdView;
    private AlbumAdapter mAdapter;
    /**
     * 临时的辅助类,用于防止同一个文件夹的多次扫描
     */
    private HashSet<String> mDirPaths = new HashSet<String>();

    /**
     * 扫描拿到所有的图片文件夹
     */
    private List<ImageFloder> mImageFloders = new ArrayList<ImageFloder>();

    private RelativeLayout mBottomLy;

    private TextView mChooseDir;
    private TextView mImageCount;
    int totalCount = 0;

    private int mScreenHeight;

    private ListImageDirPopupWindow mListImageDirPopupWindow;

    private Handler mHandler = new Handler() {
        public void handleMessage(Message msg) {
            mProgressDialog.dismiss();
            // 为View绑定数据
            data2View();
            // 初始化展示文件夹的popupWindw
            initListDirPopupWindw();
        }
    };


    @Override
    protected int getLayoutId() {
        return R.layout.activity_album;
    }


    /**
     * 为View绑定数据
     */
    private void data2View() {
        if (mImgDir == null) {
            Toast.makeText(getApplicationContext(), "擦,一张图片没扫描到",
                    Toast.LENGTH_SHORT).show();
            return;
        }
        mImgs = Arrays.asList(mImgDir.list());
        /**
         * 可以看到文件夹的路径和图片的路径分开保存,极大的减少了内存的消耗;
         */
        mAdapter = new AlbumAdapter(this, mImgs,
                R.layout.grid_item, mImgDir.getAbsolutePath());
        mAdapter.setAlbumAdapterRe(new AlbumAdapter.AlbumAdapterRe() {
            @Override
            public void ResultsetImageCount(List<String> arrayList) {
                setImageCount(arrayList);
            }
        });
        mGirdView.setAdapter(mAdapter);
        mImageCount.setText(totalCount + "张");
    }

    /**
     * 初始化展示文件夹的popupWindw
     */
    private void initListDirPopupWindw() {
        mListImageDirPopupWindow = new ListImageDirPopupWindow(
                ViewGroup.LayoutParams.MATCH_PARENT, (int) (mScreenHeight * 0.7),
                mImageFloders, LayoutInflater.from(getApplicationContext())
                .inflate(R.layout.list_dir, null));

        mListImageDirPopupWindow.setOnDismissListener(new PopupWindow.OnDismissListener() {

            @Override
            public void onDismiss() {
                // 设置背景颜色变暗
                WindowManager.LayoutParams lp = getWindow().getAttributes();
                lp.alpha = 1.0f;
                getWindow().setAttributes(lp);
            }
        });
        // 设置选择文件夹的回调
        mListImageDirPopupWindow.setOnImageDirSelected(this);
    }

    /**
     * 利用ContentProvider扫描手机中的图片,此方法在运行在子线程中 完成图片的扫描,最终获得jpg最多的那个文件夹
     */
    private void getImages() {
        if (!Environment.getExternalStorageState().equals(
                Environment.MEDIA_MOUNTED)) {
            Toast.makeText(this, "暂无外部存储", Toast.LENGTH_SHORT).show();
            return;
        }
        // 显示进度条
        mProgressDialog = ProgressDialog.show(this, null, "正在加载...");

        new Thread(new Runnable() {
            @Override
            public void run() {

                String firstImage = null;

                Uri mImageUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
                ContentResolver mContentResolver = AlbumActivity.this
                        .getContentResolver();

                // 只查询jpeg和png的图片
                Cursor mCursor = mContentResolver.query(mImageUri, null,
                        MediaStore.Images.Media.MIME_TYPE + "=? or "
                                + MediaStore.Images.Media.MIME_TYPE + "=?",
                        new String[]{"image/jpeg", "image/png"},
                        MediaStore.Images.Media.DATE_MODIFIED);

             //   LogUtils.e("TAG", mCursor.getCount() + "");
                while (mCursor.moveToNext()) {
                    // 获取图片的路径
                    String path = mCursor.getString(mCursor
                            .getColumnIndex(MediaStore.Images.Media.DATA));

                //    LogUtils.e("TAG", path);
                    // 拿到第一张图片的路径
                    if (firstImage == null)
                        firstImage = path;
                    // 获取该图片的父路径名
                    File parentFile = new File(path).getParentFile();
                    if (parentFile == null)
                        continue;
                    String dirPath = parentFile.getAbsolutePath();
                    ImageFloder imageFloder = null;
                    // 利用一个HashSet防止多次扫描同一个文件夹(不加这个判断,图片多起来还是相当恐怖的~~)
                    if (mDirPaths.contains(dirPath)) {
                        continue;
                    } else {
                        mDirPaths.add(dirPath);
                        // 初始化imageFloder
                        imageFloder = new ImageFloder();
                        imageFloder.setDir(dirPath);
                        imageFloder.setFirstImagePath(path);
                    }

                    int picSize = parentFile.list(new FilenameFilter() {
                        @Override
                        public boolean accept(File dir, String filename) {
                            if (filename.endsWith(".jpg")
                                    || filename.endsWith(".png")
                                    || filename.endsWith(".jpeg"))
                                return true;
                            return false;
                        }
                    }).length;
                    totalCount += picSize;

                    imageFloder.setCount(picSize);
                    mImageFloders.add(imageFloder);

                    if (picSize > mPicsSize) {
                        mPicsSize = picSize;
                        mImgDir = parentFile;
                    }
                }
                mCursor.close();

                // 扫描完成,辅助的HashSet也就可以释放内存了
                mDirPaths = null;

                // 通知Handler扫描图片完成
                mHandler.sendEmptyMessage(0x110);

            }
        }).start();
    }


    /**
     * 初始化View
     */
    @Override
    protected void initView() {
        DisplayMetrics outMetrics = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(outMetrics);
        mScreenHeight = outMetrics.heightPixels;
        mGirdView = (GridView) findViewById(R.id.id_gridView);
        mChooseDir = (TextView) findViewById(R.id.id_choose_dir);
        mImageCount = (TextView) findViewById(R.id.id_total_count);

        mBottomLy = (RelativeLayout) findViewById(R.id.id_bottom_ly);
        mTitle.setText("选择图片");
        mAction.setText("确定");
        getImages();
        initEvent();

    }

    private void initEvent() {
        /**
         * 为底部的布局设置点击事件,弹出popupWindow
         */
        mBottomLy.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mListImageDirPopupWindow
                        .setAnimationStyle(R.style.anim_popup_dir);
                mListImageDirPopupWindow.showAsDropDown(mBottomLy, 0, 0);

                // 设置背景颜色变暗
                WindowManager.LayoutParams lp = getWindow().getAttributes();
                lp.alpha = .3f;
                getWindow().setAttributes(lp);
            }
        });
        mAction.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mAdapter.setToIntent();
            }
        });
    }

    @Override
    public void selected(ImageFloder floder) {

        mImgDir = new File(floder.getDir());
        mImgs = Arrays.asList(mImgDir.list(new FilenameFilter() {
            @Override
            public boolean accept(File dir, String filename) {
                if (filename.endsWith(".jpg") || filename.endsWith(".png")
                        || filename.endsWith(".jpeg"))
                    return true;
                return false;
            }
        }));
        /**
         * 可以看到文件夹的路径和图片的路径分开保存,极大的减少了内存的消耗;
         */
        //mAdapter = new AlbumAdapter(this, mImgs,
        //       R.layout.grid_item, mImgDir.getAbsolutePath());
        // mGirdView.setAdapter(mAdapter);
        mAdapter.setAlbumAdapter(mImgs, mImgDir.getAbsolutePath());
        // mAdapter.notifyDataSetChanged();
        //  mImageCount.setText(floder.getCount() + "张");原显示图片张数

        mChooseDir.setText(floder.getName() + "/" + floder.getCount() + "张");
        mListImageDirPopupWindow.dismiss();

    }


    public void setImageCount(List<String> mSelectedImage) {
        mImageCount.setText("已选择(" + mSelectedImage.size() + ")张");
    }

}

查看完整大图的类


/**
 * 用于查看大图
 *
 * @author jingbin
 */
public class ViewBigImageActivity extends FragmentActivity implements OnPageChangeListener, PhotoViewAttacher.OnPhotoTapListener {
    final String mKey = "ViewBigImageActivity";
    // 保存图片
    private TextView tv_save_big_image;
    //删除图片 附件
    private TextView tv_delete_big_image;

    // 接收传过来的uri地址
    List<String> imageuri;
    ArrayList<AttachFileBean> imageuribean;
    // 接收穿过来当前选择的图片的数量
    int code;
    // 用于判断是头像还是文章图片 1:头像 2:文章大图
    int selet;
    int  isFile;//用于判断那个类型进来的
    // 用于管理图片的滑动
    ViewPager very_image_viewpager;
    // 当前页数
    private int page;

    /**
     * 显示当前图片的页数
     */
    TextView very_image_viewpager_text;
    /**
     * 用于判断是否是加载本地图片
     */
    private boolean isLocal;

    ViewPagerAdapter adapter;

    /**
     * 本应用图片的id
     */
    private int imageId;
    /**
     * 是否是本应用中的图片
     */
    private boolean isApp;

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

    /**
     * 保存图片至相册
     */
    public static void saveImageToGallery(Context context, Bitmap bmp) {
        // 首先保存图片
        File appDir = new File(Environment.getExternalStorageDirectory(), "顶易手机端");
        if (!appDir.exists()) {
            appDir.mkdir();
        }
        String fileName = System.currentTimeMillis() + ".jpg";
        File file = new File(appDir, fileName);
        try {
            FileOutputStream fos = new FileOutputStream(file);
            bmp.compress(Bitmap.CompressFormat.JPEG, 100, fos);
            fos.flush();
            fos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

        // 其次把文件插入到系统图库
        try {
            MediaStore.Images.Media.insertImage(context.getContentResolver(),
                    file.getAbsolutePath(), fileName, null);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        // 最后通知图库更新
        context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" + file.getAbsoluteFile())));
    }


    /**
     * Glide 获得图片缓存路径
     */
    private String getImagePath(String imgUrl) {
        String path = null;
        FutureTarget<File> future = Glide.with(ViewBigImageActivity.this)
                .load(imgUrl)
                .downloadOnly(500, 500);
        try {
            File cacheFile = future.get();
            path = cacheFile.getAbsolutePath();
        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
        }
        return path;
    }

    /*
     * 接收控件
     */
    private void getView() {
        /************************* 接收控件 ***********************/
        very_image_viewpager_text = (TextView) findViewById(R.id.very_image_viewpager_text);
        tv_save_big_image = (TextView) findViewById(R.id.tv_save_big_image);
        very_image_viewpager = (ViewPager) findViewById(R.id.very_image_viewpager);
        tv_delete_big_image = (TextView) findViewById(R.id.tv_delete_big_image);
        tv_save_big_image.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                ToastUtil.showToast("开始下载图片");
                if (isApp) {// 本地图片
                    Bitmap bitmap = BitmapFactory.decodeResource(getResources(), imageId);
                    if (bitmap != null) {
                        saveImageToGallery(ViewBigImageActivity.this, bitmap);
                        ToastUtil.showToast("保存成功");
//                        Toast.makeText(ViewBigImageActivity.this, "保存成功", Toast.LENGTH_SHORT).show();
                    }

                } else {// 网络图片
                    final BitmapFactory.Options bmOptions = new BitmapFactory.Options();
                    new Thread(new Runnable() {
                        @Override
                        public void run() {
                            // 子线程获得图片路径
                            final String imagePath = getImagePath(imageuri.get(page));
                            // 主线程更新
                            ViewBigImageActivity.this.runOnUiThread(new Runnable() {
                                @Override
                                public void run() {
                                    if (imagePath != null) {
                                        Bitmap bitmap = BitmapFactory.decodeFile(imagePath, bmOptions);
                                        if (bitmap != null) {
                                            saveImageToGallery(ViewBigImageActivity.this, bitmap);
                                            ToastUtil.showToast("已保存至" + Environment.getExternalStorageDirectory().getAbsolutePath() + "/云阅相册");
//                                            Toast.makeText(ViewBigImageActivity.this, "保存成功", Toast.LENGTH_SHORT).show();
                                        }
                                    }
                                }
                            });
                        }
                    }).start();
                }
            }
        });
        tv_delete_big_image.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (isLocal) {//选择相册返回的图片显示
                    imageuri.remove(page);
                    adapter.notifyDataSetChanged();
                } else {//删除附件
                    OnHttpUtilsDelete(imageuribean.get(page).getAttachFileCode(), page);
                }

            }
        });
        /************************* 接收传值 ***********************/
        Bundle bundle = getIntent().getExtras();
        code = bundle.getInt("code");
        selet = bundle.getInt("selet");
        isLocal = bundle.getBoolean("isLocal", false);
        imageuribean = (ArrayList<AttachFileBean>) bundle.getSerializable("imageuribean");
        imageuri = bundle.getStringArrayList("imageuri");
        isFile= bundle.getInt("isFile",0);
        /**是否是本应用中的图片*/
        isApp = bundle.getBoolean("isApp", false);
        /**本应用图片的id*/
        imageId = bundle.getInt("id", 0);
        if (imageuribean != null) {
            if (imageuri == null) imageuri = new ArrayList<>();
            for (int i = 0; i < imageuribean.size(); i++) {
                imageuri.add(imageuribean.get(i).getUrl());
            }
        }
        /**
         * 给viewpager设置适配器
         */
        if (isApp) {
            MyPageAdapter myPageAdapter = new MyPageAdapter();
            very_image_viewpager.setAdapter(myPageAdapter);
            very_image_viewpager.setEnabled(false);
        } else {
            adapter = new ViewPagerAdapter();
            very_image_viewpager.setAdapter(adapter);
            very_image_viewpager.setCurrentItem(code);
            page = code;
            very_image_viewpager.setOnPageChangeListener(this);
            very_image_viewpager.setEnabled(false);
            // 设定当前的页数和总页数
            if (selet == 2) {
                very_image_viewpager_text.setText((code + 1) + " / " + imageuri.size());
            }
        }
    }

    /**
     * 本应用图片适配器
     */

    class MyPageAdapter extends PagerAdapter {

        @Override
        public int getCount() {
            return 1;
        }

        @Override
        public boolean isViewFromObject(View view, Object object) {
            return view == object;
        }

        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            View view = getLayoutInflater().inflate(R.layout.viewpager_very_image, container, false);
            PhotoView zoom_image_view = (PhotoView) view.findViewById(R.id.zoom_image_view);
            ProgressBar spinner = (ProgressBar) view.findViewById(R.id.loading);
            spinner.setVisibility(View.GONE);
            if (imageId != 0) {
                zoom_image_view.setImageResource(imageId);
            }
            zoom_image_view.setOnPhotoTapListener(ViewBigImageActivity.this);
            container.addView(view, 0);
            return view;
        }

        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            View view = (View) object;
            container.removeView(view);
        }
    }

    /**
     * ViewPager的适配器
     *
     * @author guolin
     */
    class ViewPagerAdapter extends PagerAdapter {

        LayoutInflater inflater;

        ViewPagerAdapter() {
            inflater = getLayoutInflater();
        }

        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            View view = inflater.inflate(R.layout.viewpager_very_image, container, false);
            final PhotoView zoom_image_view = (PhotoView) view.findViewById(R.id.zoom_image_view);
            final ProgressBar spinner = (ProgressBar) view.findViewById(R.id.loading);
            // 保存网络图片的路径
            String adapter_image_Entity = (String) getItem(position);
            //TODO
            String imageUrl;
            if (isLocal) {
                imageUrl = "file://" + adapter_image_Entity;
                tv_save_big_image.setVisibility(View.GONE);
            } else {
                imageUrl = adapter_image_Entity;
            }

            spinner.setVisibility(View.VISIBLE);
            spinner.setClickable(false);
            Glide.with(ViewBigImageActivity.this).load(imageUrl)
                    .crossFade(700)
                    .listener(new RequestListener<String, GlideDrawable>() {
                        @Override
                        public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) {
                            Toast.makeText(getApplicationContext(), "资源加载异常", Toast.LENGTH_SHORT).show();
                            spinner.setVisibility(View.GONE);
                            return false;
                        }

                        //这个用于监听图片是否加载完成
                        @Override
                        public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) {
//                            Toast.makeText(getApplicationContext(), "图片加载完成", Toast.LENGTH_SHORT).show();
                            spinner.setVisibility(View.GONE);

                            /**这里应该是加载成功后图片的高*/
                            int height = zoom_image_view.getHeight();

                            int wHeight = getWindowManager().getDefaultDisplay().getHeight();
                            if (height > wHeight) {
                                zoom_image_view.setScaleType(ImageView.ScaleType.CENTER_CROP);
                            } else {
                                zoom_image_view.setScaleType(ImageView.ScaleType.FIT_CENTER);
                            }
                            return false;
                        }
                    }).into(zoom_image_view);

            zoom_image_view.setOnPhotoTapListener(ViewBigImageActivity.this);
            container.addView(view, 0);
            return view;
        }

        @Override
        public int getCount() {
            if (imageuri == null || imageuri.size() == 0) {
                return 0;
            }
            return imageuri.size();
        }

        @Override
        public boolean isViewFromObject(View arg0, Object arg1) {
            return arg0 == arg1;
        }

        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            View view = (View) object;
            container.removeView(view);
        }

        Object getItem(int position) {
            return imageuri.get(position);
        }
    }

    /**
     * 下面是对Viewpager的监听
     */
    @Override
    public void onPageScrollStateChanged(int arg0) {
    }

    @Override
    public void onPageScrolled(int arg0, float arg1, int arg2) {
    }

    /**
     * 本方法主要监听viewpager滑动的时候的操作
     */
    @Override
    public void onPageSelected(int arg0) {
        // 每当页数发生改变时重新设定一遍当前的页数和总页数
        very_image_viewpager_text.setText((arg0 + 1) + " / " + imageuri.size());
        page = arg0;
    }

    @Override
    public void onPhotoTap(View view, float x, float y) {
        finish();
    }

    @Override
    public void onOutsidePhotoTap() {
//        finish();
    }

    private void OnHttpUtilsDelete(String json, final int i) {
        ToastUtil.showToast("开始删除图片");
        HttpPost.LoginUrl(this, U.deleteRelationAttachFile(json,isFile), new OnLoginListener() {
            @Override
            public void loginSuccess(String response, int id) {
                boolean status = false;
                try {
                    JSONObject jsonob = new JSONObject(response);
                    status = jsonob.optBoolean("status");
                } catch (JSONException e) {
                    e.printStackTrace();
                    ToastUtil.showToast(UiUtils.getString(R.string.OkhttpDelete));
                    return;
                }
                if (status) {
                    imageuri.remove(i);
                    adapter.notifyDataSetChanged();
                    ToastUtil.showToast(UiUtils.getString(R.string.OkhttpDelete));
                } else {
                    ToastUtil.showToast(UiUtils.getString(R.string.OkhttpDeleteError));
                }
            }

            @Override
            public void loginError(Call call, Exception e, int id) {
                ToastUtil.showToast(UiUtils.getString(R.string.OkhttpError));
            }
        });
    }

    // 返回键返回事件
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (KeyEvent.KEYCODE_BACK == keyCode) {
            //根据 Tag 取消请求
            OkHttpUtils.getInstance().cancelTag(this);
            overridePendingTransition(R.anim.move_left_in_activity, R.anim.move_right_out_activity);
            Intent intent = new Intent();
            intent.putStringArrayListExtra(mKey, (ArrayList<String>) imageuri);
            //记录下要返回给那个父亲,可能还有什么继父什么的
            setResult(150, intent);
            finish();
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }

也是复用了多次了的,所以判断比较多,用到的第三方有 okhttputlis,Glide,uk.co.senab.photoview.

下面是图片展示的类

public class AttachFileActivity extends BaseHeaderActivity implements BGARefreshLayout.BGARefreshLayoutDelegate {
    @BindView(R.id.id_gridView)
    GridView idGridView;
    AttachFileAdapter fileAdapter;
    @BindView(R.id.mRefreshLayout)
    BGARefreshLayout mRefreshLayout;
    @BindView(R.id.tv_context)
    TextView tvContext;
    @BindView(R.id.ll_error_refresh)
    LinearLayout llErrorRefresh;
    ArrayList<AttachFileBean> mRatingArray;
    final String mKey = "AttachFileActivity";
    final String mKeyFileis = "AttachFileActivityIs";
    final String mKeyFileNew = "AttachFileNewActivity";
    String RelationRecordCode;
    int isFile;

    @Override
    protected int getLayoutId() {
        return R.layout.activity_attachfile;
    }

    @Override
    protected void initView() {
        mTitle.setText(R.string.AccessoryManagement);
        mAction.setText(R.string.NewlyAdded);
        if (getIntent().getStringExtra(mKey) != null) {
            RelationRecordCode = getIntent().getStringExtra(mKey);
            isFile=getIntent().getIntExtra(mKeyFileis,0);
        }
        mRatingArray = new ArrayList<>();
        fileAdapter = new AttachFileAdapter(this, mRatingArray, R.layout.item_attachfile);
        idGridView.setAdapter(fileAdapter);
        initHttpPost();
    }

    @Override
    public void initListener() {
        mRefreshLayout.setDelegate(this);
        BGAStickinessRefreshViewHolder stickinessRefreshViewHolder = new BGAStickinessRefreshViewHolder(this, false);
        stickinessRefreshViewHolder.setStickinessColor(R.color.colorAccent);
        stickinessRefreshViewHolder.setRotateImage(R.mipmap.bga_refresh_stickiness);
        mRefreshLayout.setRefreshViewHolder(stickinessRefreshViewHolder);
        idGridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Bundle bundle = new Bundle();
                bundle.putInt("selet", 2);// 2,大图显示当前页数,1,头像,不显示页数
                bundle.putInt("code", position);//第几张
                bundle.putSerializable("imageuribean", mRatingArray);
                bundle.putInt("isFile", isFile);//那个类型附件进来的
                Intent intent = new Intent(AttachFileActivity.this, ViewBigImageActivity.class);
                intent.putExtras(bundle);
                startActivity(intent);
            }
        });
        mAction.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(AttachFileActivity.this, AttachFileNewActivity.class);
                intent.putExtra(mKeyFileNew, RelationRecordCode);
                intent.putExtra(mKeyFileis, isFile);
                jumpToActivity(intent);
            }
        });

    }

    private void initHttpPost() {
        if (mRatingArray == null)
            initLoading(tvContext, llErrorRefresh);
        shouCustomProgressDialog("");
        HttpPost.LoginUrlACache(TAG, U.getAllAttachFile(RelationRecordCode,isFile), new OnLoginListener() {
            @Override
            public void loginSuccess(String response, int id) {
                boolean status = false;
                String list = null;
                try {
                    JSONObject jsonObject = new JSONObject(response);
                    status = jsonObject.optBoolean("status");
                    list = jsonObject.optString("list");
                } catch (JSONException e) {
                    e.printStackTrace();
                    dissmisToast(UiUtils.getString(R.string.OkhttpDataError));
                    initError(tvContext, llErrorRefresh, new OnLoading() {
                        @Override
                        public void Refresh(View v) {
                            initHttpPost();
                        }
                    });
                    return;
                }
                if (status) {
                    mRatingArray = APP.gson.fromJson(list,
                            new TypeToken<List<AttachFileBean>>() {
                            }.getType());
                    if (isSize(mRatingArray)) {
                        initTo();
                        initSuccess(llErrorRefresh);
                        dissmisCustomProgressDialog();
                    } else {
                        initRefresh(tvContext, R.string.http_no, llErrorRefresh);
                        dissmisToast(UiUtils.getString(R.string.http_no));
                    }
                } else {
                    dissmisToast(UiUtils.getString(R.string.OkhttpDataError));
                    initError(tvContext, llErrorRefresh, new OnLoading() {
                        @Override
                        public void Refresh(View v) {
                            initHttpPost();
                        }
                    });
                }
                mRefreshLayout.endRefreshing();
            }

            @Override
            public void loginError(Call call, Exception e, int id) {
                dissmisToast(UiUtils.getString(R.string.OkhttpError));
                initError(tvContext, llErrorRefresh, new OnLoading() {
                    @Override
                    public void Refresh(View v) {
                        initHttpPost();
                    }
                });
                mRefreshLayout.endRefreshing();
            }
        });
    }

    private void initTo() {
        fileAdapter.setData(mRatingArray);

    }

    @Override
    public void onBGARefreshLayoutBeginRefreshing(BGARefreshLayout refreshLayout) {
        HttpPost.isLogin = true;
        initHttpPost();
    }

    @Override
    public boolean onBGARefreshLayoutBeginLoadingMore(BGARefreshLayout refreshLayout) {
        return false;
    }
}

下面附上一些适配器什么的用到的类以及用到的一些方法

展示图片的继承的通用适配器,百度一下就有的

public class AttachFileAdapter extends CommonAdapter<AttachFileBean> {
    /**
     * 构造函数
     *
     * @param context   上下文
     * @param data      显示的数据
     * @param layout_id listview使用的条目的布局文件id
     */
    public AttachFileAdapter(Context context, List<AttachFileBean> data, int layout_id) {
        super(context, data, layout_id);
    }

    public void setData(List<AttachFileBean> data) {
        this.data = data;
        notifyDataSetChanged();
    }

    @Override
    public void convert(ViewHolder h, AttachFileBean item, int i) {
        String prefix=item.getUrl().substring(item.getUrl().lastIndexOf(".")+1);
        if (prefix.equals("png")||prefix.equals("jpg")){
            h.setImageByUrl(R.id.iv_welfare, item.getUrl(), false);
        }else {
            h.setImageByUrl(R.id.iv_welfare,R.mipmap.img_default_meizi, false);
        }
        if (i % 2 == 0) {
            DensityUtil.setViewMargin((View) h.getViewById(R.id.iv_welfare),false, 12, 6, 12, 0);
        } else {
            DensityUtil.setViewMargin((View) h.getViewById(R.id.iv_welfare), false, 6, 12, 12, 0);
        }
    }
}
    /**
     * 设置某个View的margin
     *
     * @param view   需要设置的view
     * @param isDp   需要设置的数值是否为DP
     * @param left   左边距
     * @param right  右边距
     * @param top    上边距
     * @param bottom 下边距
     * @return
     */
    public static ViewGroup.LayoutParams setViewMargin(View view, boolean isDp, int left, int right, int top, int bottom) {
        if (view == null) {
            return null;
        }

        int leftPx = left;
        int rightPx = right;
        int topPx = top;
        int bottomPx = bottom;
        ViewGroup.LayoutParams params = view.getLayoutParams();
        ViewGroup.MarginLayoutParams marginParams = null;
        //获取view的margin设置参数
        if (params instanceof ViewGroup.MarginLayoutParams) {
            marginParams = (ViewGroup.MarginLayoutParams) params;
        } else {
            //不存在时创建一个新的参数
            marginParams = new ViewGroup.MarginLayoutParams(params);
        }

        //根据DP与PX转换计算值
        if (isDp) {
            leftPx = dip2px(left);
            rightPx = dip2px(right);
            topPx = dip2px(top);
            bottomPx = dip2px(bottom);
        }
        //设置margin
        marginParams.setMargins(leftPx, topPx, rightPx, bottomPx);
        view.setLayoutParams(marginParams);
        view.requestLayout();
        return marginParams;
    }

上面用的一些方法

   /**
     * 为ImageView设置图片
     *
     * @param viewId
     * @param url
     * @param is 是否开启内存缓存
     * @return
     */
    public void setImageByUrl(int viewId, String url,boolean is)
    {
        Glide.with(context)
                .load(url)
                .placeholder(Drawables.sPlaceholderDrawable)//设置资源加载过程中的占位Drawable。
                .error(Drawables.sErrorDrawable)//设置load失败时显示的Drawable。
                //.centerCrop()
                .skipMemoryCache(is) //使用内存缓存
                .diskCacheStrategy(DiskCacheStrategy.NONE) //不使用硬盘缓存
                .into((ImageView) getViewById(viewId));

    }
 /**
     * 根据控件id获取控件对象
     *
     * @param viewId
     * @return
     */
    @SuppressWarnings("unchecked")
    public <T> T getViewById(int viewId) {
        // 从集合中根据这个id获取view视图对象
        View view = mViews.get(viewId);
        // 如果为空,说明是第一次获取,里面没有,那就在布局文件中找到这个控件,并且存进集合中
        if (view == null) {
            view = mContentView.findViewById(viewId);
            mViews.put(viewId, view);
        }
        // 返回控件对象
        return (T) view;
    }

上传的类的适配器,也是复用多次的

public class AttachFileNewAdapter extends BaseAdapter {
    private LayoutInflater inflater;
    ArrayList<String> list;
    Context context;

    public AttachFileNewAdapter(Context context, ArrayList<String> list) {
        inflater = LayoutInflater.from(context);
        this.context = context;
        this.list = list;
    }

    public void setUpdate(ArrayList<String> list) {
        this.list = list;
        notifyDataSetChanged();
    }

    @Override
    public int getCount() {
        if (list.size() == 0) {
            return 1;
        } else {
            return list.size() + 1;// 加一个选择图片
        }
    }
    @Override
    public Object getItem(int i) {
        if (list.size() == 0 || i - 1 < 0
                || i > list.size() ) {
            return null;
        } else {
            return list.get(i-1);
        }
    }
    @Override
    public long getItemId(int i) {
        return i;
    }
    @Override
    public View getView(int i, View convertView, ViewGroup parent) {
        ViewHolder holder = null;
        if (convertView == null) {
            convertView = inflater.inflate(R.layout.item_attachfilenew,
                    parent, false);
            holder = new ViewHolder();
            holder.image = (ImageView) convertView
                    .findViewById(R.id.item_grida_image);
            if (i % 3 == 0) {
                DensityUtil.setViewMargin(holder.image,false, 12, 6, 12, 0);
            } else {
                DensityUtil.setViewMargin(holder.image, false, 6, 12, 12, 0);
            }
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }
        if(i == parent.getChildCount()){
            LogUtils.e("list.size()=",list.size()+"/position="+i);
            if (isShowAddItem(i)) {//若为真,则表示没有图片,显示添加图片的标志
                holder.image.setImageBitmap(BitmapFactory.decodeResource(
                        context.getResources(), R.mipmap.additem));
            }else {
                setImageByUrl(holder.image,list.get(i),false);
            }
            //正常调用
        }else{
            //系统为计算item高度额外调用
        }
        return convertView;
    }

    public class ViewHolder {
        public ImageView image;
    }


    public void setImageByUrl(View v, String url,boolean is)
    {
        Glide.with(context)
                .load(url)
                .placeholder(Drawables.sPlaceholderDrawable)//设置资源加载过程中的占位Drawable。
                .error(Drawables.sErrorDrawable)//设置load失败时显示的Drawable。
                .centerCrop()
                .override(APP.windowWidth/3, UiUtils.getDimension(R.dimen.x120))
                .skipMemoryCache(is) //使用内存缓存
                .diskCacheStrategy(DiskCacheStrategy.NONE) //不使用硬盘缓存
                .into((ImageView)v);
    }
    private boolean isShowAddItem(int position) {
        // mDataList == null则size=0,mDataList != null则size=mDataList.size();
        int size = list == null ? 0 : list.size();
        return position == size;
    }
}

相册选择的适配器

public class AlbumAdapter extends CommonAdapter<String> {

    /**
     * 用户选择的图片,存储为图片的完整路径
     */
    public List<String> mSelectedImage = new LinkedList<String>();
    AlbumAdapterRe albumAdapterRe;
    /**
     * 文件夹路径
     */
    private String mDirPath;

    public AlbumAdapter(Context context, List<String> mDatas, int itemLayoutId,
                        String dirPath) {
        super(context, mDatas, itemLayoutId);
        this.mDirPath = dirPath;
    }

    public void setAlbumAdapterRe(AlbumAdapterRe albumAdapterRe) {
        this.albumAdapterRe = albumAdapterRe;
    }

    public void setAlbumAdapter(List<String> mDatas, String dirPath) {
        this.data = mDatas;
        this.mDirPath = dirPath;
        notifyDataSetChanged();
    }

    @Override
    public void convert(final ViewHolder helper, final String item, int position) {
        //设置no_pic
     //   helper.setImageResource(R.id.id_item_image, R.mipmap.pictures_no);
        //设置no_selected
        helper.setImageResource(R.id.id_item_select,
                R.mipmap.picture_unselected);
        //设置图片
        helper.setImageByUrl(R.id.id_item_image, mDirPath + "/" + item, false);

        final ImageView mImageView = helper.getViewById(R.id.id_item_image);
        final ImageView mSelect = helper.getViewById(R.id.id_item_select);

        mImageView.setColorFilter(null);
        //设置ImageView的点击事件
        mImageView.setOnClickListener(new View.OnClickListener() {
            //选择,则将图片变暗,反之则反之
            @Override
            public void onClick(View v) { // 已经选择过该图片
                if (mSelectedImage.contains(mDirPath + "/" + item)) {
                    mSelectedImage.remove(mDirPath + "/" + item);
                    mSelect.setImageResource(R.mipmap.picture_unselected);
                    mImageView.setColorFilter(null);
                } else {// 未选择该图片
                    mSelectedImage.add(mDirPath + "/" + item);
                    mSelect.setImageResource(R.mipmap.pictures_selected);
                    mImageView.setColorFilter(Color.parseColor("#77000000"));
                }
                helper.setImageByUrl(R.id.id_item_image, mDirPath + "/" + item, false);
                if(albumAdapterRe!=null)
                    albumAdapterRe.ResultsetImageCount(mSelectedImage);
            }
        });
        /**
         * 已经选择过的图片,显示出选择过的效果
         */
        if (mSelectedImage.contains(mDirPath + "/" + item)) {
            mSelect.setImageResource(R.mipmap.pictures_selected);
            mImageView.setColorFilter(Color.parseColor("#77000000"));
        }
    }

    public void setToIntent() {
        ArrayList<String> arrayList = new ArrayList<>();
        arrayList.addAll(mSelectedImage);
        Intent intent = new Intent(context, AttachFileNewActivity.class);
        intent = intent.putStringArrayListExtra("mSelectedImage", arrayList);
        ((AlbumActivity)context).setResult(33, intent);
        ((AlbumActivity)context).finish();
    }

    public interface AlbumAdapterRe {
        void ResultsetImageCount(List<String> arrayList);
    }

}

储存图片的bean

public class ImageFloder
{
    /**
     * 图片的文件夹路径
     */
    private String dir;

    /**
     * 第一张图片的路径
     */
    private String firstImagePath;

    /**
     * 文件夹的名称
     */
    private String name;

    /**
     * 图片的数量
     */
    private int count;

    public String getDir()
    {
        return dir;
    }

    public void setDir(String dir)
    {
        this.dir = dir;
        int lastIndexOf = this.dir.lastIndexOf("/");
        this.name = this.dir.substring(lastIndexOf);
    }

    public String getFirstImagePath()
    {
        return firstImagePath;
    }

    public void setFirstImagePath(String firstImagePath)
    {
        this.firstImagePath = firstImagePath;
    }

    public String getName()
    {
        return name;
    }
    public int getCount()
    {
        return count;
    }

    public void setCount(int count)
    {
        this.count = count;
    }



}

弹窗的类

public class ListImageDirPopupWindow extends BasePopupWindowForListView<ImageFloder>
{
    private ListView mListDir;

    public ListImageDirPopupWindow(int width, int height,
                                   List<ImageFloder> datas, View convertView)
    {
        super(convertView, width, height, true, datas);
    }

    @Override
    public void initViews()
    {
        mListDir = (ListView) findViewById(R.id.id_list_dir);
        mListDir.setAdapter(new CommonAdapter<ImageFloder>(context, mDatas,
                R.layout.list_dir_item)
        {
            @Override
            public void convert(ViewHolder helper, ImageFloder item, int i)
            {
                helper.setText(R.id.id_dir_item_name, item.getName());
                helper.setImageByUrl(R.id.id_dir_item_image,
                        item.getFirstImagePath(),false);
                helper.setText(R.id.id_dir_item_count, item.getCount() + "张");
            }
        });
    }

    public interface OnImageDirSelected
    {
        void selected(ImageFloder floder);
    }

    private OnImageDirSelected mImageDirSelected;

    public void setOnImageDirSelected(OnImageDirSelected mImageDirSelected)
    {
        this.mImageDirSelected = mImageDirSelected;
    }

    @Override
    public void initEvents()
    {
        mListDir.setOnItemClickListener(new OnItemClickListener()
        {
            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id)
            {

                if (mImageDirSelected != null)
                {
                    mImageDirSelected.selected(mDatas.get(position));
                }
            }
        });
    }

    @Override
    public void init()
    {


    }

    @Override
    protected void beforeInitWeNeedSomeParams(Object... params)
    {

    }

}
public abstract class BasePopupWindowForListView<T> extends PopupWindow
{
    /**
     * 布局文件的最外层View
     */
    protected View mContentView;
    protected Context context;
    /**
     * ListView的数据集
     */
    protected List<T> mDatas;

    public BasePopupWindowForListView(View contentView, int width, int height,
                                      boolean focusable)
    {
        this(contentView, width, height, focusable, null);
    }

    public BasePopupWindowForListView(View contentView, int width, int height,
                                      boolean focusable, List<T> mDatas)
    {
        this(contentView, width, height, focusable, mDatas, new Object[0]);

    }

    public BasePopupWindowForListView(View contentView, int width, int height,
                                      boolean focusable, List<T> mDatas, Object... params)
    {
        super(contentView, width, height, focusable);
        this.mContentView = contentView;
        context = contentView.getContext();
        if (mDatas != null)
            this.mDatas = mDatas;

        if (params != null && params.length > 0)
        {
            beforeInitWeNeedSomeParams(params);
        }

        setBackgroundDrawable(new BitmapDrawable());
        setTouchable(true);
        setOutsideTouchable(true);
        setTouchInterceptor(new OnTouchListener()
        {
            @Override
            public boolean onTouch(View v, MotionEvent event)
            {
                if (event.getAction() == MotionEvent.ACTION_OUTSIDE)
                {
                    dismiss();
                    return true;
                }
                return false;
            }
        });
        initViews();
        initEvents();
        init();
    }

    protected abstract void beforeInitWeNeedSomeParams(Object... params);

    public abstract void initViews();

    public abstract void initEvents();

    public abstract void init();

    public View findViewById(int id)
    {
        return mContentView.findViewById(id);
    }

    protected static int dpToPx(Context context, int dp)
    {
        return (int) (context.getResources().getDisplayMetrics().density * dp + 0.5f);
    }

}

上传文件引用的okhttphutlis


    /**
     * 上传文件的
     *
     * @param url
     * @param file  文件
     * @param image 文件名,后台的字段
     * @param Login
     */
    public static void LoginAddFile(String url, File[] file, String[] image, String[] parameter, String[] content, final OnLoginListener Login) {
        PostFormBuilder postFormBuilder = OkHttpUtils.post().url(url);
        for (int i = 0; i < file.length; i++) {
            postFormBuilder.addFile(image[i], file[i].getName(), file[i]);
        }
        for (int i = 0; i < parameter.length; i++) {
            postFormBuilder.addParams(parameter[i], content[i]);
        }
        postFormBuilder.build().execute(new StringCallback() {
            @Override
            public void onError(Call call, Exception e, int id) {
                if (Login != null)
                    Login.loginError(call, e, id);
            }

            @Override
            public void onResponse(String response, int id) {
                if (Login != null)
                    Login.loginSuccess(response, id);
            }
        });
    }

好了,基本改贴的都贴完了,写的比较草草,勿怪,有不清楚的地方也可以评论,我看到就会回复的,或者咨询我qq,demo我就没写了,因为在项目里,就没抽取出来,勿怪qaq。

发布了11 篇原创文章 · 获赞 24 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/feng40492459/article/details/77698043
今日推荐