这个星期我们这边有个类似于电子相册的功能(基本就是浏览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;
}
}