添加依赖:

   compile 'me.iwf.photopicker:PhotoPicker:0.1.8'
compile 'com.jaeger.ninegridimageview:library:1.0.1'
compile 'com.youth.banner:banner:1.4.10'
public class MainActivity extends AppCompatActivity {
int REQUEST_CODE = 0;
private NineGridImageView ngiv;
private ArrayList<String> photos;
private Dialog dialog;
private cn.com.jwtimes.www.jwtimes.mAdapter mAdapter1; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView tv = findViewById(R.id.tv);
ngiv = findViewById(R.id.ngiv);
tv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
PhotoPickerIntent intent = new PhotoPickerIntent(MainActivity.this);
intent.setPhotoCount(9);
intent.setShowCamera(true);
startActivityForResult(intent, REQUEST_CODE);
}
});
} @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);
ngiv.setAdapter(mAdapter);
ngiv.setImagesData(photos);
}
}
} private NineGridImageViewAdapter<String> mAdapter = new NineGridImageViewAdapter<String>() {
@Override
protected void onDisplayImage(Context context, ImageView imageView, final String url) {
Glide.with(context)
.load(url)
.into(imageView);
} @Override
protected ImageView generateImageView(Context context) {
return super.generateImageView(context);
} @Override
protected void onItemImageClick(Context context, int index, List<String> photoList) {
showBigPicture(context, photos, index);
}
}; private void showBigPicture(Context context, final ArrayList<String> photos, final int index) {
dialog = new Dialog(context, R.style.MyDialog);
View contentView = View.inflate(context, R.layout.dialog_tip, null);
final ViewPager vp = (ViewPager) contentView.findViewById(R.id.vp);
ImageView ivDelete = (ImageView) contentView.findViewById(R.id.ivDelete);
mAdapter1 = new mAdapter(this, photos, dialog);
vp.setAdapter(mAdapter1);
vp.setCurrentItem(index);
ivDelete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int currentItem = vp.getCurrentItem();
Iterator<String> sListIterator = photos.iterator();
while (sListIterator.hasNext()) {
String e = sListIterator.next();
if (e.equals(photos.get(currentItem))) {
sListIterator.remove();
mAdapter1.notifyDataSetChanged();
break;
}
}
}
});
dialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialog) {
ngiv.setAdapter(MainActivity.this.mAdapter);
ngiv.setImagesData(photos);
}
});
dialog.setContentView(contentView);
dialog.setCancelable(true);
dialog.getWindow().setLayout(
getScreenWidth(),
getScreenHeight());
dialog.show();
}
public int getScreenWidth() {
Resources resources = getResources();
return resources.getDisplayMetrics().widthPixels;
}
public int getScreenHeight() {
Resources resources = getResources();
return resources.getDisplayMetrics().heightPixels;
} }
public class mAdapter extends PagerAdapter {
private ArrayList<String> photos;
private Context context;
private Dialog dialog; public mAdapter(Context context, ArrayList<String> photos, Dialog dialog) {
this.photos = photos;
this.context = context;
this.dialog=dialog;
} @Override
public int getCount() {
return photos.size();
} @Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
} @Override
public View instantiateItem(ViewGroup container, int position) { ImageView iv = new ImageView(context);
Glide.with(context).load(photos.get(position)).into(iv);
iv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dialog.dismiss();
}
});
container.addView(iv);
return iv; } @Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView((View) object);
}
}
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 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"
tools:context="cn.com.jwtimes.www.jwtimes.MainActivity">
<TextView
android:id="@+id/tv"
android:layout_width="match_parent"
android:text="选择照片"
android:layout_height="wrap_content" />
<com.jaeger.ninegridimageview.NineGridImageView
android:id="@+id/ngiv"
android:layout_width="match_parent"
android:layout_height="150dp"
android:layout_margin="10dp"
app:imgGap="4dp"
app:showStyle="fill"
app:singleImgSize="120dp" /> </android.support.constraint.ConstraintLayout>

dialog_top.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"
android:background="@color/black_40"> <android.support.v4.view.ViewPager
android:id="@+id/vp"
android:layout_width="match_parent"
android:layout_height="match_parent" /> <ImageView
android:id="@+id/ivDelete"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="right"
android:src="@drawable/delete" /> <TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:layout_margin="10dp"
android:gravity="right"
android:text="1/9"
android:textColor="@color/colorAccent" />
</FrameLayout>
<resources>

    <!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
<style name="MyDialog" parent="@android:style/Theme.Dialog">
<item name="android:windowFrame">@null</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowIsTranslucent">false</item>
<item name="android:windowBackground">@color/black_40</item>
<item name="android:windowIsFloating">true</item>
<item name="android:windowContentOverlay">@null</item>
</style>
</resources>

效果:

