最近很长一段时间没有更新博客了实在是比较忙最近需要使用一个功能:选择本机相册或者拍照返回图片显示到九宫格中,并且可以点击九宫格每一张放大查看,滑动等功能!

在网上也看到一些大神写的演示和第三方库,不过发现很多都不完整,有的只是实现相册选择,没有实现拍照功能;有的实现了相册和拍照功能又没有实现点击放大查看滑动功能;所以我就跟据那些演示完善了一下,实现既能相册选择,拍照选择,点击每张图片又能放大查看现在来看看怎么实现的!

来看看效果图吧!

image.png
image.png
image.png

使用到的依赖库是

compile 'me.iwf.photopicker:PhotoPicker:0.1.8'

来看看首页的布局:activity_main.xml中中

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context="com.an.myphotodemo.MainActivity"><com.an.myphotodemo.NoScrollGridViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_below="@+id/view_gad"android:layout_marginBottom="10dp"android:layout_marginLeft="3dp"android:layout_marginRight="3dp"android:layout_marginTop="3dp"android:numColumns="3"android:scrollbars="none"android:verticalSpacing="3dp"android:id="@+id/recycler_view"/></LinearLayout>
NoScrollGridView是自定义的一个ScrollGridView
public class NoScrollGridView extends GridView {public NoScrollGridView(Context context, AttributeSet attrs) {super(context, attrs);}public NoScrollGridView(Context context) {super(context);}public NoScrollGridView(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);}@Overridepublic void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);super.onMeasure(widthMeasureSpec, expandSpec);}
}

对了,还需要一些工具类,后面再说,现在来看看主要实现的代码!

