关于电子相册功能的一些总结

这个星期我们这边有个类似于电子相册的功能(基本就是浏览SD卡里面的图片,并能点击图片进行图片放大操作,长按图片能进行图片的删除,而且对照片创建的时间进行了排序):

       里面需要注意的几点我给总结了一下:我们在用Btmp解析SD卡里面的图片的时候要注意及时释放Btmp里面的资源,并且要对照片进行缩放处理不然会产生令人头疼的OOM,一开始我没有对Btmp解析的图片进行压缩,在虚拟机上跑的没有问题,但是在真机上运行的时候就出现了问题,然后我在网上查找了一下发现使用Btmp要注意很多细节问题。

        1:要对Btmp解析的图片做处理进行适当的压缩:压缩图片的代码  

         /**
         * 圧縮图片的比例
         */
        BitmapFactory.Options options = new BitmapFactory.Options();
        /**
         * 加载出来的图片是原图的十分之一
         */
        options.inSampleSize = 10;
        Bitmap bmpDefaultPic = BitmapFactory.decodeFile(s,options);
        viewHolder.miv.setImageBitmap(bmpDefaultPic);

        2:在长按删除图片的部分代码:

            new AlertDialog.Builder(MainActivity.this)
                        .setTitle(R.string.long_click)
                        .setMessage(R.string.delete_firm)
                        .setPositiveButton(R.string.Ok, new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                File removeFile = new File(mList.get(p).toString());
                                if (removeFile.exists()){
                                    removeFile.delete();
                                    adapter.notifyDataSetChanged();
                                    finish();
                                    Intent intent = new Intent(MainActivity.this,MainActivity.class);
                                    startActivity(intent);
                                    //通知scard更新好像没什么用
//                                    Intent media = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
//                                    Uri contentUri = Uri.fromFile(removeFile);
//                                    media.setData(contentUri);
//                                    MainActivity.this.sendBroadcast(media);
                                }

                            }
                        })
                        .setNegativeButton(R.string.Cancel, new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {

                            }
                        }).show();

大概浏览和删除图片的注意事项我大概就总结了这么多下面附上部分代码。