Android 打开相册拍照选择多张图片显示的更多相关文章

  1. android: 从相册中选择照片

    虽然调用摄像头拍照既方便又快捷,但并不是每一次我们都需要去当场拍一张照片的. 因为每个人的手机相册里应该都会存有许许多多张照片,直接从相册里选取一张现有的照 片会比打开相机拍一张照片更加常用.一个优秀 ...

  2. Android调用相册拍照控件实现系统控件缩放切割图片

    android 下如果做处理图片的软件 可以调用系统的控件 实现缩放切割图片 非常好的效果 今天写了一个demo分享给大家 package cn.m15.test; import java.io.By ...

  3. Android 调用相册 拍照 实现系统控件缩放 切割图片

    android 下如果做处理图片的软件 可以调用系统的控件 实现缩放切割图片 非常好的效果 今天写了一个demo分享给大家. package cn.m15.test; import java.io.B ...

  4. 解决Android调用相机拍照,要报“打开相机失败”查看debug日志显示“setParameters failed”的问题

    使用CameraLibrary项目,在部分手机或平板上不能正常使用,要报“打开相机失败”查看debug日志显示“setParameters failed”. 找到CameraView.java中的se ...

  5. android ——调用摄像头拍照和相册

    先在布局文件中加入两个按钮和一个图片控件 <?xml version="1.0" encoding="utf-8"?> <LinearLayo ...

  6. Android打开相机和打开相册

    打开相机 /** * 选择相机 */ private void showCamera() { // 跳转到系统照相机 Intent cameraIntent = new Intent(MediaSto ...

  7. android拍照选择图片上传服务器自定义控件

    做android项目的时候总免不了遇到图片上传功能,虽然就是调用android系统的拍照和相册选择功能,但是总面部了把一大推代码写在activity里,看上去一大推代码头都昏了.不如把这些功能都集成一 ...

  8. 利用WebUploader进行图片批量上传,在页面显示后选择多张图片压缩至指定路径【java】

    WebUploader是由Baidu WebFE(FEX)团队开发的一个简单的以HTML5为主,FLASH为辅的现代文件上传组件.在现代的浏览器里面能充分发挥HTML5的优势,同时又不摒弃主流IE浏览 ...

  9. Android开发在Activity外申请权限调用相机打开相册

    问题描述: 最近在项目中遇到一个需要调用相册和打开相机的需求,但是,在Android 6.0以后,调用相册属于危险权限,需要开发者动态获取,这就意味着我们申请权限是与Activity绑定的,但如果一个 ...

随机推荐

  1. C++ --- 编码习惯小区别

    定义一个变量,最好养成C代码的习惯 C代码: 用到的变量X,要在最开始定义:先定义,用的时候在初始化: [例如] int x; //先定义 ..... ..... ; //再初始化 C++代码: 用到 ...

  2. LeetCode - 86、分隔链表

    给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前. 你应当保留两个分区中每个节点的初始相对位置. 示例: 输入: head = 1->4-&g ...

  3. P1341 无序字母对[欧拉路]

    题目描述 给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒).请构造一个有n+1个字母的字符串使得每个字母对都在这个字符串中出现. 解析 毒瘤字符串读入 我就是不喜欢邻接 ...

  4. java(Hello World) 常量 变量和注意事项

    一.java的入门程序 java语言的简单介绍 关于java语言的特点:(1) 简单性和c++相比,java没有头文件.指针.运算符重载等,java语言相当于是一个比较纯净版的c++.(2) 面对对象 ...

  5. 忘记 MySQL 的 root 帐号密码该怎么办

    如果你忘了 MySQL 的 root 帐号密码,别担心,使用下面步骤就可以重设一个新密码: 首先停止 MySQL 服务 “/etc/init.d/mysql stop” 启动 MySQL 服务并屏蔽用 ...

  6. C++创建对象的3种方式(转载)

    #include <iostream> using namespace std; class A { private: int n; public: A(int m):n(m) { } ~ ...

  7. Go语言 - 流程控制 if else | for | switch case

    流程控制 流程控制是每种编程语言控制逻辑走向和执行次序的重要部分,流程控制可以说是一门语言的“经脉”. Go语言中最常用的流程控制: if | for | switch | goto// switch ...

  8. [Flutter] Custom a Slider with SliderTheme

    SliderTheme( data: SliderTheme.of(context).copyWith( activeTrackColor: Colors.white, inactiveTrackCo ...

  9. DBUtils框架ResultSetHandler接口学习

    今儿在学习spring框架的时候,让我想起来之前做项目时一直搁置的一个问题,就是DBUtils框架的做数据库操作的使用,当时制作项目的时候就是通过实例打了一遍,由于时间原因也并没有仔细去了解这一方面. ...

  10. 从0到N建立高性价比的大数据平台(转载)

    2016-07-29 14:13:23 钱曙光 阅读数 794 原文链接:https://blog.csdn.net/qiansg123/article/details/80124521 声明:本文为 ...