- 浏览: 815696 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
wa19912002:
感谢 tomcat8改成7就好了
jstl的错误总结与解决方法 -
呵呵6666:
不错,谢谢分享!推荐个参考视频内容:http://www.ro ...
浅谈mysql主从复制的高可用解决方案 -
masuweng:
tabindex的微妙使用 -
syxfqw7:
完全正确,补充一下<beans:bean id=&quo ...
SpringSecurity3.1.2控制一个账户同时只能登录一次 -
fireinjava:
longToip直接用ipToLong反过来就好了 publi ...
IP地址与长整数之间的转换详解
看到小米手机和其他一些图片显示软件,gridview显示图片时候,长按某个item,可以进入编辑模式,试着也做了个。
在Android拍照、预览、上传综合的基础上改进,实现效果,长按gridview一个item图片显示,进入编辑模式,可以批量删除图片。两个需要注意的地方:
1、选中图片的边框效果。
实现方法:设置背景图片为将要显示的图片,然后设置图片源setImageResource为带2像素边框的透明小图片。
2、图片右上角给个小对号图片,标示选中。
实现方法:使用相对布局是这个小图片放在右上角。
总结:网上也没有找到一个得劲的实现方式,我做这个后来发现有些瑕疵,本来可以做的更好,如:需要在java代码中控制gridview的全屏以及上下隔出间距显示按钮等其他元素(因为我使用的是Framelayout,各个元素是重叠的,设置显示为gone也没用);如果使用Linearlayout应该可以做到不用java代码设置间距。
效果图如下:
这个没有demo,我把需要的图片,样式给放出来,关键地方有注释说明,源码如下:
【1】、图片展示类gridview
/**
* 图片预览 * @author: aokunsang * @date: 2012-8-1 */ public class PictureScanAct extends Activity { private GridView gridView; private ImageAdapter imgAdapter; private TextView seclectNumView; private Button deleteButton; private List<LoadImage> fileNameList = new ArrayList<LoadImage>(); //保存Adapter中显示的图片详情(要跟adapter里面的List要对应) private List<LoadImage> selectFileLs = new ArrayList<LoadImage>(); //保存选中的图片信息 private boolean isDbClick = false; //是否正在长按状态 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.picturescan); gridView = (GridView)findViewById(R.id.picture_grid); seclectNumView = (TextView)findViewById(R.id.pic_seclet_num); deleteButton = (Button)findViewById(R.id.pic_delete); deleteButton.setOnClickListener(delClickListener); imgAdapter = new ImageAdapter(this); gridView.setAdapter(imgAdapter); gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { LoadImage loadimg = fileNameList.get(position); ViewHolder holder = (ViewHolder)view.getTag(); if(isDbClick){ if(selectFileLs.contains(loadimg)){ holder.image1.setImageDrawable(null); holder.image2.setVisibility(View.GONE); imgAdapter.delNumber(position+""); selectFileLs.remove(loadimg); }else{ holder.image1.setImageResource(R.drawable.border); //添加图片(带边框的透明图片)[主要目的就是让该图片带边框] holder.image2.setVisibility(View.VISIBLE); //设置图片右上角的对号显示 imgAdapter.addNumber(position+""); //把该图片添加到adapter的选中状态,防止滚动后就没有在选中状态了。 selectFileLs.add(loadimg); } seclectNumView.setText("选中"+selectFileLs.size()+"张图片"); }else{ startActivity(new Intent(PictureScanAct.this, PictureViewAct.class).putExtra("flag","upload").putExtra("imagePath",loadimg.getFileName())); } } }); gridView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { @Override public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { LoadImage loadimg = fileNameList.get(position); ViewHolder holder = (ViewHolder)view.getTag(); if(!isDbClick){ isDbClick = true; gridView.setPadding(0, 50, 0, 50); //长按后,让gridview上下都分出点空间,显示删除按钮之类的。看效果图就知道了。 seclectNumView.setVisibility(View.VISIBLE); deleteButton.setVisibility(View.VISIBLE); holder.image1.setImageResource(R.drawable.border); holder.image2.setVisibility(View.VISIBLE); imgAdapter.addNumber(position+""); selectFileLs.add(loadimg); seclectNumView.setText("选中1张图片"); return true; } return false; } }); Toast.makeText(this, "加载图片中....", Toast.LENGTH_SHORT).show(); new AsyncLoadedImage().execute(); } /** * 删除监听器事件 */ private android.view.View.OnClickListener delClickListener = new View.OnClickListener() { @Override public void onClick(View v) { if(selectFileLs.isEmpty()) { Toast.makeText(PictureScanAct.this, "请选择图片", Toast.LENGTH_SHORT).show(); return ; } for(LoadImage loadimg : selectFileLs){ File file = new File(loadimg.getFileName()); boolean isTrue = file.delete(); Log.i("----------------------删除图片------", isTrue+"---------------"); } imgAdapter.deletePhoto(selectFileLs); seclectNumView.setText("选中0张图片"); } }; @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if(isDbClick && keyCode == KeyEvent.KEYCODE_BACK){ //点击返回按键 isDbClick = false; gridView.setPadding(0, 0, 0, 0); //退出编辑转台时候,使gridview全屏显示 seclectNumView.setVisibility(View.GONE); deleteButton.setVisibility(View.GONE); selectFileLs.clear(); imgAdapter.clear(); return false; } return super.onKeyDown(keyCode, event); } /** * 异步加载图片展示 * @author: aokunsang * @date: 2012-8-1 */ class AsyncLoadedImage extends AsyncTask<Object, LoadImage, Boolean> { @Override protected Boolean doInBackground(Object... params) { File fileDir = new File(Const.imgPath); File[] files = fileDir.listFiles(); boolean result = false; if(files!=null){ for(File file:files){ String fileName = file.getName(); if (fileName.lastIndexOf(".") > 0 && fileName.substring(fileName.lastIndexOf(".") + 1, fileName.length()).equals("jpg")){ Bitmap bitmap; Bitmap newBitmap; try { BitmapFactory.Options options = new BitmapFactory.Options(); options.inSampleSize = 10; bitmap = BitmapFactory.decodeFile(file.getPath(), options); newBitmap = ThumbnailUtils.extractThumbnail(bitmap, 67, 70); bitmap.recycle(); if (newBitmap != null) { LoadImage loadImage = new LoadImage(file.getPath(),newBitmap); fileNameList.add(loadImage); publishProgress(loadImage); result = true; } } catch (Exception e) { e.printStackTrace(); } } } } return result; } @Override public void onProgressUpdate(LoadImage... value) { for(LoadImage loadImage:value){ imgAdapter.addPhoto(loadImage); } } @Override protected void onPostExecute(Boolean result) { if(!result){ showDialog(1); } } } @Override protected Dialog onCreateDialog(int id) { AlertDialog dialog = new AlertDialog.Builder(PictureScanAct.this).setTitle("温馨提示").setMessage("暂时还没有照片,请先采集照片!") .setPositiveButton("确定", new DialogInterface.OnClickListener(){ @Override public void onClick(DialogInterface dialog, int which) { startActivity(new Intent(PictureScanAct.this,TakePhotoAct.class)); } }).setNegativeButton("取消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { finish(); } }).show(); return dialog; } /** * 图片详细信息bean * @author: aokunsang * @date: 2012-8-31 */ public class LoadImage { private String fileName; private Bitmap bitmap; public LoadImage() { super(); // TODO Auto-generated constructor stub } public LoadImage(String fileName, Bitmap bitmap) { super(); this.fileName = fileName; this.bitmap = bitmap; } /** * @return the fileName */ public String getFileName() { return fileName; } /** * @param fileName the fileName to set */ public void setFileName(String fileName) { this.fileName = fileName; } /** * @return the bitmap */ public Bitmap getBitmap() { return bitmap; } /** * @param bitmap the bitmap to set */ public void setBitmap(Bitmap bitmap) { this.bitmap = bitmap; } @Override public int hashCode() { return this.getFileName().hashCode(); } @Override public boolean equals(Object o) { LoadImage loadImg = (LoadImage)o; return this.getFileName().equals(loadImg.getFileName()); } }
【2】、图片展示布局
<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" > <GridView android:id="@+id/picture_grid" android:layout_width="match_parent" android:layout_height="match_parent" android:numColumns="auto_fit" android:stretchMode="columnWidth" android:columnWidth="70dip" android:gravity="center" /> <TextView android:id="@+id/pic_seclet_num" android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="@drawable/btn" android:textSize="20sp" android:gravity="center" android:visibility="gone" /> <Button android:id="@+id/pic_delete" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/deletecontact" android:layout_gravity="bottom" android:textSize="20sp" android:visibility="gone" style="@style/btn_style" /> </FrameLayout>
【3】、适配器类
/**
* 图片适配器 * @author aokunsang * @Date 2011-12-6 */ public class ImageAdapter extends BaseAdapter { private List<LoadImage> picList = new ArrayList<LoadImage>(); //图片集合 private List<String> picNumber = new ArrayList<String>(); //选中图片的位置集合 private LayoutInflater inflater; public ImageAdapter(Context mContext){ inflater = LayoutInflater.from(mContext); } @Override public int getCount() { return picList.size(); } @Override public Object getItem(int position) { return picList.get(position); } /** * 添加选中状态的图片位置 * @param position */ public void addNumber(String position){ picNumber.add(position); } /** * 去除已选中状态的图片位置 * @param position */ public void delNumber(String position){ picNumber.remove(position); } /** * 清空已选中的图片状态 */ public void clear(){ picNumber.clear(); notifyDataSetChanged(); } /** * 添加图片 * @param bitmap */ public void addPhoto(LoadImage loadImage){ picList.add(loadImage); notifyDataSetChanged(); } /** * 删除图片 * @param loadimgLs */ public void deletePhoto(List<LoadImage> loadimgLs){ for(LoadImage img:loadimgLs){ if(picList.contains(img)){ picList.remove(img); } } picNumber.clear(); notifyDataSetChanged(); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder = null; if(holder==null){ holder = new ViewHolder(); convertView = inflater.inflate(R.layout.picturescan_item, null); holder.image1 = (ImageView)convertView.findViewById(R.id.scan_img); holder.image2 = (ImageView)convertView.findViewById(R.id.scan_select); convertView.setTag(holder); }else{ holder = (ViewHolder)convertView.getTag(); } Drawable bit = new BitmapDrawable(picList.get(position).getBitmap()); holder.image1.setBackgroundDrawable(bit); if(picNumber.contains(""+position)){ //如果该图片在选中状态,使其右上角的小对号图片显示,并且添加边框。 holder.image2.setVisibility(View.VISIBLE); holder.image1.setImageResource(R.drawable.border); }else{ holder.image2.setVisibility(View.GONE); } return convertView; } public static class ViewHolder{ public ImageView image1; //要显示的图片 public ImageView image2; //图片右上角的小对号图片(标示选中状态的玩意) } }
【4】、gridview的item布局
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingTop="3dip" android:paddingRight="3dip" > <ImageView android:id="@+id/scan_img" android:scaleType="centerCrop" android:layout_height="75dip" android:layout_width="90dip" /> <ImageView android:id="@+id/scan_select" android:layout_height="wrap_content" android:layout_width="wrap_content" android:src="@drawable/selected" android:layout_alignRight="@id/scan_img" android:layout_alignParentTop="true" android:padding="4dip" /> </RelativeLayout>
发表评论
-
Android软件的自动更新【升级改革版】
2012-12-19 15:44 141001、之前写过一篇说版本升级的,用到广播。感觉乱用,搞的有 ... -
Android-ExifInterface如何正确存取Double类型坐标
2012-08-10 15:08 48021、向图片中存储一些属性,可以使用ExifInter ... -
Android软件的自动更新
2012-04-16 12:47 13977今天重新写了一篇 ... -
Android拍照,上传,预览综合【修改】
2011-12-07 14:21 32997最近需要做手机 ... -
百度地图的手动定位和自动定位
2011-07-07 18:45 52512最近由于项目需要,研究了下百度地图定位, ... -
android资源文件详细介绍
2011-07-01 13:45 3592摘自:http://blog.csdn.net/sayyanf ... -
谈Activity的生命周期
2011-07-01 13:42 1815摘自:http://blog.csdn.net/wyh0802 ... -
Android开发调试时logcat不显示问题
2011-07-01 13:40 2245摘自:http://dev.10086.cn/cmdn/wik ... -
AndroidManifest.xml详细介绍
2011-07-01 13:30 1837以下摘自网上,只为记录学习。 一、关于Andro ...
相关推荐
本demo实现GridView中item长按拖动删除,完美解决bug,仿支付宝含有动画,又不懂得可以参考我的博客:http://blog.csdn.net/u010151514/article/details/51273485,欢迎留言讨论
GridView是Android开发中常用的一种控件,主要用于展示二维数据列表,通常用于图片、图标或文本的网格布局。在本主题“GridView(长按拖动)”中,我们将深入探讨如何实现GridView的一项高级特性——长按拖动功能,...
在Android开发中,GridView是一种常用的布局控件,它允许我们以网格的形式展示数据。在许多应用中,用户可能需要对GridView中的元素进行交互操作,比如长按拖动和删除。这个例子就是关于如何在Android的GridView中...
Android 可拖拽的GridView效果实现, 长按可拖拽和item实时交换,项目详情http://blog.csdn.net/xiaanming/article/details/17718579
在Android开发中,GridView是一种常见的布局控件,用于展示数据集,通常以网格形式排列。GridView长按删除功能是很多应用中的常见需求,比如在联系人应用或者照片库中,用户可以通过长按某个项目来触发删除操作。在...
在标题和描述中提到的“Gridview 长按可拖动图片功能!可长按删除,交换位置”是一个高级功能,涉及到触摸事件处理、自定义适配器以及动画效果的实现。下面将详细讲解如何在GridView中实现这些特性。 1. **长按事件...
在Android开发中,GridView是一种常用的布局管理器,它允许我们以网格形式展示数据集。"Grideview长按抖动效果"是指在GridView中的某个项目(item)被长按时,模仿iPhone上的删除效果,使该项目产生类似物品抖动的...
在Android开发中,自定义GridView以实现长按拖动排序是一项常见的需求,特别是在构建具有可交互界面的应用中。本文将详细讲解如何实现这样一个功能,同时包括震动提示、固定"更多"项以及保存排序状态到数据库。 ...
在Android开发中,GridView是一种常用的布局控件,它允许我们以网格的形式展示数据。这个“gridview拖拽并且可以删除 带动画效果”的主题,是关于如何在GridView中实现元素的拖放功能以及添加删除操作时的动态视觉...
这种功能通常用于提供用户一种直观的编辑方式,让他们可以通过长按元素并显示删除图标来删除不需要的项目。下面将详细解释如何实现这个功能。 首先,我们需要创建一个GridView。GridView是Android中的一个视图组件...
GridView图片墙,ListView嵌入GridView
在Android开发中,GridView是一种常见的布局管理器,用于展示数据集,通常用于创建网格状的视图。在很多应用中,我们可能需要为GridView的每个条目(Item)添加长按操作来显示额外的功能,例如删除按钮。本教程将...
"GridView长按显示删除按钮"的实现是常见的功能需求,通常用于数据操作如编辑或删除。这个功能增强了用户体验,使得用户可以更加直观地对数据进行交互。 首先,我们需要在GridView的item布局文件中预先设计一个隐藏...
在Android开发中,GridView是一种常见的布局管理器,用于展示数据集,通常以网格形式排列。在许多应用中,用户可能需要对GridView中的元素进行交互,比如拖拽排序。本篇文章将详细讲解如何实现一个功能丰富的...
在实现图片墙时,我们通常会将每个单元格设为一张图片,通过设置GridView的列数和间距,创建出美观的图片展示效果。要实现GridView的高度自适应,我们需要在Adapter中动态计算每个单元格的高度,这通常涉及到图片的...
excel文件图片和gridview图片
### GridView多行编辑(C#) 在本篇技术文章中,我们将深入探讨如何使用ASP.NET中的`GridView`控件实现多行编辑功能。`GridView`是一个非常强大的数据绑定控件,可以方便地显示、编辑和更新数据库中的数据。通过本...
在Android开发中,GridView是一种常用的布局控件,它允许我们以网格的形式展示数据,通常用于显示图片、列表项等。"GridView长按多选"是一个常见的功能需求,它让用户能够通过长按操作来选择多个项目,类似于手机上...