首页的OnCreate中()中NoScrollGridView初始化并且设置适配器

 @Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);itemLayout = (NoScrollGridView) findViewById(R.id.recycler_view);ninePicturesAdapter = new NinePicturesAdapter(this, 9, new NinePicturesAdapter.OnClickAddListener() {@Overridepublic void onClickAdd(int positin) {choosePhoto();}}, new NinePicturesAdapter.OnItemClickAddListener() {@Overridepublic void onItemClick(int positin) {Log.i(TAG, "-------------onItemClick: "+positin);String[] array = new String[ninePicturesAdapter.getPhotoCount()];// List转换成数组for (int i = 0; i < photossss.size()-1; i++) {array[i] = photossss.get(i);}//数组转换为集合//List<String> stringsss = Arrays.asList(array);Log.i(TAG, "----array:--- "+array.length);imageBrower(positin,array);}});itemLayout.setAdapter(ninePicturesAdapter);}

/ ** 
*开启图片选择器choosePhoto()
* /

    private void choosePhoto() {PhotoPickerIntent intent = new PhotoPickerIntent(MainActivity.this);intent.setPhotoCount(9);intent.setShowCamera(true);startActivityForResult(intent, REQUEST_CODE);//ImageLoaderUtils.display(context,imageView,path);}

/ ** 
*每一张图片放大查看
* @param position 
* @param网址
* /

    private void imageBrower(int position, String[] urls) {Intent intent = new Intent(this, ImagePagerActivity.class);// 图片url,为了演示这里使用常量,一般从数据库中或网络中获取intent.putExtra(ImagePagerActivity.EXTRA_IMAGE_URLS, urls);intent.putExtra(ImagePagerActivity.EXTRA_IMAGE_INDEX, position);startActivity(intent);}

/ ** 
*接受返回的图片数据:onActivityResult()
* @param requestCode 
* @param resultCode 
* @param data 
* /

@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);if (resultCode == RESULT_OK && requestCode == REQUEST_CODE) {if (data != null) {photos = data.getStringArrayListExtra(PhotoPickerActivity.KEY_SELECTED_PHOTOS);for (int i = 0; i < photos.size(); i++) {Log.i(TAG, "----------onActivityResult: "+ photos.get(i));}if(ninePicturesAdapter!=null) {Log.i(TAG, "----------photossss: ========");ninePicturesAdapter.addAll(photos);//获取九宫格显示的所有图片数据photossss = ninePicturesAdapter.getData();Log.i(TAG, "----------photossss: ========"+photossss.size());}}}}

到这里主页代码已经完成了,现在来看看适配器是如何完成的NinePicturesAdapter 
/ **

  • DES:9宫图适配器
  • 由一个创建
  • 于2016.09.16:33 
    * /
public class NinePicturesAdapter extends BaseAblistViewAdapter<String> {private boolean showAdd = true;private int picturnNum = 0;private boolean isDelete = false;//当前是否显示删除按钮private OnClickAddListener onClickAddListener;private OnItemClickAddListener onItemClickListener;private boolean isAdd=true;//当前是否显示添加按钮private static final String TAG = "NinePicturesAdapter";public NinePicturesAdapter(Context context, int picturnNum, OnClickAddListener onClickAddListener,OnItemClickAddListener onItemClickListener) {super(context);this.picturnNum = picturnNum;this.onClickAddListener = onClickAddListener;this.onItemClickListener=onItemClickListener;showAdd();}@Overridepublic View getView(final int position, View convertView, ViewGroup parent) {if (convertView == null) {convertView = LayoutInflater.from(mContext).inflate(R.layout.item_grid_photo, parent, false);}final ImageView imageView = ViewHolderUtil.get(convertView, R.id.img_photo);ImageView imgDelete = ViewHolderUtil.get(convertView, R.id.img_delete);final String url = getData().get(position);//显示图片if (TextUtils.isEmpty(url) && showAdd) {ImageLoaderUtils.display(mContext, imageView, R.drawable.addphoto);imgDelete.setVisibility(View.GONE);} else {imgDelete.setVisibility(View.VISIBLE);ImageLoaderUtils.display(mContext, imageView, url);}autoHideShowAdd();imageView.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {//再次选择图片if (TextUtils.isEmpty(url)) {if (onClickAddListener != null) {onClickAddListener.onClickAdd(position);}} else {//放大查看图片onItemClickListener.onItemClick(position);Log.i(TAG, "onClick: "+position);//BigImagePagerActivity.startImagePagerActivity((Activity) mContext, getData(), position);}}});//删除按钮imgDelete.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {remove(position);if (!isDelete && getCount() < 1) {add("");isDelete = true;}notifyDataSetChanged();}});return convertView;}@Overridepublic void setData(List<String> d) {boolean hasAdd=false;for (int i = 0; i < d.size(); i++) {if(TextUtils.isEmpty(d.get(i))){hasAdd=true;break;}}super.setData(d);if(!hasAdd){showAdd();}}@Overridepublic void addAll(List<String> d) {if(isAdd){HideAdd();}super.addAll(d);showAdd();}/*** 移除add按钮*/public void autoHideShowAdd(){int lastPosition=getData().size()-1;if(lastPosition==picturnNum&&getData().get(lastPosition)!=null&& TextUtils.isEmpty(getData().get(lastPosition))){getData().remove(lastPosition);isAdd=false;notifyDataSetChanged();}else if(!isAdd){showAdd();}}/*** 移除add按钮*/public void HideAdd(){int lastPosition=getData().size()-1;if(getData().get(lastPosition)!=null&& TextUtils.isEmpty(getData().get(lastPosition))){getData().remove(lastPosition);isAdd=false;notifyDataSetChanged();}}/*** 显示add按钮*/public void showAdd(){if(getData().size()<picturnNum){addAt(getData().size(),"");isAdd=true;notifyDataSetChanged();}}/*** 获取图片张数* @return*/public int getPhotoCount(){return isAdd==true?getCount()-1:getCount();}/*** 加号接口*/public interface OnClickAddListener {void onClickAdd(int positin);}public interface OnItemClickAddListener {void onItemClick(int positin);}}

适配器加载的布局如下

<?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:background="@android:color/white"android:layout_centerInParent="true"android:layout_gravity="center"android:gravity="center"android:orientation="vertical"><RelativeLayoutandroid:id="@+id/rr_gad"android:layout_width="wrap_content"android:layout_height="wrap_content"android:padding="5dp"><ImageViewandroid:id="@+id/img_photo"android:layout_width="80dp"android:layout_height="80dp"android:scaleType="centerCrop" /></RelativeLayout><ImageViewandroid:id="@+id/img_delete"android:layout_width="30dp"android:layout_height="30dp"android:layout_alignRight="@+id/rr_gad"android:layout_alignTop="@+id/rr_gad"android:background="@drawable/cha" />
</RelativeLayout>

ImageLoaderUtils是一个图片加载显示的工具类,当然也可以使用其他的

至此:相册选择和拍照功能,显示九宫图皆以实现,现在来看看图片放大查看:布局如下image_detail_pager.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent" ><com.an.myphotodemo.image.HackyViewPagerandroid:id="@+id/pager"android:layout_width="match_parent"android:layout_height="match_parent"/><TextViewandroid:id="@+id/indicator"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_gravity="bottom"android:gravity="center"android:textSize="18sp"android:textColor="@android:color/white"android:text="@string/viewpager_indicator"android:background="@android:color/transparent" /></FrameLayout>

查看图片滑动主业如下:

public class ImagePagerActivity extends FragmentActivity {private static final String STATE_POSITION = "STATE_POSITION";public static final String EXTRA_IMAGE_INDEX = "image_index";public static final String EXTRA_IMAGE_URLS = "image_urls";private HackyViewPager mPager;private int pagerPosition;private TextView indicator;private static final String TAG = "ImagePagerActivity";@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.image_detail_pager);pagerPosition = getIntent().getIntExtra(EXTRA_IMAGE_INDEX, 0);String[] urls = getIntent().getStringArrayExtra(EXTRA_IMAGE_URLS);Log.i(TAG, "length: "+urls.length);mPager = (HackyViewPager) findViewById(R.id.pager);ImagePagerAdapter mAdapter = new ImagePagerAdapter(getSupportFragmentManager(), urls);mPager.setAdapter(mAdapter);indicator = (TextView) findViewById(R.id.indicator);CharSequence text = getString(R.string.viewpager_indicator, 1, mPager.getAdapter().getCount());indicator.setText(text);// 更新下标mPager.setOnPageChangeListener(new OnPageChangeListener() {@Overridepublic void onPageScrollStateChanged(int arg0) {}@Overridepublic void onPageScrolled(int arg0, float arg1, int arg2) {}@Overridepublic void onPageSelected(int arg0) {CharSequence text = getString(R.string.viewpager_indicator,arg0 + 1, mPager.getAdapter().getCount());indicator.setText(text);}});if (savedInstanceState != null) {pagerPosition = savedInstanceState.getInt(STATE_POSITION);}mPager.setCurrentItem(pagerPosition);}@Overridepublic void onSaveInstanceState(Bundle outState) {outState.putInt(STATE_POSITION, mPager.getCurrentItem());}private class ImagePagerAdapter extends FragmentStatePagerAdapter {public String[] fileList;public ImagePagerAdapter(FragmentManager fm, String[] fileList) {super(fm);this.fileList = fileList;}@Overridepublic int getCount() {return fileList == null ? 0 : fileList.length;}@Overridepublic Fragment getItem(int position) {String url = fileList[position];return ImageDetailFragment.newInstance(url);}}
}

这里就结束了,想了解更多的点这里:https:
//github.com/caichengan/MyPhotoDemo

Android的实现既能相册选择,拍照选择,点击每张图片又能放大查看!相关推荐

  1. 微信android手机中点击大图片会自动放大图片

    自己使用的是微信Android客户端,使用img标签的src属性将图片设置好了以后,在微信中调试,点击图片竟然放大,自己没写放大图片的方法,也没有调用wx.previewImage()方法,最后查找, ...

  2. Android实现拍照选择相册图片上传图片(多图片上传)功能

    安卓多图片上传代码 直接上代码 1.主程序入口XML文件 <?xml version="1.0" encoding="utf-8"?> <ma ...

  3. android webview使用html5input id=input type=file/ 上传相册、拍照照片

    本人编程新手,这次做的功能是android webview 嵌入HTML5的页面,页面中有一个<input id="input" type="file"/ ...

  4. Android 使用腾讯X5 Webview浏览器拍照或从相册上传图片

    最近在项目开发中,需要使用WebView上传文件.默认情况下情况下,使用Android的WebView是不能够支持上传文件的. 经过查找资料,得知需要重新WebChromeClient,根据选择到的文 ...

  5. Android开发 调用系统相机相册图片功能,解决小米手机拍照或者图片横竖相反问题,及小米手机相册图片路径问题

    Android开发 调用系统相机相册图片功能,解决小米手机拍照或者图片横竖相反问题,及小米手机相册图片路径问题 1.调用相机,兼容7.0 AndroidManifest配置 <providera ...

  6. android 拍照头像,Android 拍照/选择照片并剪切成头像

    头像裁剪上传功能在现在的App中基本都要用到,今天总结了一下,用比较简单实用的方式(调用系统API)来实现需求.这样做简单,但是不同的手机和系统上裁剪和选择图片的方式有一些区别. 首先来看一下效果图 ...

  7. Android打开相册vs拍照获取图片的原理实现

    前言:这几天在做用户登陆注册的逻辑时,遇到了要修改用户的头像问题的解决.在此把实现的原理以及实现过程中遇到的问题分享个大家...留下些许脚印 在手机的app里我们常常可用看到在个人中心页面有修改头像的 ...

  8. html5 android 拍照上传,android webview使用html5 上传相册、拍照照片

    本人编程新手,这次做的功能是android webview 嵌入HTML5的页面,页面中有一个标签,iOS直接就支持,但android中不支持,网上的帖子说是因为android屏蔽了文件上传功能还是怎 ...

  9. android完美实现 拍照 选择图片 剪裁等代码分享

    2个安卓实现实现 拍照 选择图片 剪裁等的代码,都是从正式项目中提取出来了,非常实用,有需要的小伙伴可以参考下. 前言,版本兼容问题主要是由于4.4以前和4.4以后的Uri的格式不同所造成的错误 1. ...

最新文章

  1. VS Code 离线安装插件方法
  2. 最近...(2019-03-18~2019-04-03)
  3. Fedora13安装Gnome-shell
  4. 更新卡住解决_windows10系统更新卡住的解决方法
  5. [MATLAB学习笔记]clf清空图窗1013(1)
  6. 程序如何区分该显示中文字符或英语字符?
  7. android重启时间变成1970,Android时间戳转字符串的1970问题
  8. 计算机系答辩麻烦,计算机专业的你,答辩时有多卑微?
  9. 在 PHP 中使用命令行工具
  10. Tiny210 编译Linux3.0.8
  11. Linux 多线程 - 线程异步与同步机制
  12. activiti并行网关
  13. ​【安全篇 / Web过滤】(5.6) ❀ 01. DNS 过滤僵尸网络 ❀ FortiGate 防火墙
  14. 生猪价格matlab,2447教务处.doc
  15. 从CNTV下载《小小智慧树》
  16. 2020年python考试时间_想准备2021年三月份的Python考试,应该怎么准备呢?
  17. ❤️❤️❤️Unity实现毛笔书法
  18. 15、Java基础---继承和访问属性
  19. 基于java后台微信图书商城小程序系统 开题报告
  20. 零知开发板和红外人体感应模块使用

热门文章

  1. 日语二级语法汇总(part7/16)
  2. MySQL远程连接提示Accesss denied for user 'root'@'此处为你自己的ip'(using password:YES)
  3. matlab 图像退化,基于matlab的退化图像复原(一)------图像退化处理
  4. 论文解读:SpellBERT:A Lightweight Pretrained Model for Chinese Spelling Checking
  5. 解读乐鑫 AT 指令解析器,解锁你不知道的用法
  6. axios是干什么的
  7. Java 判断一个点是否在一个三角形内
  8. 博弈五子棋(人机对战)算法改进
  9. MATALB学习五:矩阵的乘方
  10. mysql企业备份工具(MEB)之mysqlbackup安装及使用