1:MainActivity

    public class MainActivity extends AppCompatActivity {
    //UI
    private GridView mGridView;
    //数据
    private List<File> mList;
    private File[] imgfile;
    private GridViewAdapter adapter;
    private String[] imgadress;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        /**
         * 初始化控件
         */
        initView();
        /**
         * 判断sdcard是否存在
         */
        boolean isSdCardExist = Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED);
        if (isSdCardExist){
        /**
        * 初始化数据
        */
        initData();
        /**
         * 创建适配器
         */
        adapter = new GridViewAdapter(this,mList);
        mGridView.setAdapter(adapter);
        }else {
            Toast.makeText(this,"sd卡不存在!",Toast.LENGTH_LONG).show();
        }
        mGridView.setSelector(new ColorDrawable(Color.TRANSPARENT));
        /**
         * 放大图片
         */
        enlargePic();
        /**
         * 删除照片
         */
        delPic();
    }

    private void enlargePic() {
        imgadress = new String[mList.size()];
        for (int i =0;i<mList.size();i++){
            imgadress[i] = mList.get(i).toString();
        }
        mGridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                View convertView = LayoutInflater.from(MainActivity.this).inflate(R.layout.item_gridview,null);
                ImageView miv = (ImageView) convertView.findViewById(R.id.iv_pic);
                Intent intent = new Intent(MainActivity.this, PictureActivity.class);
                Bundle bundle = new Bundle();
                //将图片的地址传过去
                bundle.putSerializable("File", imgadress) ;
                intent.putExtras(bundle) ;
                intent.putExtra("id",position+"");
                //自定义ImageView需要的一些参数
                int[] location = new int[2];
                miv.getLocationOnScreen(location);
                intent.putExtra("locationX", location[0]);//必须
                intent.putExtra("locationY", location[1]);//必须
                intent.putExtra("width",miv.getWidth());//必须
                intent.putExtra("height",miv.getHeight());//必须
                startActivity(intent);
            }
        });
    }

    private void delPic() {
        mGridView.setOnItemLongClickListener(new GridView.OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
                //final View fView = view;
                final int p = position;
                new AlertDialog.Builder(MainActivity.this)
                        .setTitle(R.string.long_click)
                        .setMessage(R.string.delete_firm)
                        .setPositiveButton(R.string.Ok, new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                File removeFile = new File(mList.get(p).toString());
                                if (removeFile.exists()){
                                    removeFile.delete();
                                    adapter.notifyDataSetChanged();
                                    finish();
                                    Intent intent = new Intent(MainActivity.this,MainActivity.class);
                                    startActivity(intent);
                                    //通知scard更新好像没什么用
//                                    Intent media = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
//                                    Uri contentUri = Uri.fromFile(removeFile);
//                                    media.setData(contentUri);
//                                    MainActivity.this.sendBroadcast(media);
                                }

                            }
                        })
                        .setNegativeButton(R.string.Cancel, new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {

                            }
                        }).show();
                return true;
            }
        });
    }

    private void initView() {
        mGridView = (GridView) findViewById(R.id.gv_pic);
    }

    private void initData(){
        mList = new ArrayList<File>();
        //获取scard中照相机保存图片的路径
        String url = Environment.getExternalStorageDirectory().toString()+"/DCIM/Camera";
        File albumdir = new File(url);
        imgfile = albumdir.listFiles(filefiter);
        int len = imgfile.length;
        for(int i=0;i<len;i++){
            mList.add(imgfile[i]);
        }
        //通过重写Comparator的实现类FileComparator来实现按文件创建时间排序。
        Collections.sort(mList, new FileComparator());
    }

   /*
   通过fileFileter过滤器来获取parentFile路径下的想要类型的子文件
    */
    private FileFilter filefiter = new FileFilter(){
        @Override
        public boolean accept(File f) {
            String tmp = f.getName().toLowerCase();
            if(tmp.endsWith(".png")||tmp.endsWith(".jpg")
                    ||tmp.endsWith(".jpeg")){
                return true;
            }
            return false;
        }
    };
    private class FileComparator implements Comparator<File> {
        @Override
        public int compare(File lhs, File rhs) {
            if(lhs.lastModified()<rhs.lastModified()){
                return 1;//最后修改的照片在前
            }else{
                return -1;
            }
        }
    }//排序的这个方法是我在网上查了一下写
}

2:GridViewAdapter

/**
 * 相册的适配器
 * Created by GIGA on 2016/10/13.
 */

public class GridViewAdapter extends BaseAdapter {
    private Context context;
    private LayoutInflater inflater;
    //数据
    private List<File> mList;
    private String[] imgfile;

    public GridViewAdapter(Context context,List<File> mList) {
        this.context = context;
        inflater = LayoutInflater.from(context);
        this.mList = mList;
    }

    @Override
    public int getCount() {
        return mList.size();
    }
    @Override
    public Object getItem(int position) {
        return position;
    }

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

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        ViewHolder viewHolder =null;
        if (convertView==null){
            viewHolder = new ViewHolder();
            convertView = inflater.inflate(R.layout.item_gridview,null);
            viewHolder.miv = (ImageView) convertView.findViewById(R.id.iv_pic);
            convertView.setTag(viewHolder);
        }else {
            viewHolder = (ViewHolder) convertView.getTag();
        }
        String s = mList.get(position).toString();
        imgfile = new String[mList.size()];
        for (int i =0;i<mList.size();i++){
            imgfile[i] = mList.get(i).toString();
        }
        /**
         * 圧縮图片的比例
         */
        BitmapFactory.Options options = new BitmapFactory.Options();
        /**
         * 加载出来的图片是原图的十分之一
         */
        options.inSampleSize = 10;
        Bitmap bmpDefaultPic = BitmapFactory.decodeFile(s,options);
        viewHolder.miv.setImageBitmap(bmpDefaultPic);
        return convertView;
    }
    class ViewHolder{
        ImageView miv;
    }
}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值